重疊-儲存之摺積法
重疊-儲存之摺積法 ( Overlap-save method, Overlap-discard method ) 是一種區塊摺積 ( block convolution, sectioned convolution ),可以有效的計算一個很長的信號 x[n] 和一個 FIR 濾波器 h[n] 的離散摺積。
其中 h[m] 在 [1, M] 之外為零。
與重疊-相加之摺積法不同之處在於,重疊-儲存之摺積法所算出的輸出區塊並不重疊 (因此計算上少了將輸出區塊相加所需的加法),而是每次用的輸入區塊有所重疊。因此實作時每次讀取輸入後需將和下一個輸入重疊的部分儲存起來,作為下一輸入區塊的開頭部份,因此稱為重疊-儲存之摺積法。另外重疊-儲存之摺積法也不需補零。
目录 |
算法 [编辑]
概念上,這個做法是選用一個較短的適當長度 L 來切割 y[n] ,則因為 h[n] 是有限長度,因此在某一區塊內的 y[n] 也只被有限長的 x[n] 區塊(會比 y[n] 分割成的區塊長一點)所決定。因此只要選擇有影響的輸入區塊和 h[n] 摺積,再選擇結果中適當的部分即可得到正確的輸出區塊。
則對於在
內的 n , 輸出 y[n] 可寫成
所以只需計算 n 在
中的 yk[n + M - kL] ,亦即 n 在
的 yk[n] 部份即可。因此每一段輸出區塊 yk[n] 的前 M-1 點可丟棄(discard)。
儘管一時看不出切割成區塊的好處為何,但將 xk[n] 做
的週期延伸,
則
和
這兩個摺積在
的部份相等。所以可以將線性摺積改以
點圓周摺積計算,結果的
部分作為輸出 y[n] 在
的部份。由於每段 xk[n] 原本就有
長,所以選擇
的話輸入 x[n] 就不需補零。 改以圓周摺積計算後即可藉圓周摺積定理
轉換成三次
點快速傅立葉變換和
次乘法,使原本每段 O(N2) 的運算量減少至 O(N logN),速度大幅增加。
準程式碼 [编辑]
(Overlap-save algorithm for linear convolution)
H = FFT(h,N)
i = 1
while i <= Nx
il = min(i+N-1,Nx)
yt = IFFT( FFT(x(i:il),N) * H, N)
y(i : i+N-L-1) = yt(1+L : N)
i = i+L
end
區塊長度的選擇 [编辑]
當 x[n] 的長度 N' 和 h[n] 的長度 M 相差太大時(例如 M < log2N' ),直接摺積(不透過圓周摺積和 FFT )反而最快。而當 N' 和 M 差不多在同一個數量級時,不用分割,也就是只有一塊長度 L = N' 的區塊去做 FFT 即可。而當 N' 比 M 大了不少,卻沒大太多時,區塊長度 L 就需要選擇。除了與 N' 和 M 相關以外,也要考慮當兩者相除有餘數時,剩下一小段的輸入可能會造成浪費。
相關條目 [编辑]
參考文獻 [编辑]
- Rabiner, Lawrence R.; Gold, Bernard. Theory and application of digital signal processing. Englewood Cliffs, N.J.: Prentice-Hall. 1975: pp 65–67. ISBN 0-13-914101-4.
- Helms, H., Fast Fourier transform method of computing difference equations and simulating filters, IEEE Transactions on Audio and Electroacoustics. 1967, 15(2): 85-90
外部連結 [编辑]
- DSP class Fall 2005 Lecture08 at The University of Texas at Arlington]
![\begin{align}
y[n] = x[n] \star h[n] \ \stackrel{\mathrm{def}}{=} \ \sum_{m=-\infty}^{\infty} h[m] \cdot x[n-m]
= \sum_{m=1}^{M} h[m] \cdot x[n-m]
\end{align}](http://upload.wikimedia.org/math/d/0/d/d0db5e9b1108479757c74f281b1df46b.png)
![x_k[n] \ \stackrel{\mathrm{def}}{=}
\begin{cases}
x[n+kL-M] & 1 \le n \le L+M-1\\
0 & \textrm{otherwise}.
\end{cases}](http://upload.wikimedia.org/math/e/d/c/edc55c646381fcf05a1f0589114c6f2a.png)
![y_k[n] \ \stackrel{\mathrm{def}}{=} \ x_k[n] \star h[n]\,](http://upload.wikimedia.org/math/f/a/a/faa1193d56aac1989e2d6bd2c4d949be.png)
![\begin{align}
y[n] = \sum_{m=1}^{M} h[m] \cdot x[n-m] = \sum_{m=1}^{M} h[m] \cdot x_k[n+M-kL-m]
&= x_k[n+M-kL] \star h[n] \\
&\stackrel{\mathrm{def}}{=} \ y_k[n+M-kL].
\end{align}](http://upload.wikimedia.org/math/a/f/a/afa97735ec896ad00c097f292c6fff2b.png)
![x_{k,N}[n] \ \stackrel{\mathrm{def}}{=} \ \sum_{k=-\infty}^{\infty} x_k[n - kN],](http://upload.wikimedia.org/math/6/2/3/6230b72dfbb5c1b40d4d359e7ebdf4fc.png)
![y_k[n] = \textrm{IFFT}\left(\textrm{FFT}\left(x_k[n]\right)\cdot\textrm{FFT}\left(h[n]\right)\right)](http://upload.wikimedia.org/math/d/3/0/d3021081f6ca5241ce4df6e288fb74c5.png)