Matlab中的數字濾波器設計

目錄

目錄

0 前言

1 數字濾波器的設計方法概述

2 IIR數字濾波器的設計方法

2.1 模擬濾波器設計

2.1.1 巴特沃斯濾波器設計

2.1.2 切比雪夫濾波器設計

2.1.3 橢圓濾波器設計

2.2 模擬濾波器轉數字濾波器

2.2.1 衝激響應不變法

2.2.2 雙線性映射法

2.3 直接設計數字濾波器

3 FIR數字濾波器的設計方法

3.1 窗函數法

4 Matlab自動生成濾波器代碼工具

5 數字濾波器的使用

6 結語


0 前言

本文是作者在做數字信號處理作業時對Matlab下設計數字濾波器的一些總結,給出了普遍使用的數字濾波器代碼,修改參數即可移植使用。文中如有錯誤,歡迎留言批評、指正。

在Matlab軟件中的主頁幫助文檔,選擇Signal Processing ToolboxDigital and Analog Filters可以查看更多詳細內容

2019年12月5日於西安

1 數字濾波器的設計方法概述

濾波器特性介紹:濾波器的作用就是過濾波形,這裏的濾波不是指在時間上截取某一部分波形,而是指過濾掉不需要的波形成分,即只讓需要的波形成分通過,不需要的波形就被拋棄了。波形成分一般用頻率(Hz)來描述,也可以用模擬角頻率(rad/s)和數字角頻率(rad)來描述。一個理想的濾波器的特性就是隻允許將某個要求頻帶範圍內的波形成分全部通過,比如將500Hz到1000Hz之間的波形成分全部一個不少的輸出,並且其形狀不能發生任何改變,也就是說原來波形的相位可以線性左移或右移,但是幅度大小不能改變,對於小於500Hz和大於1000Hz的波形來說,就一點兒成分也不能輸出,幅度大小爲0。理想的濾波器是不可能實現的,但是我們可以無限逼近這一特性,這就需要對設計的濾波器進行性能指標描述。

可實現的濾波器:理想的濾波器嚴格的將某個頻率點兩端的成分分開,這個頻率點被稱爲截止頻率Wc,截止頻率的一端允許通過(即幅度保持不變),另一端不允許通過(即幅度全部爲0)。實際上做不到這一點,但放寬要求可以實現,在截止頻率點向左、右分別移動一定距離,可以確定兩個新的頻率點,這兩個新的頻率點之間的頻率成分就是過渡帶。把這兩個新的頻率點分別稱爲通帶截止頻率(fp或Wp)和阻帶截止頻率(fs或Ws)。同樣,波形的幅度也不能保證全部保持恆定不變,在通帶範圍內的幅度衰減稱爲通帶衰減大小,在阻帶範圍內的幅度衰減稱爲阻帶衰減大小,幅度的衰減大小一般用分貝(dB)表示。假如過渡帶中的頻率成分幅度緩慢衰減是可以接受的(過渡帶中幅度的衰減一般是單調下降的),通帶和阻帶的幅度在一定範圍內發生起伏波動(也叫紋波)也是可以接受的,那麼就可以實現這樣的濾波器。

濾波器的分類:從濾波器的通帶範圍來可將濾波器分爲低通、高通、帶通、帶阻濾波器;從濾波器可以處理的輸入信號來看可濾波器分爲模擬濾波器和數字濾波器;實際運用中,模擬濾波器在物理上可用電阻、電容等元件搭建電路實現,數字濾波器一般通過處理器用算法實現。本文重點介紹在Matlab下的數字濾波器仿真設計。

下圖描述了一個可實現的低通濾波器的幅頻特性曲線圖,其中矩形部分表示理想濾波器,曲線部分表示實際的濾波器,Wp表示通帶截止頻率,Ws表示阻帶截止頻率,Wp和Ws之間還有一個頻率點,這就是矩形代表的理想濾波器的截止頻率。在實際濾波器中,截止頻率處的幅度衰減定義爲3dB,也就是幅度衰減到原來的0.707,功率衰減到原來的0.5左右。δF和δs分別被稱爲通帶衰減大小和阻帶衰減大小。

一個可實現的低通濾波器幅頻特性曲線

