生活随笔
收集整理的這篇文章主要介紹了
使用FFT进行快速FIR滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘自<Understanding Digital Signal Processing>第三版,13.10 Fast FIR Filtering Using the FFT一節
基于的理論:頻域上的乘積等效于時域上的卷積。
基本的計算流程,如下圖所示。
將輸入信號x(n)x(n)x(n)和濾波器參數h(k)h(k)h(k)分別進行FFT,得到X(m)X(m)X(m)和H(m)H(m)H(m),在頻域上進行乘積,然后,進行IFFT。
對于Q?tapQ-tapQ?tap的FIR濾波器,其標準的卷積方程為
y(n)=∑k=0Q?1h(k)x(n?k)=h(k)?x(n)y(n)=\sum ^{Q-1} _{k=0} {h(k)x(n-k)}=h(k)*x(n) y(n)=k=0∑Q?1?h(k)x(n?k)=h(k)?x(n)
假設h(k)h(k)h(k)的長度為QQQ,x(n)x(n)x(n)的長度為PPP,則最終輸出的y(n)y(n)y(n)的長度為L=Q+P?1L=Q+P-1L=Q+P?1.
為了使快速卷積技術能得到有效的結果,前向和逆FFT的尺寸必須等于或大于LLL,因此,N?pointN-pointN?point的FFT尺寸為N≥LN\ge LN≥L,并對h(k)h(k)h(k)和x(n)x(n)x(n)進行zero?padzero-padzero?pad,使其長度等于NNN。所需要的輸出y(n)y(n)y(n)為逆FFT的前LLL個樣本的實數部分。關于濾波器參數的FFT只需計算一次并存儲下來即可。
當輸出序列長度太大,必須進行分段處理時,有兩種處理方法:overlap?and?saveoverlap-and-saveoverlap?and?save和overlap?and?addoverlap-and-addoverlap?and?add。
Overlap-and-save
具體流程,如下圖所示。
對于給定的FIR濾波器的脈沖響應h(k)h(k)h(k)的長度為QQQ,輸入序列x(n)x(n)x(n)的長度為PPP,具體步驟:
選擇FFT的尺寸為NNN,其中NNN為2的指數,約等于4倍QQQ;在h(k)h(k)h(k)的末端增加(N?Q)(N-Q)(N?Q)個零值樣本,進行N?pointN-pointN?point的FFT,生成復序列H(m)H(m)H(m);計算整數M,M=N?(Q?1)M=N-(Q-1)M=N?(Q?1);在x(n)x(n)x(n)的前MMM樣本之前插入(Q?1)(Q-1)(Q?1)個零值樣本,創建N?pointN-pointN?point的FFT的輸入序列x1(n)x_1(n)x1?(n);對x1(n)x_1(n)x1?(n)進行N?pointN-pointN?point的FFT計算,并乘以H(m)H(m)H(m),然后,對乘積進行N?pointN-pointN?point的逆FFT。去掉逆FFT結果的前(Q?1)(Q-1)(Q?1)個樣本,生成M?pointM-pointM?point的輸出y1(n)y_1(n)y1?(n);將x1(n)x_1(n)x1?(n)的前(Q?1)(Q-1)(Q?1)個零值樣本增加到第二個原始長度為M的x(n)x(n)x(n)的開頭部分,創建第二個N?pointN-pointN?point的FFT輸入序列x2(n)x_2(n)x2?(n);對x2(n)x_2(n)x2?(n)進行N?pointN-pointN?point的FFT計算,并乘以H(m)H(m)H(m),然后,進行逆FFT,去除前(Q?1)(Q-1)(Q?1)個樣本,生成第二個M點的輸出數據y2(n)y_2(n)y2?(n);重復步驟6-7,直至處理完整個輸入序列。將生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1?(n),y2?(n),y3?(n),....進行串聯合并,生成最終的線性卷積濾波器的輸出序列y(n)y(n)y(n)。可以試驗不同的NNN值,看是否存在一個最優的NNN使得你的硬件和軟件實現的計算載荷最小。不過,在任何情況下,NNN必須不小于(M+Q?1)(M+Q-1)(M+Q?1)。
Overlap-and-add
具體流程,如下圖所示。
對于這種方法,輸入序列x(n)x(n)x(n)被分段成長度為MMM的數據片段,數據的overlap發生在逆FFT計算。對于給定的FIR濾波器的脈沖響應h(k)h(k)h(k)的長度為QQQ,輸入序列x(n)x(n)x(n)的長度為PPP,具體步驟:
選擇FFT尺寸為NNN,其中NNN為2的指數,約等于2倍的Q;在h(k)h(k)h(k)的末端增加(N?Q)(N-Q)(N?Q)個零值樣本,進行N?pointN-pointN?point的FFT,生成復序列H(m)H(m)H(m);計算整數M,M=N?(Q?1)M=N-(Q-1)M=N?(Q?1);在原始序列x1(n)x_1(n)x1?(n)的前MMM樣本末端增加(Q?1)(Q-1)(Q?1)個零值樣本,創建N?pointN-pointN?point的FFT的輸入序列x1(n)x_1(n)x1?(n);對x1(n)x_1(n)x1?(n)進行N?pointN-pointN?point的FFT計算,并乘以H(m)H(m)H(m),然后,對乘積進行N?pointN-pointN?point的逆FFT。并保留前MMM個樣本,生成MMM樣本的輸出數據y1(n)y_1(n)y1?(n);在第二個原始序列x2(n)x_2(n)x2?(n)的前MMM樣本末端增加(Q?1)(Q-1)(Q?1)個零值樣本,創建N?pointN-pointN?point的FFT的輸入序列x2(n)x_2(n)x2?(n);對第二個N?pointN-pointN?point的輸入序列進行FFT計算,并乘以H(m)H(m)H(m),然后,對乘積進行N?pointN-pointN?point的逆FFT。將上一步的逆FFT的最后Q?1Q-1Q?1個樣本增加到當前逆FFT序列的開頭的Q?1Q-1Q?1個樣本上。保留Q?1Q-1Q?1個樣本相加過程的結果序列中的開頭的MMM個樣本作為輸出數據y2(n)y_2(n)y2?(n);重復步驟6-7,直至處理完整個數據序列。將生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1?(n),y2?(n),y3?(n),....進行串聯合并,生成最終的線性卷積濾波器的輸出序列y(n)y(n)y(n)。可以試驗不同的NNN值,看是否存在一個最優的NNN使得你的硬件和軟件實現的計算載荷最小。不過,在任何情況下,NNN必須不小于$
總結
以上是生活随笔為你收集整理的使用FFT进行快速FIR滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。