Matlab下IIR滤波器实现(Simulink仿真和C语⾔实现)
经典滤波器和现代滤波器
⼀般滤波器可以分为经典滤波器和现代滤波器。
1. 经典滤波器:假定输⼊信号中的有⽤成分和希望去除的成分各⾃占有不同的频带。如果信号和噪声的频谱相互重迭,经典滤波器⽆能 为⼒。⽐如 FIR 和 IIR 滤波器等。
2. 现代滤波器:从含有噪声的时间序列中估计出信号的某些特征或信号本⾝。现代滤波器将信号和噪声都视为随机信号。包括 Wiener
Filter、Kalman Filter、线性预测器、⾃适应滤波器等
在连续系统中采⽤拉普拉斯变换求解微分⽅程,并直接定义了传递函数,成为研究系统的基本⼯具。在采样系统中,连续变量变成了离散量,将Laplace变换⽤于离散量中,就得到了Z变换。和拉⽒变换⼀样,Z变换可⽤来求解差分⽅程,定义Z传递函数成为分析研究采样系统的基本⼯具。 对于⼀般常⽤的信号序列,可以直接查表出其Z变换。相应地,也可由信号序列的Z变换查出原信号序列,从⽽使求取信号序列的Z变换较为简便易⾏。
Z变换有许多重要的性质和定理:
线性定理
设a,a1,a2为任意常数,连续时间函数f(t),f1(t),f2(t)的Z变换分别为F(z),F1(z),F2(z),则有
Z[a*f(t)]=aF(z)
Z[a1f1(t)+a2f2(t)]=a1F1(z)+a2F2(z)
滞后定理
设连续时间函数在t<0时,f(t)=0,且f(t)的Z变换为F(z),则有
Z[f(t−kT)]=z^−k * F(z)
IIR滤波器常见的结构形式有直接Ⅰ型、直接Ⅱ型(典范型)、级联型、并联型。通过差分⽅程能够画出包含反馈结构的数字⽹络称为直接型。
直接Ⅰ型滤波器的⽹络结构可以根据差分⽅程很直观地画出(The Direct-Form I structure implements the feed-forward terms first followed by the feedback terms):
可以看出直接Ⅰ型滤波器需要N+M个延时单元(N≥M)。直接Ⅱ型结构是对直接Ⅰ型的变型,将上⾯⽹络的零点与极点的级联次序互换,并将延时单元合并。实现N阶滤波器只需要N个延时单元(The Direct-Form II structure uses fewer delay blocks than Direct-Form I),故称为典范型。
直接Ⅱ型看上去不那么直观,可以通过下图进⾏理解。我们可以将整个滤波器系统看成A、B两个⼦系统串联⽽成,由于为线性系统因此交换顺序不影响最终输出结果,传递函数可写为:
H(z)=B(z)*1/A(z)=1/A(z)*B(z)
直接型优点:直接型结构简单,⽤的延迟器较少(N和M中较⼤者的个数);缺点:系数ak,bk对滤
波器性能的控制关系不直接,因此调整不⽅便;具体实现滤波器时ak,bk的量化误差将使滤波器的频率响应产⽣很⼤的改变,甚⾄影响系统的稳定性。直接型结构⼀般⽤于实现低阶系统。
级联型:将系统传递函数H(z)因式分解为多个⼆阶⼦系统,系统函数就可以表⽰为这些⼆阶⼦系统传递函数的乘积。实现时将每个⼆阶⼦系统⽤直接型实现,整个系统函数⽤⼆阶环节的级联实现。
并联型:与级联型类似,⽤部分分式展开法将系统函数表⽰为⼆阶⼦系统传递函数的和。每个⼆阶⼦系统仍然⽤直接型实现,整个系统函数⽤⼆阶环节的并联实现。
FDATool⼯具
在IIR滤波器设计过程中,通常利⽤模拟滤波器来设计数字滤波器,要先根据滤波器的性能指标设计出相应的模拟滤波器的系统函数
H(s),然后由H(s)经变换得到所需要的数字滤波器的系统函数H(z)。常⽤的变换⽅法有冲激响应不变法和双线性变换法。下⾯使⽤MATLAB等⼯具直接⽣成数字滤波器系数:
在MATLAB命令⾏中输⼊fdatool打开滤波器设计⼯具箱,为了便于分析,我们先从设计⼀个简单的2阶低通滤波器。Design Method ⽤于选择IIR滤波器还是FIR滤波器,这⾥我们选择IIR滤波器,类型选择Chebyshev TypeII,当然也可以选择其他类型,不同类型的频率响应不同,选择后默认的滤波器结 构是直接II型。ResponseType⽤于选择低通、⾼通、带通、带阻等类型,选择低通滤波“Lowpass”。Frequency Specifications⽤于设置采样频率以及截⽌频率,这⾥填⼊Fs = 10 Fpass = 1,Fstop = 4 即采样率为10Hz,1Hz以上的频率将被滤除掉。Fiter Order 选择滤波器阶数,为了简单起见,先选择⼀个2阶滤波器做实验。
参数设置好后点击Design filter按钮,将按要求设计滤波器。默认⽣成的IIR滤波器类型是Direct-Form II,Second-Order
Sections(直接Ⅱ型,每个Section是⼀个⼆阶滤波器),在⼯具栏上点击Filter Coefficients图标或菜单栏上选择Analysis→Filter Coefficients可以查看⽣成的滤波器系数。菜单栏上选择Edit->Convert Structure 可以查看滤波器结构类型 Direct-Form II SOS。
MATLAB中⼆阶滤波器差分⽅程公式如下(注意反馈项符号为负号):
y[n]=b0⋅x[n]+b1⋅x[n−1]+b2⋅x[n−2]−a1⋅y[n−1]−a2⋅y[n−2]
如上图Section的公式如下
y[n] = x[n] + 1.9390984655⋅x[n−1]+x[n−2] - (-0.654227)⋅y[n−1]−0.123235⋅y[n−2]
滤波器设计完成后还可以⽣成Simulink模型进⾏仿真:按照下图中数字标号进⾏,第⼀步点击左边Realize Model图标,第⼆步勾
选“Build model using basic elements”这⼀项,右边四个灰⾊的项将⾃动打钩,最后点击“Realize Model”,matlab将⾃动⽣成滤波器模型,在弹出的窗⼝中双击模型可以观察该模型的内部结构。
下⾯是直接Ⅱ型的内部结构
Simulink仿真
使⽤⽣成的滤波器搭建⼀个简答的测试模型:将两个幅值为1,频率分别为 0.5Hz 和 3Hz正弦波信号,数字量化0.1秒解算器步长 0.1 ,时间 10秒(下图为100秒)