備註:頻率(f)、模擬角頻率(Ω)、數字角頻率(w)之間的換算:Ω=2πf,w=ΩT,w=Ω/Fs,其中,T爲對模擬信號的採樣週期,Fs爲採樣頻率。分貝dB和幅度值\left | H\left ( e^{jw} \right ) \right |之間的換算如下:dB=-20\log_{10}\left | H\left ( e^{jw} \right ) \right |

1、確定濾波器性能指標

通帶誤差:包括通帶截止頻率、通帶最大衰減分貝

阻帶誤差:包括阻帶截止頻率、阻帶最小衰減分貝

過渡帶:通帶截止頻率與阻帶截止頻率之差

比如:要求設計一個低通濾波器,截止頻率爲2000Hz,即理想上要求把0~2000Hz之間的波形成分全部不改變形狀的輸出。爲了接近這一特性,通帶截止頻率設置爲1900Hz,通帶衰減不大於3dB(0.707),阻帶截止頻率設置爲2200Hz,阻帶衰減不小於40dB(0.01),下表給出了歸一化幅值與分貝之間的轉換表,歸一化幅值表示衰減到原來幅值的比例,或者說衰減到原來的百分比,比如40dB表示衰減到原來的0.01,也就是1%。性能指標的選擇範圍不一樣,實現濾波器的複雜度、成本以及最終的效果都是不一樣的,這需要根據實際情況進行平衡選擇。當然,如果僅僅是在Matlab下做仿真,就不需要考慮複雜度和成本等因素了。

歸一化幅值轉分貝圖如下所示:

歸一化幅值轉分貝圖

 

分貝轉歸一化幅值圖如下所示:

分貝轉歸一化幅值圖

2、數字濾波器的分類

設計數字濾波器本質上說就是設計一個因果穩定系統,一個離散的數字信號通過這個系統後,數字濾波器系統可以輸出期望的頻率成分。按數學濾波器系統的單位取樣響應可將數字濾波器分爲IIR和FIR兩大類。

IIR:無限衝激響應系統,可以用有理分式表示系統函數

                                                                        H(z)=\frac{b_{2}z^{-2}+b_{1}z^{-1}+b_{0}}{1-a_{1}z^{-1}-a_{2}z^{-2}}

特點:IIR濾波器設計方法簡單,階次低,運算量小,經濟高效,幅頻特性較好,但是必須考慮極點對系統穩定性的影響。同時,相頻特性存在一定程度的失真。適合用於對相位要求不高的場合,如信號檢測、語音通信等

FIR:有限衝激響應響應系統,可以用有理多項式表示系統函數

                                                                                H(z)=\sum_{r=0}^{M}b_{r}z^{-r}

特點:FIR與IIR剛好相反,FIR濾波器不存在極點,不需要考慮極點對系統穩定性的影響。同時,可以採用快速傅里葉變換算法實現快速卷積,在相同階次下,運算速度更快。但是設計會更復雜,相同的頻率特性下,其階次也比IIR要高,運算量大,成本高。主要適用於對相位要求較高的場合,如圖像處理等

2 IIR數字濾波器的設計方法

2.1 模擬濾波器設計

先設計出一個模擬濾波器,再對這個模擬濾波器的系統函數進行離散週期採樣就可得到數字濾波器的系統函數,在實際中普遍使用衝擊響應不變法雙線性映射法將模擬濾波器轉換爲數字濾波器。這裏的模擬濾波器通常被稱爲原型濾波器,最著名的是巴特沃斯濾波器、切比雪夫濾波器和橢圓濾波器,對這三種經典濾波器Matlab都有庫函數可以調用。

2.1.1 巴特沃斯濾波器設計

巴特沃斯濾波器幅頻特性曲線

巴特沃斯濾波器函數介紹:

在Matlab命令窗口輸入doc buttord 和doc butter 即可查看詳情

1、buttord函數 :生成巴特沃斯濾波器的階次N和截止頻率Wc

截止頻率Wc:幅度響應衰減爲爲原來的0.707時的頻率點,衰減大小爲3dB

階次N:階次越高,在截止頻率兩側衰減越快,濾波器越複雜,成本越高

[N,Wc]=buttord(Wp,Ws,Rp,Rs,'s');有參數‘s’時,表示生成巴特沃斯模擬濾波器的參數,此時,Wp、Ws和Wc表示模擬角頻率

2、butter函數 :設計巴特沃斯濾波器

