使用FFT进行卷积相比于实空间卷积有哪些缺点?

26

我知道使用FFT进行卷积比在实数空间中进行卷积具有更低的计算复杂度。但是FFT卷积有哪些缺点呢?

卷积核大小是否总是要与图像大小匹配,或者是否有一些函数可以处理这个问题,例如在Python的NumPy和SciPy软件包中?还有抗混叠效应方面的考虑吗?


4
请注意,频域卷积仅在核的大小超过一定阈值时才更加有效。对于相对较小的核,直接卷积更为高效。 - Paul R
2个回答

32

FFT卷积基于卷积定理,该定理指出,给定两个函数fg,如果Fd()Fi()表示直接和反向傅里叶变换,*表示卷积和乘法,则有:

f*g = Fi(Fd(d).Fd(g))

要将此应用于信号f和内核g,有一些需要注意的事项:

  • 乘法步骤需要fg具有相同的大小才能进行,因此您需要对内核进行零填充(如果内核比输入更长,则填充输入)。
  • 在进行DFT(FFT所做的)时,函数的结果频域表示是周期性的。这意味着,在执行卷积时,默认情况下,内核会绕过边缘。如果您不希望出现这种情况,则必须添加额外的零填充,其大小等于内核的大小。
  • 大多数(全部?)FFT包仅适用于没有任何大质因子的大小。将信号和内核大小舍入到下一个2的幂是一种常见的做法,可以显着提高性能。

如果您的信号和内核大小分别为f_lg_l,则直接在时间域中执行卷积需要g_l * (f_l - g_l + 1)次乘法和(g_l - 1) * (f_l - g_l + 1)次加法。

对于FFT方法,您需要对至少f_l + g_l进行3次FFT,以及f_l + g_l次乘法。

对于大型fg,FFT的复杂度显然优于其n*log(n)计算。对于小内核,直接的方法可能更快。

scipy.signal为您提供了convolvefftconvolve两种方法供您使用。并且fftconvolve会透明地为您处理上述所有填充。


大多数(全部?)FFT包只能在没有任何大质因数的情况下有效地处理大小。请注意,这里仅涉及速度问题,计算本身并不是问题(至少在numpy和scipy中)。 - J. Martinot-Lagarde
确实,我在我的答案中添加了一条注释。典型的FFT算法将大小为N = a*b的DFT递归地分解为大小为ba个FFT。如果N是质数,则需要更复杂的算法来加速计算。在我的PC上:%timeit numpy.fft.fft(np.random.rand(1024)); 10000 loops, best of 3: 36.2 us per loop; %timeit numpy.fft.fft(np.random.rand(1021)); 100 loops, best of 3: 2.15 ms per loop,减速了100倍,这似乎表明直接计算具有质数大小的DFT,没有加速。 - Jaime
1
看起来FFTW有加速功能:“具有小质因数的尺寸最佳,但即使对于质数尺寸,FFTW也使用O(N log N)算法。” 它还支持多处理器。 可以使用pyfftw从python中使用它。 - J. Martinot-Lagarde
请注意,在使用“重叠相加”或“重叠保存”方法将输入信号分成多个部分进行处理时,内核不必像信号一样填充为相同的大小。 - xioxox

19

虽然快速卷积的“大O”复杂度优于直接形式卷积,但是存在一些缺点或注意事项。我曾经在一篇文章中对此进行过思考。

  1. 更好的“大O”复杂度并不总是更好的。对于小于某个大小的滤波器,直接形式卷积可能比使用FFT更快。确切的大小取决于所用平台和实现。交叉点通常在10-40系数范围内。

  2. 延迟。快速卷积本质上是一种块状算法。在转换之前排队处理数百或数千个样本可能对某些实时应用程序不可接受。

  3. 实现复杂度。直接形式在内存、代码空间以及作者/维护者的理论背景方面更简单。

  4. 在固定点DSP平台(而非通用CPU)上:固定点FFT的有限字长考虑使得大型固定点FFT几乎无用。在大小谱域的另一个极端,这些芯片具有专门设计用于执行直接形式FIR计算的MAC指令,增加了O(N ^ 2)直接形式比O(NlogN)更快的范围。这些因素往往会创建一个有限的“甜点”,在该点上固定点FFT对于快速卷积是有用的。


我对第四点非常感兴趣。您能否详细说明“固定点FFT的有限字长考虑使得大型固定点FFT几乎无用”是什么意思? - Mattia Surricchio
在每个log2(N)的FFT阶段中,固定点和可以被缩小或风险饱和。任何一种方法都有失去信息的风险--分别是低或高幅度正弦波。一些库在阶段之间交替使用方法来规避损失。无论如何,信息丢失随着更多阶段(即更大的FFT)而增加。 - Mark Borgerding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接