n倍FFT卷积和圆形重叠

时间:2012-02-14 17:08:38

标签: python fft convolution

问题描述

我使用卷积定理有效地计算卷积。假设有两个实际信号s1s2,每个信号的长度为N。然后我可以从

获得卷积
import numpy as np
import numpy.fft as fft

size = len(s1)
fft_size = int(2 ** np.ceil(np.log2(2 * size - 1))) #The size for the FFT algorithm

S1 = fft.rfft(s1, fft_size) #Take FTs
S2 = fft.rfft(s2, fft_size)

convolution = fft.irfft(S1 * S2) #Take IFT

但是,如果我有k个信号,则fft_size必须修改为

fft_size = int(2 ** np.ceil(np.log2(k * size - 1)))

以避免圆形重叠。

不幸的是,我不知道k先验。一种选择是选择最大值k_max,但如果不是绝对必要的话,我宁愿不必使用大量内存,而且每次k更改时我宁愿不再评估FT。

问题

是否可以执行以下某项操作

  • 对傅立叶空间中的k=1和"零点填充信号的FFT"必要时?
  • 防止在FFT中循环包装?

1 个答案:

答案 0 :(得分:1)

  1. 频域中的零填充是可能的,但需要比在时域中进行更多的计算工作(触发器)。 IFFT,zeropad和re-FFT可能会更快地为每个额外的快速卷积创造“空间”。

  2. 完整卷积的较长结果必须在某处,所以不,在使用FFT时不可能阻止循环卷积。即使零填充也不会阻止圆形重叠的计算,它只是确保结果中的重叠相当于添加零。