[b,a] = butter(N,Wc,'low','s');有參數‘s’時,返回N階低通模擬巴特沃斯濾波器的傳遞函數係數,b爲系統函數分子係數,a爲系統函數分母系數,Wc爲截止模擬角頻率

其中的‘low’可以替換成'bandpass'、'high'、'stop',分別表示帶通、高通、帶阻濾波器

3、freqs函數:模擬濾波器的頻率響應

[h,w] = freqs(b,a,n);計算頻率模擬濾波器的頻率響應,b爲系統函數分子係數,a爲系統函數分母系數,n爲頻率點數,如果不指定n,n取默認值200

Matlab程序設計如下:

%設計巴特沃斯模擬濾波器
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)

%技術指標要求設置,按自己需求更改即可
fp=1900;fs=2200;%低通示例,理想截止頻率2000Hz左右
%fp=5100;fs=4800;%高通示例  理想截止頻率5000Hz左右
%fp=[1100,1900];fs=[900,2100];%帶通示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
%fp=[900,2100];fs=[1100,1900];%帶阻示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
Rp=1;Rs=40; 
% fm=10000; %信號頻率最大值,單位Hz
filter_type=1;%1:低通,2:高通,3:帶通,4:帶阻

Wp=2*pi*fp;Ws=2*pi*fs;    %轉換爲模擬角頻率,單位rad/s
%濾波器的階數:N
%衰減3dB時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=buttord(Wp,Ws,Rp,Rs,'s');%計算巴特沃斯模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=butter(N,Wc,'low','s');%設計巴特沃斯低通濾波器
    case 2
        [b,a]=butter(N,Wc,'high','s');%設計巴特沃斯高通濾波器
    case 3
        [b,a]=butter(N,Wc,'bandpass','s');%設計巴特沃斯帶通濾波器
    case 4
        [b,a]=butter(N,Wc,'stop','s');%設計巴特沃斯帶阻濾波器
end
[H,W]=freqs(b,a);%W:模擬角頻率,H:模擬濾波器的系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W/(2*pi);%將模擬角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('模擬濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
subplot(2,1,2);plot(f,pha);
title('模擬濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');
低通濾波器設計效果
模擬低通巴特沃斯濾波器設計效果

 

2.1.2 切比雪夫濾波器設計

切比雪夫1型濾波器幅頻特性

 

切比雪夫有兩種類型,類型1只在通帶有紋波起伏,類型2只在阻帶有紋波起伏,其程序設計完全一樣,只需要將主要函數名及相應參數更改即可,值得注意的是,cheby1的參數有通帶衰減大小Rp,cheby2的參數有阻帶衰減大小Rs,

切比雪夫1型模擬濾波器

1、cheb1ord函數

[N,Wc]=cheb1ord(Wp,Ws,Rp,Rs,'s');%計算切比雪夫1模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率

2、cheby1函數

[b,a]=cheby1(N,Rp,Wp,'low','s');%設計切比雪夫1低通濾波器,其中的‘low’可以替換成'bandpass'、'high'、'stop',分別表示帶通、高通、帶阻濾波器

切比雪夫1型模擬濾波器Matlab程序設計如下:

%設計切比雪夫1模擬濾波器
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)

fp=1900;fs=2200;%低通示例,理想截止頻率2000Hz左右
%fp=5100;fs=4800;%高通示例  理想截止頻率5000Hz左右
%fp=[1100,1900];fs=[900,2100];%帶通示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
%fp=[900,2100];fs=[1100,1900];%帶阻示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
Rp=1;Rs=40; 
fm=8000; %信號頻率最大值,單位Hz
filter_type=1;%1:低通,2:高通,3:帶通,4:帶阻

Wp=2*pi*fp;Ws=2*pi*fs;    %轉換爲模擬角頻率,單位rad/s
%濾波器的階數:N
%衰減3dB時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=cheb1ord(Wp,Ws,Rp,Rs,'s');%計算切比雪夫模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=cheby1(N,Rp,Wp,'low','s');%設計切比雪夫1低通濾波器
    case 2
        [b,a]=cheby1(N,Rp,Wp,'high','s');%設計切比雪夫1高通濾波器
    case 3
        [b,a]=cheby1(N,Rp,Wp,'bandpass','s');%設計切比雪夫1帶通濾波器
    case 4
        [b,a]=cheby1(N,Rp,Wp,'stop','s');%設計切比雪夫1帶阻濾波器
