数字滤波器

所谓滤波,就是指对于信号的某些频率部分进行过滤、屏蔽。常用的有四种:带通(bandpass),带阻(bandstop),高通(highpass),低通(lowpass)。比较复杂的滤波器一般可以由这四种组合而成。

滤波器的一个最简单的应用是降噪。比如我们所采集到的的信号由于电路内部问题,包含了50Hz的市电信号(很常见的一种问题,比如用录音设备录制一段声音并且fft后,频谱上可以看到明显的50窄峰)。这时如果我们用带阻去掉50Hz左右的频率部分,那么再给出的信号将是无噪的。

数字滤波器是相对模拟滤波器而言的,相比采用晶体管等电子器件来设计电路的模拟滤波器,数字滤波器则是利用编程的手段来达到滤波的目的,其程式也是比较复杂的。不过利用matlab的相关函数,我们就可以大大降低滤波器的设计难度。

滤波器的转移函数形式为:H(nu)={b_{1}+b_{2}nu+b_{3}nu^2+...}/{a_{1}+a_{2}nu+a_{3}nu^2+...} 上式中,系数a_{i}b_{j}取决于滤波器的滤波范围。理想的滤波器其中的多项式是无限阶的,实际使用中显然只能取有限阶的情况。设计数字滤波器的阶(order)时,既要考虑到精度,又要顾及到计算速度,阶过高的话计算将耗费大量的时间。而且阶数高并不代表精度一定比较高。在matlab中,有filter design toolbox,可以利用其图形界面,预览滤波器的效果,调整阶数、频带等等。对于初学者,使用该图形界面可以快速了解各项参数对滤波器的影响。

练习:建立一个10Hz频率的正弦函数数组(8192个),再用rand指令建立一 8192个元素的数组作为白噪声(white noise),两者相加后,观察频谱,再利用filter design toolbox将噪声滤去。(“fdatool”)注意选择不同的design method,如切比雪夫(chebyshev)I型、II型,观察不同的design method的影响。(如果要进一步了解不同算法的影响,建议参看数字信号处理方面的书籍)

在熟悉了各种滤波器后,我们也可以直接用指令设计滤波器,这在编程方面是十分有用的。如指令:“butter(阶,[低频截止 高频截止])”,就可以给出一个以 Butterworth IIR 为算法的带通滤波器。其输出的数组就是系数a_{i}b_{j}。再比如我们想设计一个低通滤波器,截至频率40Hz,那么可以用指令d=fdesign.lowpass(40);b=butter(d),就会得到一个以40Hz为截频的滤波器,并且会自动作出滤波器示意图。

最后要说明的是,尽管理想的滤波器可以实现:在通带中信号不变而禁止的频段里信号为零。但前面已经说过,理想滤波器不具实用性。实际中的数字滤波器,由于阶数是有限的,因此频域的转移函数总是连续变化的——随着频率从0到1渐变,这导致不能实现理想的4种基本滤波器。总会有些部分率不“干净”。想要让过渡区越窄,阶数就必然要很高(注意,逆命题是不成立的),但同时曲线的振荡也会加剧,如何合理取舍,是比较关键的。

信号处理工具箱

在matlab中,有专门的信号处理工具箱:signal processing toolbox 。可以像其他工具箱一样在start中打开,也可以使用命令“sptool”。 在信号处理工具箱中,主要分三部分:信号导入、滤波处理、谱分析。 信号导入部分中,我们可以选择工作空间内的变量作为信号导入,并且在整个信号中截取一段来分析。更重要的是,sp工具箱还可以按声学规律将这段信号“读”出来。因此,在处理声音信号的时候,我们就可以将原信号换到频域,然后滤波,再听听看处理后的信号的发音如何,并可以籍此作一些进一步的分析判断。

下面这段DEMO中,我们将一段事先录制的音频文件导入sptool后经过滤波,去掉高频部分,再听听看效果如何? wave.rar

  • exp/数字滤波器.txt
  • 最后更改: 2007/08/14 22:20
  • (外部编辑)