2

所以基本上,我的问题是我有一个 .wav 格式的语音信号,它被某个频率的谐波噪声源破坏。我的目标是确定这种噪声发生的频率,并使用陷波滤波器去除所述噪声。到目前为止,我已经使用以下命令将语音信号读入 matlab:

[data, Fs] = wavread('signal.wav');

我的问题是如何确定谐波噪声发生的频率,一旦我做到了,我该如何在该频率下实现陷波滤波器?

注意:由于我当前使用的 MATLAB 版本(2010),我无法访问 iirnotch() 命令或 fdesign.notch()。

4

2 回答 2

2

一般程序是分析频谱,识别有问题的频率,然后围绕该频率设计一个滤波器。对于大多数实际应用来说,这有点模糊:频率会四处移动,并且没有简单的方法可以将噪声与信号区分开来,因此您必须使用巧妙的技术和一些猜测。但是,如果您知道您有单调损坏,那么,是的,FFT 和陷波滤波器可能会解决问题。

您可以使用 来分析信号fft并设计滤波器,fir1我相信这是信号处理工具箱的一部分。如果您没有信号处理工具箱,您可以“手动”完成,如转换到频域,删除您不想要的频率(通过将频率向量的相关元素归零)和转换回时域。这里有一个关于这个的教程。

fft和函数有很好的fir1文档记录:搜索 Mathworks 站点以获取代码示例以帮助您启动和运行。

于 2012-11-13T08:40:41.830 回答
1

要添加/修改 xenoclast 的答案,频域中的过滤可能对您有用,也可能对您不起作用。频域滤波有很多棘手的问题,这里介绍了其中的一些:http: //blog.bjornroche.com/2012/08/why-eq-is-done-in-time-domain.html

另一个问题是,如果您尝试一次处理整个文件,过滤器的“宽度”或 Q 将取决于文件的长度。这可能对您有用,也可能不会。如果您有许多不同长度的文件,请不要期望以这种方式获得类似的结果。

要设计您自己的 IIR 陷波滤波器,您可以使用RBJ 音频滤波器说明书。如果您需要帮助,我在这里写了一个教程:

http://blog.bjornroche.com/2012/08/basic-audio-eqs.html

我的教程使用钟形/峰值滤波器,但很容易遵循它,然后用 RBJ 的陷波滤波器替换它。

最后一点:假设这实际上是您的 .wav 文件中的音频信号,您也可以用耳朵查找并修复问题频率:

  • 在音频编辑程序中打开该文件,该程序可让您实时调整过滤器设置(我不确定 Audacity 是否允许您这样做,但可能)。
  • 使用设置为高增益的“增强”或“参数”滤波器并扫描频率设置,直到您听到最突出的噪声。
  • 用相同频率的陷波滤波器代替升压滤波器。您可能需要调整宽度以权衡噪声消除与信号保留。
  • 根据需要重复(由于许多谐波)。
  • 保存生成的文件。

当然,一些音频编辑应用程序具有内置的谐波降噪功能,特别适用于 50/60 Hz 噪声。

于 2012-11-13T16:01:40.200 回答