end
[H,W]=freqs(b,a);%W:模擬角頻率,H:模擬濾波器的系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W/(2*pi);%將模擬角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('模擬濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
axis([0 fm -80 5]); %座標範圍調整
subplot(2,1,2);plot(f,pha);
title('模擬濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');
axis([0 fm -4 4]); %座標範圍調整

 

模擬低通切比雪夫1型濾波器設計效果

 

切比雪夫2型模擬濾波器

1、cheb2ord函數

[N,Wc]=cheb1ord(Wp,Ws,Rp,Rs,'s');%計算切比雪夫2模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率

2、cheby2函數

[b,a]=cheby2(N,Rs,Wp,'low','s');%設計切比雪夫2低通濾波器,其中的‘low’可以替換成'bandpass'、'high'、'stop',分別表示帶通、高通、帶阻濾波器

Matlab程序設計如下:

%設計切比雪夫2模擬濾波器
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)

fp=1900;fs=2200;%低通示例,理想截止頻率2000Hz左右
%fp=5100;fs=4800;%高通示例  理想截止頻率5000Hz左右
%fp=[1100,1900];fs=[900,2100];%帶通示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
%fp=[900,2100];fs=[1100,1900];%帶阻示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
Rp=1;Rs=40; 
fm=12000; %信號頻率最大值,單位Hz
filter_type=1;%1:低通,2:高通,3:帶通,4:帶阻

Wp=2*pi*fp;Ws=2*pi*fs;    %轉換爲模擬角頻率,單位rad/s
%濾波器的階數:N
%衰減3dB時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=cheb2ord(Wp,Ws,Rp,Rs,'s');%計算切比雪夫模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=cheby2(N,Rs,Wp,'low','s');%設計切比雪夫2低通濾波器
    case 2
        [b,a]=cheby2(N,Rs,Wp,'high','s');%設計切比雪夫2高通濾波器
    case 3
        [b,a]=cheby2(N,Rs,Wp,'bandpass','s');%設計切比雪夫2帶通濾波器
    case 4
        [b,a]=cheby2(N,Rs,Wp,'stop','s');%設計切比雪夫2帶阻濾波器
end
[H,W]=freqs(b,a);%W:模擬角頻率,H:模擬濾波器的系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W/(2*pi);%將模擬角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('模擬濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
axis([0 fm -80 5]); %座標範圍調整
subplot(2,1,2);plot(f,pha);
title('模擬濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');
axis([0 fm -4 4]); %座標範圍調整

 

模擬低通切比雪夫2型濾波器設計效果

2.1.3 橢圓濾波器設計

橢圓濾波器幅頻特性曲線

1、ellipord函數

[N,Wc]=ellipord(Wp,Ws,Rp,Rs,'s');%計算橢圓模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率

2、ellip函數

[b,a]=ellip(N,Rp,Rs,Wp,'low','s');%設計橢圓濾波器低通濾波器其中的‘low’可以替換成'bandpass'、'high'、'stop',分別表示帶通、高通、帶阻濾波器

Matlab程序設計如下:

%設計橢圓濾波器模擬濾波器
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)

%fp=1900;fs=2200;%低通示例,理想截止頻率2000Hz左右
fp=5100;fs=4800;%高通示例  理想截止頻率5000Hz左右
%fp=[1100,1900];fs=[900,2100];%帶通示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
%fp=[900,2100];fs=[1100,1900];%帶阻示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
Rp=1;Rs=40; 
fm=12000; %信號頻率最大值,單位Hz
filter_type=2;%1:低通,2:高通,3:帶通,4:帶阻

Wp=2*pi*fp;Ws=2*pi*fs;    %轉換爲模擬角頻率,單位rad/s
%濾波器的階數:N
%衰減3dB時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=ellipord(Wp,Ws,Rp,Rs,'s');%計算切比雪夫模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=ellip(N,Rp,Rs,Wp,'low','s');%設計橢圓濾波器低通濾波器
    case 2
        [b,a]=ellip(N,Rp,Rs,Wp,'high','s');%設計橢圓濾波器高通濾波器
    case 3
        [b,a]=ellip(N,Rp,Rs,Wp,'bandpass','s');%設計橢圓濾波器帶通濾波器
    case 4
        [b,a]=ellip(N,Rp,Rs,Wp,'stop','s');%設計橢圓濾波器帶阻濾波器
