所以基本上,我的问题是我有一个.wav格式的语音信号,它被一些频率的谐波噪声源破坏了。我的目标是确定发生噪声的频率,并使用陷波滤波器去除所述噪声。到目前为止,我已经使用以下方法将语音信号读入matlab:
[data, Fs] = wavread('signal.wav');
我的问题是如何识别谐波噪声发生的频率,一旦我完成了这个,我该如何在该频率下实现陷波滤波器?
注意:由于我目前正在使用的MATLAB版本(2010),我无法访问iirnotch()命令或fdesign.notch()。
答案 0 :(得分:2)
一般程序是分析频谱,确定相关频率,然后围绕该频率设计滤波器。对于大多数实际应用来说,它们都有点毛茸茸:频率四处移动并且没有简单的方法来区分噪声和信号,因此您必须使用巧妙的技术和一些猜测。但是,如果你知道你有一个单调的腐败,那么,是的,FFT和陷波滤波器可能会成功。
您可以使用fft
分析信号并设计一个过滤器,其中包括fir1
,我相信它是信号处理工具箱的一部分。如果您没有信号处理工具箱,您可以“手动”执行此操作,如转换到频域,删除您不想要的频率(通过将频率向量的相关元素归零)和转变回时域。有一个关于here的教程。
fft
和fir1
函数已有详细记录:搜索Mathworks网站以获取代码示例以帮助您启动和运行。
答案 1 :(得分:1)
要添加/修改xenoclast的答案,在频域中过滤可能适用于您,也可能不适用。在频域中进行过滤有许多棘手的问题,其中一些内容在此处介绍:http://blog.bjornroche.com/2012/08/why-eq-is-done-in-time-domain.html
另外一个问题是,如果您尝试一次处理整个文件,那么"宽度"过滤器的Q或Q将取决于文件的长度。这可能对你有用,或者可能没有。如果您有许多不同长度的文件,请不要以这种方式获得类似的结果。
要设计自己的IIR陷波滤波器,可以使用RBJ audio filter cookbook。如果您需要帮助,我在这里写了一个教程:
http://blog.bjornroche.com/2012/08/basic-audio-eqs.html
我的教程使用了钟形/峰值滤波器,但它很容易理解,然后用RBJ的陷波滤波器替换它。
最后一点注意:假设这实际上是.wav文件中的音频信号,您还可以用耳朵找到并修复问题频率:
当然,一些音频编辑应用程序具有内置的谐波降噪功能,特别适用于50/60 Hz噪音。