实验 6 无限冲激响应数字滤波器设计
不出意外的话这上面的代码都是直接可以跑的,如果出了意外的话可以邮箱1902946954@qq.com
一、实验目的
1、掌握双线性变换法及脉冲相应不变法设计 IIR 数字滤波器的具体设计方法;
2、熟悉用双线性变换法及脉冲响应不变法设计低通、高通和带通 IIR 数字滤波器的计算机编程。
二、实验原理
在 MATLAB 中,可以用下列函数辅助设计 IIR 数字滤波器:
1)利用 buttord 和 cheb1ord 可以确定低通原型巴特沃斯和切比雪夫滤波器的阶数和截止频率;
2)[num,den]=butter(N,Wn)(巴特沃斯)和[num,den]=cheby1(N,Wn),[num,den]=cheby2(N,Wn) (切比雪夫 1 型和 2 型)可以进行滤波器的设计;
3)lp2hp,lp2bp,lp2bs 可以完成低通滤波器到高通、带通、带阻滤波器的转换;
4)使用 bilinear 可以对模拟滤波器进行双线性变换,求得数字滤波器的传输函数系数;
5)利用 impinvar 可以完成脉冲响应不变法的模拟滤波器到数字滤波器的转换。
三、预习要求
1. 在 MATLAB 中,熟悉函数 butter、cheby1、cheby2 的使用,其中: [num,den]=butter(N,Wn)巴特沃斯滤波器设计; [num,den]=cheby1(N,Wn)切比雪夫 1 型滤波器设计; [num,den]=cheby2(N,Wn)切比雪夫 2 型滤波器设计。
2. 阅读扩展练习中的实例,学习在 MATLAB 中进行数字滤波器的设计;
3. 给出 IIR 数字滤波器参数和滤波器的冲激响应,绘出它们的幅度和相位频响曲线,讨论 它们各自的实现形式和特点。
四、实验内容
五、用双线性变换法设计数字带通滤波器
5.1 代码思路
我们可以有两种方法设计:第一种先设计出对应的模拟低通滤波器,再通过谱变换将模拟低通变到模拟带通,再通过双线性变换将模拟带通变为数字带通。
第二种是直接通过Matlab中的buttord和butter直接在z域设计出模拟带通滤波器,最后通过双线性变换得到数字带通。
5.2 源代码
%方法一
wp1c=tan(wp1/2); wp2c=tan(wp2/2); ws2c=tan(ws2/2); ws1c=tan(ws1/2);
Bw=wp2c-wp1c;
w0_square=wp1c*wp2c;
w0=w0_square^(0.5);
ws1c_correct=w0_square/ws2c;
ws1c=ws1c_correct;
wp=1;
ws=(w0_square-ws1c^2)/(ws1c*Bw);
[Ns,Wns]=buttord(wp,ws,Rp,Rs,'s');
[Bs,As]=butter(Ns,Wns,'s');
[BT,AT]=lp2bp(Bs,As,w0,Bw);
[num_b,den_b]=bilinear(BT,AT,0.5);
[num_p,den_p]=impinvar(BT,AT,1);
figure(3);
freqz(num_b,den_b);
figure(4);
freqz(num_p,den_p);
方法二:
%方法二
clc;clear;
wp1=0.45*pi; wp2=0.65*pi; ws1=0.3*pi; ws2=0.8*pi;
Wp=[wp1 wp2]/pi;
Ws=[ws1 ws2]/pi;
Rp=1;
Rs=40;
[N,Wn] = buttord(Wp,Ws,Rp,Rs);
[B,A]=butter(N,Wn);
figure(1);
freqz(B,A);
5.3 结果及分析
图1 方法1实现的带通滤波器的频率响应
图2 方法2实现的带通滤波器频率响应
我们可以看到两种方法设计出来的带通滤波器是基本一样且都能达到通带峰值起伏和最小阻带衰减的要求。
这两种方法都是用巴特沃兹滤波器实现的,我们同样可以用切比雪夫滤波器实现。源代码如下:
%方法三
[Nc,Wpc] = cheb1ord([wp1 wp2]/pi,[ws1 ws2]/pi,Rp,Rs);
[bc,ac]= cheby1(Nc,Rp,[wp1 wp2]/pi);
figure(6);
freqz(bc,ac,1024);
图3 切比雪夫带通滤波器频率响应
图4 巴特沃兹与切比雪夫幅频特性的对比
首先两种滤波器都能达到要求的指标,不同在于巴特沃斯在通/阻带内随频率单调变化而切比雪夫误差均匀分布在通/阻带内。因此切比雪夫滤波器中通阻带有较明显的波纹,而不是单调的。我们查看matlab工作区可得巴特沃兹的阶数为6而切比雪夫为4,我们也可以得到在同样的幅度指标下,切比雪夫滤波器阶数更低的结论。
六、用脉冲响应不变法设计带通滤波器(这个我没太做出来,做出来的指标不符合)
6.1 代码思路
和双线性变换的思路基本一致,只要在最后在最后将bilinear换成impinvar函数,即可。
6.2 源代码
%[num_b,den_b]=bilinear(BT,AT,0.5); 双线性变换
[num_p,den_p]=impinvar(BT,AT,1); 脉冲响应不变法
6.3 结果及分析
图5 脉冲响应不变法设计带通滤波器
我们发现该滤波器在低频和高频都不满足阻带边界频率指标,在调整阶数后依然无法达到指标。因此我们认为该滤波器指标很难用脉冲响应不变法设计。