end
[H,W]=freqs(b,a);%W:模擬角頻率,H:模擬濾波器的系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W/(2*pi);%將模擬角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('模擬濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
axis([0 fm -100 10]); %座標範圍調整
subplot(2,1,2);plot(f,pha);
title('模擬濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');
axis([0 fm -4 4]); %座標範圍調整

 

模擬高通橢圓濾波器設計效果

 

2.2 模擬濾波器轉數字濾波器

2.2.1 衝激響應不變法

衝激響應不變法:通過對模擬濾波器的單位衝激響應進行採樣得到數字濾波器的單位衝激響應,也就是從S平面映射到Z平面。衝激響應不變法只能設計帶限系統,即通過沖激響應不變法對低通、帶通模擬濾波器離散時,必須附加適當的帶限條件,這裏的帶限表示濾波器的工作有一個最大頻率,只能在某個頻率範圍內設計濾波器。在模擬濾波器設計完後使用衝激響應不變法變爲數字濾波器, 模擬濾波器的設計方法與上文步驟一樣。

[B,A]=impinvar(b,a,Fs);%衝激響應不變法
[H,W]=freqz(B,A);%數字濾波器系統函數

 完整程序如下:

%通過模擬濾波器設計IIR數字濾波器
%原型:巴特沃斯模擬濾波器;變換方法:衝激響應不變法
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)

%技術指標要求設置,按自己需求更改即可
fp=1000;fs=2000;%低通示例,理想截止頻率1300Hz左右
%fp=5100;fs=4800;%高通示例  理想截止頻率5000Hz左右
%fp=[1100,1900];fs=[900,2100];%帶通示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
%fp=[900,2100];fs=[1100,1900];%帶阻示例 理想上限截止頻率2000Hz,下限截止頻率1000Hz
Rp=1;Rs=40; 
Fs=5000;%採樣頻率
filter_type=1;%1:低通,2:高通,3:帶通,4:帶阻

Wp=2*pi*fp;Ws=2*pi*fs;    %轉換爲模擬角頻率,單位rad/s
%濾波器的階數:N
%衰減3dB時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=buttord(Wp,Ws,Rp,Rs,'s');%計算巴特沃斯模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=butter(N,Wc,'low','s');%設計巴特沃斯低通濾波器
    case 2
        [b,a]=butter(N,Wc,'high','s');%設計巴特沃斯高通濾波器
    case 3
        [b,a]=butter(N,Wc,'bandpass','s');%設計巴特沃斯帶通濾波器
    case 4
        [b,a]=butter(N,Wc,'stop','s');%設計巴特沃斯帶阻濾波器
end
[B,A]=impinvar(b,a,Fs);%衝激響應不變法
[H,W]=freqz(B,A);%數字濾波器系統函數
% [H,W]=freqs(b,a);%數字濾波器系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W*Fs/(2*pi);%將數字角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('衝激響應法設計數字濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
subplot(2,1,2);plot(f,pha);
title('衝激響應法設計數字濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');
衝激響應不變法設計數字低通濾波器效果

2.2.2 雙線性映射法

衝激響應不變法的幅頻特性存在混疊失真現象,這是因爲從S平面到Z平面的變換出現了多值對應,爲了克服多值對應帶來的混疊失真,提出了雙線性映射法。雙線性映射法先將整個S平面(負無窮到正無窮)壓縮到S1平面(-π/T,π/T),再將S1平面映射到Z平面。採用雙線性映射法雖然改善了混疊失真現象,但是又帶來了相位畸變失真,爲此,需要在在設計模擬濾波器前進行反畸變。最後,在模擬濾波器設計完成後使用雙線性映射法變爲數字濾波器系統函數的參數。代碼如下:

%反畸變部分
wp=2*pi*fp/Fs; ws=2*pi*fs/Fs; %轉換爲數字角頻率技術指標
Wp=(2*Fs)*tan(wp/2);Ws =(2*Fs)*tan(ws/2); %將數字技術指標的反畸變爲模擬指標

%雙線性設計部分
[B,A]=bilinear(b,a,Fs);%雙線性映射法
[H,W]=freqz(B,A);%數字濾波器系統函數

完整代碼如下

%通過模擬濾波器設計IIR數字濾波器
%原型:巴特沃斯模擬濾波器;變換方法:雙線性映射法
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)
%採樣頻率:Fs(單位Hz)

