一、实验目的 1. 熟悉并会使用实验中用到的MATLAB 函数 2. 掌握用MATLAB 函数直接设计数字滤波器的编程方法 二、实验原理 设计IIR 滤波器的基本方法有两种途径: 途经1:首先设计模拟低通滤波器,再在时域实现滤波器的变换得到我们期望的类型,最后 再转换到相应类型的数字滤波器。 途经2:首先设计模拟低通滤波器,再转换为数字低通滤波器,最后实行频带变换将滤波器 转换到我们期望的类型的数字滤波器。
在前面的实验中,我们都是采用的第二种途径,现在考虑使用第一种途径,这需要一些 函数直接来设计高通,带通和带阻滤波器。MATLAB 中提供了这种寒暑,如: 1.[b, a] = BUTTER(N , wn,'high') 设计一个N 阶,截至频率为 wn 的高通滤波器。
2.[b, a] = BUTTER(N , wn,) 设计一个 2N 阶带通滤波器,wn 是一个含有两个元素的向量
wn = [w1, w2] ,通带为 w1 < w < w2 。
3.[b, a] = BUTTER(N , wn,' stop') 设计一个 2N 阶带阻滤波器, wn = [w1, w2] ,阻带是 w1 < w < w2 参数 N, wn 可由函数[N , wn] = buttord (wp, ws, Rp, As) 求得。相关知识同样应用于切比雪夫和椭圆滤波器。 三、实验内容 利用直接设计发设计一下要求的滤波器:
参考流程图:
四、实验报告要求 1.简述实验目的及原理。 2.整理好经过运行并证明是正确的实验程序并加上注释。绘出相应的图形。
代码语言:javascript复制wp=0.2;
ws=0.3;
rp=1;
as=15;
[n1,wc1]=buttord(wp,ws,rp,as);
[b1,a1]=butter(n1,wc1);
[h1,w1]=freqz(b1,a1);
db1=20*log10(abs(h1)/max(abs(h1)));
subplot(311),plot(w1/pi,abs(h1));
xlabel('pi');ylabel('H');
axis([0,1,0,1.1]);
subplot(312),plot(w1/pi,angle(h1));
xlabel('pi');
subplot(313),plot(w1/pi,db1);
xlabel('pi');ylabel('db');
wp=0.6;
ws=0.4;
rp=1;
as=15;
[n1,wc1]=buttord(wp,ws,rp,as);
[b1,a1]=butter(n1,wc1,'high');
figure;
[h1,w1]=freqz(b1,a1);
db1=20*log10(abs(h1)/max(abs(h1)));
subplot(311),plot(w1/pi,abs(h1));
xlabel('pi');ylabel('H');axis([0,1,0,1.1]);
subplot(312),plot(w1/pi,angle(h1));
xlabel('pi');
subplot(313),plot(w1/pi,db1);
xlabel('pi');ylabel('db');
wp=[0.3,0.4];
ws=[0.2,0.5];
rp=3;
as=18;
ts=1;
[n1,wc1]=buttord(wp,ws,rp,as);
[b1,a1]=butter(n1,wc1);
figure;
[h1,w1]=freqz(b1,a1);
db1=20*log10(abs(h1)/max(abs(h1)));
subplot(311),plot(w1/pi,abs(h1));
xlabel('pi');ylabel('H');axis([0,1,0,1.1]);
subplot(312),plot(w1/pi,angle(h1));
xlabel('pi');
subplot(313),plot(w1/pi,db1);
xlabel('pi');ylabel('db');
wp=[0.2,0.8];
ws=[0.4,0.7];
rp=1;
as=30;
ts=1;
[n1,wc1]=buttord(wp,ws,rp,as);
[b1,a1]=butter(n1,wc1,'stop');
figure;
[h1,w1]=freqz(b1,a1);
db1=20*log10(abs(h1)/max(abs(h1)));
subplot(311),plot(w1/pi,abs(h1));
xlabel('pi');ylabel('H');axis([0,1,0,1.1]);
subplot(312),plot(w1/pi,angle(h1));
xlabel('pi');
subplot(313),plot(w1/pi,db1);
xlabel('pi');ylabel('db');