现代通信原理A.2:FIR低通滤波器设计

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/tanghonghanhaoli/article/details/100533581

  本文我们学习低通滤波器的设计。

1、问题描述

  现在考虑我们有信号 m ( t ) = R e c t ( t τ / 2 τ ) m(t)={\rm Rect}(\frac{t-{\tau}/{2}}{\tau}) 为矩形脉冲,波形如下
在这里插入图片描述
m ( t ) m(t) 的傅立叶变换为 M ( f ) = τ S a ( π f τ ) e j π f τ M(f)=\tau{\rm Sa}(\pi f \tau)e^{-j\pi f\tau} ,其幅频特性如下图所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190904084430919.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rhbmdob25naGFuaGFvbGk=,size_16,color_FFFFFF,t_7
显然,其带宽是无穷大,第一过零点带宽为10Hz。现在我们想要设计一个低通滤波器,截止频率为10Hz。看看上面的矩形脉冲信号通过这样的滤波器之后,波形和频谱会有什么样的变化。设滤波器输出信号为 s ( t ) s(t) ,系统模型如下图(a)所示。
我们希望设计的滤波器,应该是理想低通滤波器,其频率传递函数 H ( f ) = R e c t ( f 2 f H ) H(f)={\rm Rect}\Large( \frac{f}{2f_H}\Large) ,这里的滤波器上截止频率为 f H = 10 f_H=10 Hz,如下图(b)所示。
在这里插入图片描述

2、用窗函数法生成FIR滤波器

首先我们考虑用窗函数法实现上述低通滤波器。由于冲激响应为 h ( t ) = 2 f H S a ( 2 π f H t ) h(t)=2f_H{\rm Sa}(2\pi f_Ht) ,我们对其进行抽样,得到的离散序列为
h ( n T s a m p l e ) = 2 f H S a ( 2 π f H n T s a m p l e ) , h(nT_{\rm sample})=2f_H{\rm Sa}(2\pi f_H\cdot nT_{\rm sample}), 简写为
(1) h ( n ) = 2 f H S a ( 2 π f H n ) . \tag{1} h(n)=2f_H{\rm Sa}(2\pi f_H\cdot n). 这个滤波器是不可实现的,因为它的冲激响应长度 n n 是无限的,并且是非因果的。为了产生一个有限长度的冲激响应,就需要用窗口对其进行截断。通过截断处理并保留脉冲响应的中心部分,就可以得到线性相位FIR滤波器。若滤波器上截止频率为 f H f_H ,系统抽样间隔为 T s a m p l e T_{\rm sample} ,冲激响应的长度 N N =51,这里 n n 也成为FIR滤波器抽头系数的个数,则得到的FIR滤波器的冲激响应序列为

h =2*f_H*sinc(2*f_H*(-25:25)*T_sample);

这里采用的窗口是简单的矩形窗。下面的命令可以显示滤波器的频率响应

fvtool(h,1)

可以看到冲激响应如下图所示。在第 n n 个采样点上的幅度大小就是FIR滤波器的抽头系数 h ( n ) h(n) ,这里 n = 1 , 2 , . . . 51 n=1,2,...51 。注意由于为物理可实现滤波器,因此 h ( 26 ) h(26) 对应的是中心点,即(1)中 n = 0 n=0 的点。
在这里插入图片描述
下图为上述FIR滤波器的幅频特性,注意纵坐标为分贝值,横坐标为归一化频率(即真实频率除以抽样频率)。
在这里插入图片描述
我们发现,由于对理想滤波器进行了截断处理,因此得到的滤波器就不再是理想滤波器了。首先从通带到阻带的不是陡峭的,且阻带里的幅度也不为零,存在纹波。事实上,如果我们增大抽头系数个数 N N ,传输特性会有所改善。下面两张图分别为 N = 101 N=101 N = 501 N=501 时的幅频特性,显然通带变得更加平坦,阻带电平也更小。
在这里插入图片描述
在这里插入图片描述

2、用fdatool设计滤波器并保存抽头系数

  实际在仿真过程中,我们利用MATLAB中的滤波器设计插件fdatool,可以很方便地在可视化界面中设计滤波器参数,然后导出参数。

  1. 在MATLAB命令行窗口中,输入fdatoo命令,就可以打开滤波器设计界面,如下图所示。在这里插入图片描述
  2. 参数设计:如果采样速率为100Hz,从通带到阻带的过渡带为[8Hz,10Hz],低通滤波器,等纹波FIR。设置完成后,点下方的“Design Filter”按钮,就可以设计出滤波器来。可以在左上方“Current Filter Information"窗口中看到,设计出的滤波器阶数(即抽头数 N N )为63。正上方“Magnitude Response(dB)”窗口中为滤波器的幅频特性,横坐标最大值为 f s a m p l e / 2 f_{\rm sample}/2
    在这里插入图片描述
    可以看到由于选择了“等纹波”类型,上图中阻带内的纹波是相同的。如果改成"Window"类型,频率传递函数如下图所示,此时纹波不在相等。

在这里插入图片描述
在fdatool界面中,菜单栏下有一排按钮,选择其中的冲激响应按钮,可以看到滤波器的冲激响应,如下图所示。显然,每个原点的幅值就是滤波器的抽头系数,两个点之间的横坐标差值就是采样间隔 T s a m p l e T_{\rm sample}
在这里插入图片描述
若点击“Filter Coefficients”按钮,可以看到滤波器的抽头系数。若 N = 63 N=63 ,可以看到"Filter Coefficients"窗口显示的63个抽头系数。
在这里插入图片描述
3. 输出抽头系数:我们需要把设计好的滤波器抽头系数保存下来。尽管有几种不同的方式,我们这里主要介绍如何保存在内存中供MATLAB的程序调用。首先在fdatool界面下点击菜单"File–>Export…",就会弹出下图中右边的"Export"界面。在界面中选择"Workspace"和“Num”,滤波器系数就输出到MATLAB工作空间中的“Num”向量中。回到MATLAB主菜单,可以在工作区中看到"Num"向量,这样就可以直接进行调用了。如下图所示。
在这里插入图片描述
4. 信号通过滤波器:我们采用卷积函数conv进行运算。得到波形如下图所示,显然输出波形与输入波形相比,有时延。请思考时延大小取决于什么?
在这里插入图片描述
滤波器输出频谱如下图所示。其中红颜色图形为输出信号频谱。经过滤波后,频率大于10Hz的成分被滤除掉了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tanghonghanhaoli/article/details/100533581