【STM32H7的DSP教程】第41章 FIR濾波器的群延遲(重要)
完整版教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547
第41章 FIR濾波器的群延遲(重要)
本章節為大家介紹FIR濾波器的群延遲問題。
41.1 FIR濾波器介紹
41.2 總結
41.1 FIR濾波後的群延遲
波形經過FIR濾波器後,輸出的波形會有一定的延遲。對於線性相位的FIR,這個群延遲就是一個常數。但是實際應用中這個群延遲是多少呢? 關於群延遲的數值,filterDesigner工具箱會根據使用者的配置計算好。
比如前面章節設計的28階FIR高通,低通,帶通和帶阻濾波器的群延遲就是14,反映在實際的取樣值上就是濾波後輸出資料的第15個才是實際濾波後的波形資料起始點。
下面是群延遲取樣點的位置:
細心的讀者可能發現全面做低通,高通,帶通和帶阻濾波後,輸出的波形前面幾個點感覺有問題,其實就是群延遲造成的。
為了更好的說明這個問題,下面再使用Matlab舉一個低通和一個高通濾波的例子:訊號由50Hz正弦波和200Hz正弦波組成,取樣率1Kbps,截止頻率125Hz,取樣320個數據,採用函式fir1進行設計,濾波器階數設定為28。下面是低通濾波器的Matlab程式碼,將原始訊號從第一個點開始顯示,而濾波後的訊號從群延遲後的第15個點開始顯示:
fs=1000; %設定取樣頻率 1K N=320; %取樣點數 n=0:N-1; t=n/fs; %時間序列 f=n*fs/N; %頻率序列 x1=sin(2*pi*50*t); x2=sin(2*pi*200*t); x=sin(2*pi*50*t)+sin(2*pi*200*t); %50Hz和200Hz正弦波混合 plot(n, x1, 'b'); %繪製訊號x的波形 xlabel('時間'); ylabel('幅值'); title('原始訊號和濾波後訊號'); hold on; b=fir1(28, 125/500); %獲得濾波器係數,截止頻率125Hz. y=filter(b, 1, x); plot(n(1:305), y(15:319), 'r'); legend('原始訊號','濾波後訊號'); grid on;
Matlab的執行結果如下:
可以看出,顯示波形基本重合,這個說明14個取樣點的群延遲是正確的。下面同樣使用上面的那個例子實現一個高通濾波器,截止頻率是125Hz,階數同樣設定為28,將原始訊號從第一個點開始顯示,而濾波後的訊號從群延遲後的第15個點開始顯示,Matlab執行程式碼如下:
fs=1000; %設定取樣頻率 1K N=320; %取樣點數 n=0:N-1; t=n/fs; %時間序列 f=n*fs/N; %頻率序列 x1=sin(2*pi*50*t); x2=sin(2*pi*200*t); x=sin(2*pi*50*t)+sin(2*pi*200*t); %50Hz和200Hz正弦波混合 plot(n, x2, 'b'); %繪製訊號x的波形 xlabel('時間'); ylabel('幅值'); title('原始訊號和濾波後訊號'); hold on; b=fir1(28, 125/500, 'high'); %獲得濾波器係數,截止頻率125Hz. y=filter(b, 1, x); plot(n(1:305), y(15:319), 'r'); legend('原始訊號','濾波後訊號'); grid on;
Matlab執行結果如下:
可以看出,顯示波形基本重合,這個說明14個取樣點的群延遲也是是正確的。大家在使用FIR濾波器的時候一定要注意這個問題。
41.2 總結
本章節介紹的知識點比較重要,首次使用FIR容易在這個地方不理解。
微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com