14 用DFT計算線性卷積


用DFT計算線性卷積

兩有限長序列之間的卷積

我們知道,兩有限長序列之間的卷積可以用圓周卷積代替,假設兩有限長序列的長度分別為\(M\)\(N\),那么卷積后的長度為\(L=M+N-1\),那么用圓周卷積計算線性卷積的具體過程為:

  1. 首先將兩序列在尾部補零,延拓成長度為L=M+N-1的序列
  2. 將兩序列進行圓周卷積,卷積后的結果即為線性卷積的結果

  而圓周卷積的實現可以通過下圖實現

現討論\(X[k]\)\(IDFT\)使用\(DFT\)實現

\[x[n]=\frac{1}{N}\sum_{n=0}^{N-1}X[k]W_N^{-kn}=\frac{1}{N}(\sum_{n=0}^{N-1}X^{*}[k]W_N^{kn})^{*}\rightarrow \frac{1}{N}(DFT\{X^{*}[k]\})^{*} \]

上圖可以改進為

所以線性卷積可以完全使用\(DFT\)實現,而\(DFT\)可以使用其快速算法\(FFT​\)大大降低計算量。

有限長序列與無限長序列卷積

或者說有限長序列與另一長度遠大於其長度的序列進行卷積,如果按照上面直接用\(DFT\)計算的話,有兩個問題。

  1. 必須知道無限長序列的全部元素,才能進行計算
  2. 用DFT計算卷積可能還不如直接進行卷積運算來得快

為解決上述的問題,可以將無限長序列划分為短序列,將短序列與有限長序列進行卷積,然后對結果進行處理,主要由兩種方法:重疊相加法和重疊保留法。

重疊相加法

假設有限長序列\(h[n]\)的長度為\(M\),無限長序列\(x[n]\)將其以長度\(N\)進行分割,則

\[x[n]=\sum_{m=-\infty}^{\infty}x_m[n-mN] \]

其中

\[x_m[n]=\begin{cases} x[n+mN], &0 \leq n \leq N-1\\ 0, &其他 \end{cases} \]

\(x_m[n]\)表示將划分的第\(m\)段的起點移到原點。如下

則卷積

\[\begin{aligned} y[n]=h[n]*x[n]&=\sum_{l=-\infty}^{\infty}h[l]x[n-l]\\ &=\sum_{l=-\infty}^{\infty}h[l]\sum_{m=-\infty}^{\infty}x_m[n-l-mN]\\ &=\sum_{m=-\infty}^{\infty}\sum_{l=-\infty}^{\infty}h[l]x_m[n-l-mN]\\ &=\sum_{m=-\infty}^{\infty}h[n]*x_m[n-mN] \end{aligned} \]

\(y_m[n]=h[n]*x_m[n]\),則上式可寫為

\[y[n]=\sum_{m=-\infty}^{\infty}y_m[n-mN] \]

該式表示卷積結果等於\(h[n]\)\(x_m[n]\)卷積,然后將這些卷積結果移位相加。

可知\(mN\backsim mN+M-2\)\(M-1\)點是重疊的,這些點要加起來,所以具體算法是:將\(x[n]\)\(N\)為長度划分為若干組\(x_m[n]\),將這些組分別與\(h[n]\)進行卷積得到\(y_m[n]\),然后將這些卷積結果進行移位,重疊部分要相加,這就是重疊相加法。

上述提到的\(x_m[n]\)\(h[n]\)的卷積,均可使用上面提到的\(DFT\)實現。

重疊保留法

同樣將\(x[n]\)以長度\(N\)進行划分,一般取\(N>M\),這時以\(N\)點進行圓周卷積。實際卷積的長度\(l=N+M-1\),由圓周卷積與線性卷積的關系,知圓周卷積的后\(2N-l=N-M+1\)個點與線性卷積的結果是一致的。

\[x_m[n]=\begin{cases}x[n+mL], &0 \leq n \leq N-1 \\ 0, &其他\end{cases} \]

\(x_m[n]\)\(h[n]\)進行\(N\)點圓周卷積得到\(y_m[n]\),只取后\(N+M-1\)個點,其余重疊的前\(M-1\)個點舍棄(保留)。然后進行移位相加,得到的結果就是進行線性卷積的結果。

由上圖知,要使得到的結果表示\(y[n]\),應使得\(L-M-2=N-2+1 \Rightarrow L=N-M+1\)

同理上面提到的圓周卷積均可用\(DFT\)進行實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM