matlab双线性z变换法设计数字低通滤波器
- 双线性z变换法利用了正切函数的非线性特点,将整个jΩ轴压缩到了单位圆的一周上。
-
- 低通:
clear;
close all;
clc;fp=100;fs=300;Fs=1000;
rp=3;rs=20;
% 3db,20db
wp=2*pi*fp/Fs;% 2Pi - Fs —> 100hz - 0.1Fs*2Pi=0.2Pi
ws=2*pi*fs/Fs;
Fs=Fs/Fs; % let Fs=1
% Firstly to finish frequency prewarping ;
wap=tan(wp/2);was=tan(ws/2); %求Ωp,Ωs
[n,wn]=buttord(wap,was,rp,rs,’s’) %n:滤波器阶数, wn:buttord算出的自然截至频率,一般>wp
% Note: ‘s’!
[z,p,k]=buttap(n); %极点,零点,增益
[bp,ap]=zp2tf(z,p,k) %G(p)的分子,分母多项式系数 G(p)=1/p^2+√(n)*p+1
[bs,as]=lp2lp(bp,ap,wap) %G(s)=G(p)|p=s/Ωp
% Note: s=(2/Ts)(z-1)/(z+1);Ts=1,that is 2fs=1,fs=0.5;
[bz,az]=bilinear(bs,as,Fs/2) %H(z) = G(s)|s=z-1/z+1
[h,w]=freqz(bz,az,256,Fs*1000);
plot(w,abs(h));grid on;
-
- 带通
clear;
close all;
clc;fp=[300 400];fs=[200 500];
rp=3;rs=18;
Fs=2000;
wp=fp*2*pi/Fs;
ws=fs*2*pi/Fs;
%
% Firstly to finish frequency prewarping;
wap=2*Fs*tan(wp./2)
was=2*Fs*tan(ws./2);
[n,wn]=buttord(wap,was,rp,rs,’s’);
% Note: ‘s’!
[z,p,k]=buttap(n);
[bp,ap]=zp2tf(z,p,k) %低通转移函数G(p)
%
bw=wap(2)-wap(1) %通带带宽
w0=sqrt(wap(1)*wap(2)) %通带中心频率
[bs,as]=lp2bp(bp,ap,w0,bw) %H(s)=G(p)|s^2+wp(1)wp(2) / s(wp(2)-wp(1))
%{
[h1,w1]=freqs(bp,ap);
figure(1);
plot(w1,abs(h1));grid;
ylabel(’ lowpass G(p)’)
%}
w2=[0:Fs/2-1]*2*pi;
h2=freqs(bs,as,w2);
% Note: z=(2/Ts)(z-1)/(z+1);
[bz1,az1]=bilinear(bs,as,Fs) % H(z) = G(p)|p=(z-1)^2+w0(z+1)^2 / bw(z^2-1)
[h3,w3]=freqz(bz1,az1,1000,Fs);
figure();
plot(w2/2/pi,20*log10(abs(h2)),w3,20*log10(abs(h3)));grid;
ylabel(‘Bandpass AF and DF’)
xlabel(’ Hz’)