%技術指標要求設置,按自己需求更改即可
%fp=1000;fs=2000;%低通示例
fp=2000;fs=1000;%高通示例
%fp=[500,1200];fs=[300,1500];%帶通示例
%fp=[300,1500];fs=[500,1200];%帶阻示例
Rp=1;Rs=45; 
Fs=5000;%採樣頻率
filter_type=2;%1:低通,2:高通,3:帶通,4:帶阻

wp=2*pi*fp/Fs; ws=2*pi*fs/Fs; %轉換爲數字角頻率技術指標
Wp=(2*Fs)*tan(wp/2);Ws =(2*Fs)*tan(ws/2); %將數字技術指標的反畸變爲模擬指標
%濾波器的階數:N
%3dB衰減時的截止頻率:Wc(單位rad/s)
%b:系統函數的分子
%a:系統函數的分母
[N,Wc]=buttord(Wp,Ws,Rp,Rs,'s');%計算巴特沃斯模擬濾波器參數,‘s’表示Wp和Ws都是模擬角頻率
switch filter_type
    case 1
        [b,a]=butter(N,Wc,'low','s');%設計巴特沃斯低通濾波器
    case 2
        [b,a]=butter(N,Wc,'high','s');%設計巴特沃斯高通濾波器
    case 3
        [b,a]=butter(N,Wc,'bandpass','s');%設計巴特沃斯帶通濾波器
    case 4
        [b,a]=butter(N,Wc,'stop','s');%設計巴特沃斯帶阻濾波器
end
[B,A]=bilinear(b,a,Fs);%衝激響應不變法
[H,W]=freqz(B,A);%數字濾波器系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
f=W*Fs/(2*pi);%將數字角頻率轉爲Hz
subplot(2,1,1);plot(f,db);
title('雙線性映射法設計數字濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
subplot(2,1,2);plot(f,pha);
title('雙線性映射法設計數字濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');

 

雙線性不變法
雙線性映射法設計數字高通濾波器效果

2.3 直接設計數字濾波器

①可以直接使用設計模擬濾波器時的函數,只不過函數參數中不再有‘s’,相應的頻率參數也變爲歸一化頻率。

1、[N,Wc]=buttord(Wp,Ws,Rp,Rs);沒有參數‘s’時,表示生成巴特沃斯數字濾波器的參數,此時,Wp、Ws和Wc表示歸一化的頻率,1代表歸一化的奈奎斯特採樣頻率。例如通帶頻率50Hz,阻帶頻率60Hz,採樣頻率500Hz,此時Wp=50/500Hz,Ws=60/500Hz

2、[b,a] = butter(N,Wc);沒有參數‘s’時,返回具有歸一化截止頻率Wc的N階低通數字巴特沃斯濾波器的傳遞函數係數。

3、[H,W]=freqz(b,a);%數字濾波器系統函數

②藉助差分方程完成

                                                                             H(z)=\frac{b_{2}z^{-2}+b_{1}z^{-1}+b_{0}}{1-a_{1}z^{-1}-a_{2}z^{-2}}

                                                y(n)=a_{1}y(n-1)+a_{2}y(n-2)+b_{2}x(n-2)+b_{1}x(n-1)+b_{0}x(n)

Matlab程序如下所示:

%已知系統函數直接設計IIR數字濾波器
%直接設計數字濾波器
% a=
% b=
% x=
y(1)=x(1);
y(2)=(x(1)+x(2))/2;
for n=3:length(x)
    y(n)=b(0)*x(n)+b(1)*x(n-1)+b(2)*x(n-2)-a(1)*y(n-1)-a(2)*y(n-2);
end

3 FIR數字濾波器的設計方法

3.1 窗函數法

Matlab代碼設計如下:

%設計FIR數字低通濾波器
%通帶截止頻率:fp(單位Hz)
%通帶衰減:Rp(單位dB)
%阻帶截止頻率:fs(單位Hz)
%阻帶衰減:Rs(單位dB)
%採樣頻率:Fs(單位Hz)

%技術指標要求設置,按自己需求更改即可
%fp=1000;fs=2000;%低通示例
fp=2000;fs=1000;%高通示例
%fp=[500,1200];fs=[300,1500];%帶通示例
%fp=[300,1500];fs=[500,1200];%帶阻示例
Rp=1;Rs=45; 
Fs=5000;%採樣頻率
filter_type=2;%1:低通,2:高通,3:帶通,4:帶阻

wp=2*pi*fp/Fs; ws=2*pi*fs/Fs; %轉換爲數字角頻率指標
tr_width=abs(wp-ws);
P=2;%海明窗的窗寬係數爲2
N0=ceil(P*4*pi/tr_width);%計算加窗寬度N(取整數)
N=N0+mod(N0+1,2);%確保N爲奇數
m=(N-1)/2;%計算移位係數
wc=(wp+ws)/2;%截止頻率
n=(0:1:N-1);
window=(hamming(N))';
nm=n-m+eps;%避免除零
hd=(sin(pi*nm)-sin(wc*nm))./(pi*nm);
hn=hd.*window;
[H,W]=freqz(hn,1,100);
mag=abs(H);pha=angle(H);
db=20*log10((mag+eps)/max(mag));
subplot(2,1,1);plot(W*Fs/(2*pi),db);
title('窗函數設計FIR濾波器幅頻曲線');xlabel('頻率(Hz)');ylabel('幅度(dB)');
subplot(2,1,2);plot(W*Fs/(2*pi),pha);
title('窗函數設計FIR濾波器相頻曲線');xlabel('頻率(Hz)');ylabel('相位(rad)');

 

4 Matlab自動生成濾波器代碼工具

在Matlab命令窗口輸入fdatool即可打開Matlab自帶的濾波器代碼生成工具,其他更詳細的使用說明請見doc Using FDAtool

fdatool
圖4 Matlab自帶的濾波器代碼生成工具界面

設置好濾波器各項參數後,點擊設計界面下方的Design Filter按鈕即可。然後依次點擊File→Generate MATLAB Code→Filter Design Function,自動生成濾波器代碼,並保存爲.m腳本文件

圖中參數設置如下:

響應類型:低通濾波器

設計模式:IIR(以巴特沃斯濾波器爲原型)

濾波器階數:自動使用最小階數

採樣頻率:48000Hz

通帶頻率:9600Hz

阻帶頻率:12000Hz

通帶衰減:1dB

阻帶衰減:80dB

自動生成的Matlab代碼如下:

function Hd = fda_gencode
%FDA_GENCODE Returns a discrete-time filter object.

% MATLAB Code
% Generated by MATLAB(R) 8.6 and the Signal Processing Toolbox 7.1.
% Generated on: 05-Dec-2019 16:16:19

% Equiripple Lowpass filter designed using the FIRPM function.

% All frequency values are in Hz.
Fs = 48000;  % Sampling Frequency

Fpass = 9600;            % Passband Frequency
Fstop = 12000;           % Stopband Frequency
Dpass = 0.057501127785;  % Passband Ripple
Dstop = 0.0001;          % Stopband Attenuation
dens  = 20;              % Density Factor

% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);

