首页 » 技术分享 » 音频噪声抑制(1):经典滤波器篇

音频噪声抑制(1):经典滤波器篇

 

好久没有写音频信号处理的文章了……

因为我从零开始学C++去了……

前面有一些文章简要介绍了IIR和FIR滤波器的设计方法。

Review:IIR

Review:FIR

滤波器是一种工具,可以完成许多事情。

用滤波器去除噪声,是很常见的。

用经典滤波器抑制噪声,非常简单。如果噪声的功率谱PSD和有用信号功率谱PSD没有重叠的话,那可以实现非常好的效果。

但是,如果有重叠,去噪的效果就不是特别理想了。因为在复指数信号空间里面,没办法把有用信号和噪声信号分离啊。

当然,如果先知道噪声本身的性质,是可以帮助我们实现噪声抑制的。

如果,噪声是覆盖整个频率范围的白噪声,那去除噪声的步骤大致如下。

1. 需要了解有用信号大致是分布在 多少 Hz  到 多少 Hz之间。

2. 设计滤波器,指标就选尽可能多得抑制带外噪声的那些指标。

3. 让信号通过滤波器,实现噪声抑制。

如果,噪声是某个特定频率的噪声,比如 50Hz 的工频信号(50Hz交流电),

就需要设计一个陷波器。

虽然看起来,用陷波器去掉50 Hz的工频信号效果比较好,但是!但是!但是!

实际上,交流电不一定是刚好50 Hz的嘛,可能是51,52,甚至53,……

所以,实际上,还应该结合一些别的手段,去追踪一下工频信号的频率。

另外,由于有非线性效应,所以,不一定只有基波,还有可能有二次谐波,三次谐波,……

为什么会这样?微积分里面Taylor级数嘛…。我想,进一步的原理在“电路原理”、“模拟电子技术基础”等课程里都讲过。

引用某位老师的话:“哎,跟一群数学不好的、靠经验搞工程的人交流起来,真的是费劲!”

我很欣赏这句话。尽管很多人觉得这句话说得有点骄傲了。但是别人有水平,有水平的人不骄傲,难道还要一群渣渣去骄傲?

需要注意的是:

1. 在matlab里,如果设计IIR滤波器去抑制噪声,用filter函数就好。函数的输出信号y和输入信号x的长度是一样的。y就是去除噪声后的信号。

2. 在matlab里,如果设计FIR滤波器去抑制噪声,一般是得到一个单位脉冲响应h,于是用 y = conv(h,x) 就好。但是y的长度和x的长度不一致。这是由卷积的性质决定的。

L = M + N - 1。因为是FIR,所以y基本上就是x的时延,所以把y从 n0 时刻开始,往后走(x长度-1)个点,就是消除噪声后的信号。至于n0等于多少,这个去算一下就好了。

大概是 (N-1) / 2 个时刻吧。这个自己动笔算一下,算一下。 当然,N取奇数还是偶数,要看实际的需求。有些滤波器的长度N是不能满足某种特定的功能的。比如 z = 1的地方有零点(相当于 H(exp(j0)) = 0),是不能作为低通滤波器的。

转载自原文链接, 如需删除请联系管理员。

原文链接:音频噪声抑制(1):经典滤波器篇,转载请注明来源!

0