1. 程式人生 > 其它 >【STM32H7的DSP教程】第41章 FIR濾波器的群延遲(重要)

【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