Matlab fdatool設計實現一維數字濾波器
主旨
Matlab的fdatool生成的濾波器係數與濾波器傳輸函式的A/B引數的對應關係並不直觀,本文目的在於總結出濾波器係數到傳輸函式A/B引數的轉換方法和原理。
問題描述
fdatool是Matlab提供的一個互動式數字濾波器設計工具[1]. 這個工具可以根據使用者給定的濾波器型別、通帶阻帶引數等資訊設計濾波器,並將濾波器的各類響應曲線(幅頻響應、相頻響應、衝擊響應、延遲等)畫出來。
當得到響應符合預期的濾波器設計之後,下一步需要將濾波器引數匯出並代入實際運算。Matlab的一維數字濾波器計算函式為filter(無時延補償)或filtfilt(有時延補償),其需要的引數除了原始訊號外,還包括傳輸函式的A/B引數。其中A/B引數分別代表如下的濾波器傳輸函式表示式中數列A和數列B
FDATool生成的係數並不能直觀的對應於上述A/B引數。對於FIR濾波器,Export得到的是一個1*(N+1)的向量;對於IIR濾波器,export得到的是兩個矩陣,一個L*6, 另一個為(L+1)*1. 如何將上述引數轉換為A/B引數就是本文要討論和解決的問題
FIR濾波器
FIR濾波器基本結構如下圖所示[3]
By BlanchardJ - Own work, Public Domain, Link
上圖中不存在從
因此,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],其傳輸方程如下
整個IIR濾波器的傳輸函式可以寫為如下形式,這裡g(L+1)=1,因此沒有寫入下面的公式
如何將上述形式的sos向量和g向量轉化為濾波器傳輸函式的一般形式?Matlab提供了sos2tf功能。樣例程式碼如下
[b, a] = sos2tf(SOS,G);%將sos向量和g向量轉換為A/B引數
filteredData = filtfilt(b, a, x); %x為濾波器輸入訊號