重叠-相加之折积法
重叠-相加之折积法 ( Overlap-add method ) 是一种区块折积 ( block convolution, sectioned convolution ),可以有效的计算一个很长的信号 x[n] 和一个 FIR 滤波器 h[n] 的离散折积。
其中 h[m] 在 [1, M] 之外为零。
重叠-相加之折积法算出重叠的输出区块;另一种区块折积的作法,重叠-储存之折积法则是将输入区块重叠。
算法
[编辑]概念上,这个做法是选用一个较短的适当长度 L 来切割 x[n] ,计算 x[n] 的子数列滤波后的结果 yk[n] ,然后连接起来成为 y[n] 。并考虑到一个长度 和长度 的有限长度离散信号,做折积之后会成为长度 的信号。
则
其中 在 [1, L+M-1] 之外为零。 每个 yk[n] 长度 ,以间隔 位移后相加,所以输出是由互相重叠的区块相加而成,因此称为重叠-相加之折积法。
尽管一时看不出切割成区块的好处为何,但考虑到对任何 以上每段的折积都等价于 和 做 点圆周折积 ,不够的部分补上零 (zero-padding)。如此一来因为圆周折积可以借由圆周折积定理
转换成三次 点快速傅立叶变换和 次乘法,使原本每段 O(N2) 的运算量减少至 O(N logN),速度大幅增加。
Algorithm (OA for linear convolution) Evaluate the best value of N and L H = FFT(h,N) (zero-padded FFT) i = 1 while i <= Nx il = min(i+L-1,Nx) yt = IFFT( FFT(x(i:il),N) .* H, N) k = min(i+N-1,Nx) y(i:k) = y(i:k) + yt (add the overlapped output blocks) 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 [2008-06-23], (原始内容存档于2019-06-30)