簡單記錄下在matlab上如何設計出模拟的帶通濾波器,包括:巴特沃斯濾波器、切比雪夫I型濾波器、切比雪夫II型濾波器、橢圓型濾波器。
代碼如下:
%設計帶通濾波器
%巴特沃斯、切比雪夫I型、切比雪夫II型、橢圓型濾波器
clear all;
%wp和ws分别是通帶和阻帶的頻率(截止頻率)。當wp和ws為二進制矢量時,為帶通或帶阻濾波器,這時求出的Wn也是二進制矢量;當wp和ws為一進制矢量時,為低通或高通濾波器:當wp<ws時為低通濾波器,當wp>ws時為高通濾波器。
%wp和ws為二進制矢量
wp=[0.1*2*pi 0.15*2*pi]; %設定通帶頻率
ws=[0.05*2*pi 0.2*2*pi]; %設定阻帶頻率
Rp=1; %設定通帶波紋系數
Rs=20; %設定阻帶波紋系數
%巴特沃斯濾波器設計
[N,Wn]=buttord(wp,ws,Rp,Rs,\'s\'); %求巴特沃斯濾波器階數,輸出參數N代表滿足設計要求的濾波器的最小階數,Wn是等效低通濾波器的截止頻率
%無論是高通、帶通和帶阻濾波器,在設計中最終都等效于一個截止頻率為Wn的低通濾波器(我現在也不是很了解為啥是這樣,畢竟我也是剛接觸濾波器)
fprintf(\'巴特沃斯濾波器 N= %4d\n\',N); %顯示濾波器階數
[bb,ab]=butter(N,Wn,\'s\'); %求巴特沃斯濾波器系數,即求傳輸函數的分子和分母的系數向量
W=0:0.01:2; %設定模拟頻率
[Hb,wb]=freqs(bb,ab,W); %求巴特沃斯濾波器頻率響應
plot(wb/pi,20*log10(abs(Hb)),\'b\'); %作圖
hold on
%切比雪夫I型濾波器設計
[N,Wn]=cheb1ord(wp,ws,Rp,Rs,\'s\'); %求切比雪夫I型濾波器階數
fprintf(\'切比雪夫I型濾波器 N= %4d\n\',N); %顯示濾波器階數
[bc1,ac1]=cheby1(N,Rp,Wn,\'s\'); %求切比雪夫I型濾波器系數,即求傳輸函數的分子和分母的系數向量
[Hc1,wc1]=freqs(bc1,ac1,W); %求切比雪夫I型濾波器頻率響應
plot(wc1/pi,20*log10(abs(Hc1)),\'k\'); %作圖
%切比雪夫II型濾波器設計
[N,Wn]=cheb2ord(wp,ws,Rp,Rs,\'s\'); %求切比雪夫II型濾波器階數
fprintf(\'切比雪夫II型濾波器 N= %4d\n\',N);%顯示濾波器階數
[bc2,ac2]=cheby2(N,Rs,Wn,\'s\'); %求切比雪夫II型濾波器系數,即求傳輸函數的分子和分母的系數向量
[Hc2,wc2]=freqs(bc2,ac2,W); %求切比雪夫II型濾波器頻率響應
plot(wc2/pi,20*log10(abs(Hc2)),\'r\'); %作圖
%橢圓型濾波器設計
[N,Wn]=ellipord(wp,ws,Rp,Rs,\'s\'); %求橢圓型濾波器階數
fprintf(\'橢圓型濾波器 N= %4d\n\',N); %顯示濾波器階數
[be,ae]=ellip(N,Rp,Rs,Wn,\'s\'); %求橢圓型濾波器系數,即求傳輸函數的分子和分母的系數向量
[He,we]=freqs(be,ae,W); %求橢圓型濾波器頻率響應
%作圖
plot(we/pi,20*log10(abs(He)),\'g\');
axis([0 max(we/pi) -30 2]);
legend(\'巴特沃斯濾波器\',\'切比雪夫I型濾波器\',\'切比雪夫II型濾波器\',\'橢圓型濾波器\');
xlabel(\'角頻率{\omega}/{\pi}\');
ylabel(\'幅值/dB\');
line([0 max(we/pi)],[-20 -20],\'color\',\'k\',\'linestyle\',\'--\');%在畫布上畫線
line([0 max(we/pi)],[-1 -1],\'color\',\'k\',\'linestyle\',\'--\');
line([0.2 0.2],[-30 2],\'color\',\'k\',\'linestyle\',\'--\');
line([0.3 0.3],[-30 2],\'color\',\'k\',\'linestyle\',\'--\');
運作結果如下:
巴特沃斯濾波器 N= 4
切比雪夫I型濾波器 N= 3
切比雪夫II型濾波器 N= 3
橢圓型濾波器 N= 2
注:
1、求各種濾波器的傳輸函數的分子和分母向量系數的函數,例如:
[bc1,ac1]=cheby1(N,Rp,Wn,\'s\'); %求切比雪夫I型濾波器系數,即求傳輸函數的分子和分母的系數向量
這裡的函數cheby1()中的參數為
cheby1(N,Rp,Wn,\'type\',\'s\');
其中注意’type’可為高通:\'high’或帶阻:‘stop’,如果不填的話,預設是低通或者帶通,至于是低通還是帶通,主要看你前面的wp和ws是二進制矢量還是一進制矢量:二進制矢量對應帶通,一進制矢量對應低通。
2、matlab中的line()函數簡單介紹:
https://blog.csdn.net/qq_36554582/article/details/83352155
————————————————
版權聲明:本文為CSDN部落客「逸淩123」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_36554582/article/details/83350837