% [EOF]

調用生成的濾波器代碼格式爲:

Hd = fda_gencode; %此處根據自己自動生成濾波器代碼時的命名調整函數名
[b,a]=tf(Hd);    %創建傳遞函數模型,轉換爲傳遞函數模型
%y=filter(b,a,x); %a,b爲系統函數的係數,x爲待濾波的信號,y爲輸出後的信號

%以下代碼用於查看濾波器幅頻、相頻特性曲線
[H,W]=freqz(b,a);%數字濾波器系統函數
mag=abs(H);%幅度
pha=angle(H);%相位
db=20*log10((mag+eps)/max(mag));%轉換爲分貝
subplot(2,1,1);plot(W,db);
title('數字濾波器幅頻曲線');xlabel('弧度(rad)');ylabel('幅度(dB)');
subplot(2,1,2);plot(W,pha);
title('數字濾波器相頻曲線');xlabel('弧度(rad)');ylabel('相位(rad)');

5 數字濾波器的使用

6 結語

無論是文字、圖像、音頻還是視頻等信息,濾波器在這些信息的處理中起到了基礎性的工作,DSP、FPGA等高端處理器中也經常使用數字濾波器算法,掌握濾波器的設計方法對於電子、通信、計算機領域的工作人員來說至關重要。本文僅僅總結了Matlab下最基本濾波器的設計方法,未來還會繼續總結最新的數字濾波器算法和移植,以此勉勵自己。

參考文獻:

[1] Matlab官網數字和模擬濾波器幫助網頁    https://ww2.mathworks.cn/help/signal/digital-and-analog-filters.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章