本文我们学习低通滤波器的设计。
1、问题描述
现在考虑我们有信号
为矩形脉冲,波形如下
的傅立叶变换为
,其幅频特性如下图所示。
显然,其带宽是无穷大,第一过零点带宽为10Hz。现在我们想要设计一个低通滤波器,截止频率为10Hz。看看上面的矩形脉冲信号通过这样的滤波器之后,波形和频谱会有什么样的变化。设滤波器输出信号为
,系统模型如下图(a)所示。
我们希望设计的滤波器,应该是理想低通滤波器,其频率传递函数
,这里的滤波器上截止频率为
Hz,如下图(b)所示。
2、用窗函数法生成FIR滤波器
首先我们考虑用窗函数法实现上述低通滤波器。由于冲激响应为
,我们对其进行抽样,得到的离散序列为
简写为
这个滤波器是不可实现的,因为它的冲激响应长度
是无限的,并且是非因果的。为了产生一个有限长度的冲激响应,就需要用窗口对其进行截断。通过截断处理并保留脉冲响应的中心部分,就可以得到线性相位FIR滤波器。若滤波器上截止频率为
,系统抽样间隔为
,冲激响应的长度
=51,这里
也成为FIR滤波器抽头系数的个数,则得到的FIR滤波器的冲激响应序列为
h =2*f_H*sinc(2*f_H*(-25:25)*T_sample);
这里采用的窗口是简单的矩形窗。下面的命令可以显示滤波器的频率响应
fvtool(h,1)
可以看到冲激响应如下图所示。在第
个采样点上的幅度大小就是FIR滤波器的抽头系数
,这里
。注意由于为物理可实现滤波器,因此
对应的是中心点,即(1)中
的点。
下图为上述FIR滤波器的幅频特性,注意纵坐标为分贝值,横坐标为归一化频率(即真实频率除以抽样频率)。
我们发现,由于对理想滤波器进行了截断处理,因此得到的滤波器就不再是理想滤波器了。首先从通带到阻带的不是陡峭的,且阻带里的幅度也不为零,存在纹波。事实上,如果我们增大抽头系数个数
,传输特性会有所改善。下面两张图分别为
和
时的幅频特性,显然通带变得更加平坦,阻带电平也更小。
2、用fdatool设计滤波器并保存抽头系数
实际在仿真过程中,我们利用MATLAB中的滤波器设计插件fdatool,可以很方便地在可视化界面中设计滤波器参数,然后导出参数。
- 在MATLAB命令行窗口中,输入fdatoo命令,就可以打开滤波器设计界面,如下图所示。
- 参数设计:如果采样速率为100Hz,从通带到阻带的过渡带为[8Hz,10Hz],低通滤波器,等纹波FIR。设置完成后,点下方的“Design Filter”按钮,就可以设计出滤波器来。可以在左上方“Current Filter Information"窗口中看到,设计出的滤波器阶数(即抽头数
)为63。正上方“Magnitude Response(dB)”窗口中为滤波器的幅频特性,横坐标最大值为
。
可以看到由于选择了“等纹波”类型,上图中阻带内的纹波是相同的。如果改成"Window"类型,频率传递函数如下图所示,此时纹波不在相等。
在fdatool界面中,菜单栏下有一排按钮,选择其中的冲激响应按钮,可以看到滤波器的冲激响应,如下图所示。显然,每个原点的幅值就是滤波器的抽头系数,两个点之间的横坐标差值就是采样间隔
。
若点击“Filter Coefficients”按钮,可以看到滤波器的抽头系数。若
,可以看到"Filter Coefficients"窗口显示的63个抽头系数。
3. 输出抽头系数:我们需要把设计好的滤波器抽头系数保存下来。尽管有几种不同的方式,我们这里主要介绍如何保存在内存中供MATLAB的程序调用。首先在fdatool界面下点击菜单"File–>Export…",就会弹出下图中右边的"Export"界面。在界面中选择"Workspace"和“Num”,滤波器系数就输出到MATLAB工作空间中的“Num”向量中。回到MATLAB主菜单,可以在工作区中看到"Num"向量,这样就可以直接进行调用了。如下图所示。
4. 信号通过滤波器:我们采用卷积函数conv进行运算。得到波形如下图所示,显然输出波形与输入波形相比,有时延。请思考时延大小取决于什么?
滤波器输出频谱如下图所示。其中红颜色图形为输出信号频谱。经过滤波后,频率大于10Hz的成分被滤除掉了。