典型的模拟低通滤波器的指标有两种方法:
第一种:Ωp,Ωs分别为通带频率和阻带频率,δp,δs分别为通带容限和阻带容限(峰波纹值)。
其中,在通带内要求1-δp<=|Ha(jΩ)|<=1。
有时候指标也可以这样表示:用通带最大衰减 αp 和阻带最小衰减 αs表示,它们的单位是dB:它的定义为αp=-20lg(1-δp);αs=-20lg(δs)。
第二种:用参数ε,A来表示,它们和δp,δs的关系是:ε=[(1-δp)^(-2)-1]^(0.5), A=1/δs。
以上是先对滤波器的一个了解,我们需要理解各个指标的意思,这样对下面的描述才能更理解,以下是我个人的理解:
我们要设计数字滤波器,总的归纳起来有以下步骤组成:
1,先根据指标,用函数得到滤波器的阶数和截止频率
2,根据所得到的阶数,用函数得到滤波器的零点,极点,增益因子
3,根据零点,极点,增益因子,用函数求得滤波器的传输函数的分子,分母系数。这时候我们得到的是模拟的低通滤波器。
4,根据需要,用以下函数把模拟低通滤波器转换成低通,高通,带通或带阻滤波器。
低通:[B,A]=lp2lp(b,a,Wo)
高通:[B,A]=lp2hp(b,a,Wo)
带通:[B,A]=lp2bp(b,a,Wo,Bw)
带阻:[B,A]=lp2bs(b,a,Wo,Bw)
到这已经差不多大功告成了,但是我们这时候求得的是s域上的,有实,虚轴。可是我们要的是数字滤波器,也是对离散信号进行滤波,于是我们就要把s域转换成z域。这时候我们就要用双线性变换了。
5,用双线性变换得到数字滤波器。在这里我们要注意,既然是双线性变换,我们在设计之前,应该先对频率进行预畸变:Ω=tan(w/2),这是数字频率和等效的模拟频率之间的映射关系。否则在这部的双线性变换是没有意义的。
%%1 设计低通数字滤波器,要求在通带内频带低于0.2pi rad 时,允许幅度误差在1dB以内,在频率0.3pi rad -pi rad 之间的阻带衰减大于15dB。用双线性设计数字滤波器,T=1,模拟滤波器采用巴特沃兹滤波器原型。
rp=1; rs=15;
wp=0.2*pi; ws=0.3*pi;
wap=tan(wp/2); was=tan(ws/2); %预畸变
[n,wn]=buttord(wap,was,rp,rs,'s') ;%第一步
[z,p,k]=buttap(n); %第二步
[bp,ap]=zp2tf(z,p,k); %第三步
[bs,as]=lp2lp(bp,ap,wap); %第四步
[bz,az]=bilinear(bs,as,1/2); %第五步
[hi,t]=impz(bz,az);%求出滤波器冲激响应
[hf,w]=freqz(bz,az,256,1);%求出滤波器频率响应
subplot(3,2,1);stem(t,hi);
title('the impz of the low filter');
xlabel('t');ylabel('h');
axis([0 70 -0.1 0.3]);grid on;
subplot(3,2,2);plot(w,abs(hf));
title('the freqz of the low filter');
xlabel('w');ylabel('h');
axis([0 0.5 -0.2 1.2]);grid on;
n=0:80;
x=sin(2*pi*50/1000*n)+sin(2*pi*400/1000*n);%要滤过的信号波形
y=filter(bz,az,x);%过滤后的信号波形
subplot(3,2,3);stem(n,x);
title('before the low filter');
xlabel('n');ylabel('x');
axis([0 80 -2 2]);grid on;
subplot(3,2,4);stem(n,y);
title('after the low filter');
xlabel('n');ylabel('y');
axis([0 80 -1.5 1.5]);grid on;
我们采用的是BUTTERWORTH低通滤波器,因为它模拟出来的滤波器比较理想。我们要注意双线性变换中[bz,az]=bilinear(bs,as,1/2);第三个参数。
%%2 设计一个巴特沃兹高通滤波器,要求通带截止频率为 0.6pi,通带内衰减不大于1dB,阻带起始频率为0.4pi,阻带内衰减不小于15dB,T=1。
rp2=1; rs2=15;
wp2=0.4*pi; ws2=0.6*pi;
wap2=tan(wp/2); was2=tan(ws/2);
[n2,wn2]=buttord(wap2,was2,rp2,rs2,'s') ;
[z2,p2,k2]=buttap(n2);
[bp2,ap2]=zp2tf(z2,p2,k2);
[bs2,as2]=lp2hp(bp2,ap2,wap2);
[bz2,az2]=bilinear(bs2,as2,1/2);
[hi2,t2]=impz(bz2,az2);
[hf2,w2]=freqz(bz2,az2,256,1);
subplot(3,2,5);stem(t2,hi2);
title('the impz of the high filter');
xlabel('t');ylabel('h');
axis([0 70 -0.75 0.5]);grid on;
subplot(3,2,6);plot(w2,abs(hf2));
title('the freqz of the high filter');
xlabel('w');ylabel('h');
axis([0 0.5 -0.2 1.2]);grid on;
这个高通滤波器的设计,其实和上面那题步骤是一样的,我们先按照低通的要求设计一个模拟低通滤波器,然后再转换成高通。
关于总结:
1,我们在运用函数的时候,一定要注意各个参数的单位。比如上面的buttord求滤波器的阶数和截止频率,我们所用的指标的单位都是rad/s,dB。若给出的指标单位是Hz,我们就要根据数值对其进行相应的变换,如:Fp=100Hz,Fs=300Hz,则Ωp=2pi*Fp/1000,Ωs=2pi*Fs/1000,这是要注意的地方。
2,我们在滤波的时候,都是根据传输函数的分子,分母系数的一系列运算得到过滤出来的。所以我们设计一个滤波器,无非就是计算出这个滤波器的传输函数,而我们在MATLAB中的表达传输函数,就是用它的分子,分母系数来表达。
这份代码运行得到的图形是:
欢迎访问我的博客:http://blog.sina.com.cn/barbarac