我正在尝试使用 TarsosDSP 库(以及最小化 Android 库,但此处不包含相关代码)从 android 立体声音频(使用 AudioRecord 录制)中过滤特定频率。
有 2 个问题我想提出建议。
- 当我仅对来自麦克风的浮动缓冲区数据应用带通滤波器时,输出仅包含 2 个不需要的频率,而不是带通中指定的频率。例如,当带通的中心频率为 12000Hz,带宽为 20Hz 时,输出包含以 5000Hz 和 16000Hz 为中心的频率。不存在其他频率。关于这里发生的事情有什么想法吗?
- 当我应用 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);
我希望只看到指定的带通频率,但它显示了 2 个完全不需要的频率。知道这里发生了什么吗?
PS - 我是信号处理的新手。