3

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

有 2 个问题我想提出建议。

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

下面是这两个问题的代码。

    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);
      
      

上述带通滤波器的输出如下所示。图像的下半部分是来自 Praat tool for windows 的频谱图。 它主要显示两个频率。 第一个以〜5000Hz为中心,第二个以16000Hz为中心

我希望只看到指定的带通频率,但它显示了 2 个完全不需要的频率。知道这里发生了什么吗?

PS - 我是信号处理的新手。

4

0 回答 0