适用于Android音频的BandPass过滤器会产生意外结果

时间:2017-03-24 09:21:29

标签: android audio tarsosdsp bandpass-filter

我正在尝试使用TarsosDSP库(以及最小的Android库来过滤Android立体声音频(使用AudioRecord录制)中的特定频率,但此处不包含此代码)。

我想要建议有两个问题。

  1. 当我仅对来自麦克风的浮动缓冲区数据应用带通滤波器时,输出仅包含2个不需要的频率,而不包含带通中指定的频率。例如,当带通的中心频率为12000Hz且带宽为20Hz时,则输出包含以5000Hz和16000Hz为中心的频率。没有其他频率存在。关于这里发生了什么的任何想法?
  2. 当我从TarsosDSP库应用低通或高通滤波器时,输出数据根本不会被过滤。看起来过滤器根本不起作用。
  3. 以下是两个问题的代码。

        float bandPassCentreFreq = 10000, 
              bandPassWidth = 20;
    
        BandPass bandPass=new BandPass(bandPassCentreFreq, bandPassWidth, (float) RECORDER_SAMPLERATE);
        TarsosDSPAudioFormat audioFormat = new TarsosDSPAudioFormat((float)RECORDER_SAMPLERATE,16,2,true,false);
        AudioEvent audioEvent = new AudioEvent(audioFormat);
    
    
        //readings shorts data and splitting to 2 channels from the mic of the smartphone (I am using a stereo recording)
        
        recorder.read(sData, 0, BufferElements2Rec);
        for (int i = 0; i < BufferElements2Rec; i++) {
            if (i % 2 == 0)
                camcorderData[i / 2] = sData[i];
            else
                micData[(i - 1) / 2] = sData[i];
          }
          
          //apply the bandpass filter to the recorded data
          float[] camFloat = Utils.short2Float(camcorderData);
          float[] micFloat = Utils.short2Float(micData);
          //Apply filter to first channel data
          audioEvent.setFloatBuffer(camFloat);
          bandPass.process(audioEvent);
          camFloat=audioEvent.getFloatBuffer();
    
          //Apply filter to second channel data
          audioEvent.setFloatBuffer(micFloat);
          bandPass.process(audioEvent);
          micFloat=audioEvent.getFloatBuffer();
          
          //convert data back to the shorts form
          camcorderData = Utils.float2Short(camFloat);
          micData = Utils.float2Short(micFloat);
          
          

    上述带通滤波器的输出如下所示:The lower half of the image is a spectrogram from Praat tool for windows. It shows mainly two frequencies. The first one is centered at ~5000Hz and the second one 16000Hz

    我希望只能看到指定的带通频率,但它会显示2个完全不需要的频率。关于这里发生了什么的任何想法?

    P.S。 - 我是Signal Processing公司的新手。

0 个答案:

没有答案