1. 程式人生 > >Matlab fdatool設計實現一維數字濾波器

Matlab fdatool設計實現一維數字濾波器

主旨

Matlab的fdatool生成的濾波器係數與濾波器傳輸函式的A/B引數的對應關係並不直觀,本文目的在於總結出濾波器係數到傳輸函式A/B引數的轉換方法和原理。

問題描述

fdatool是Matlab提供的一個互動式數字濾波器設計工具[1]. 這個工具可以根據使用者給定的濾波器型別、通帶阻帶引數等資訊設計濾波器,並將濾波器的各類響應曲線(幅頻響應、相頻響應、衝擊響應、延遲等)畫出來。

當得到響應符合預期的濾波器設計之後,下一步需要將濾波器引數匯出並代入實際運算。Matlab的一維數字濾波器計算函式為filter(無時延補償)或filtfilt(有時延補償),其需要的引數除了原始訊號外,還包括傳輸函式的A/B引數。其中A/B引數分別代表如下的濾波器傳輸函式表示式中數列A和數列B

H(z)=b(1)+b(2)z1+..b(nb+1)znba(1)+a(2)z1+..a(na+1)zna

FDATool生成的係數並不能直觀的對應於上述A/B引數。對於FIR濾波器,Export得到的是一個1*(N+1)的向量;對於IIR濾波器,export得到的是兩個矩陣,一個L*6, 另一個為(L+1)*1. 如何將上述引數轉換為A/B引數就是本文要討論和解決的問題

FIR濾波器

FIR濾波器基本結構如下圖所示[3]

FIR Filter.svg
By BlanchardJ - Own work, Public Domain, Link

上圖中不存在從y(n)的反饋,所以其傳輸函式可以簡化為

H(z)=b(1)+b(2)z1+..b(nb+1)znb

因此,FdaTool生成的1*(N+1)向量可以對應於上述B引數,而A引數只要輸入1*1向量,且a(1) = 1即可。Matlab參考程式碼

b = Num; %Num為fdatool輸出的向量
a =  [1];
filteredData = filtfilt(b, a, x); %x為濾波器輸入訊號

IIR濾波器

IIR濾波器結構如下圖所示[4]

這裡就存在反饋,因此引數A不再是單一元素。針對IIR濾波器,Fdatool輸出的sos向量(L*6)是以second order section representation表示的濾波器係數,而g向量((L+1)*1)是增益向量。

所謂second order section,指的是以一系列級聯的的biquadratric section表示的IIR濾波器[5]

A common strategy is to realize a higher-order (greater than 2) digital filter as a cascaded series of second-order “biquadratric” (or “biquad”) sections[6] (see digital biquad filter).

而biquadratric section本身是一種二階遞迴線性濾波器[6],其傳輸方程如下

H(z)=b(1)+b(2)z1+b(3)z21+a(2)z1+a(2)z2

整個IIR濾波器的傳輸函式可以寫為如下形式,這裡g(L+1)=1,因此沒有寫入下面的公式

H(z)=i=1Lg(i)b(i,1)+b(i,2)z1+b(i,3)z21+a(i,2)z1+a(i,3)z2

如何將上述形式的sos向量和g向量轉化為濾波器傳輸函式的一般形式?Matlab提供了sos2tf功能。樣例程式碼如下

[b, a] = sos2tf(SOS,G);%將sos向量和g向量轉換為A/B引數
filteredData = filtfilt(b, a, x); %x為濾波器輸入訊號

參考資料