与实空间卷积相比,FFT 卷积的缺点是啥?

Posted

技术标签:

【中文标题】与实空间卷积相比,FFT 卷积的缺点是啥?【英文标题】:What are the downsides of convolution by FFT compared to realspace convolution?与实空间卷积相比,FFT 卷积的缺点是什么? 【发布时间】:2013-08-25 09:31:23 【问题描述】:

所以我知道 FFT 卷积的计算复杂度低于实际空间中的卷积。但是 FFT 卷积的缺点是什么?

内核大小是否总是必须与图像大小相匹配,或者是否有函数可以解决这个问题,例如在 pythons numpy 和 scipy 包中?那么抗锯齿效果呢?

【问题讨论】:

请注意,只有当内核超过一定大小时,频域中的卷积才会更有效。对于相对较小的内核,直接卷积更有效。 【参考方案1】:

FFT 卷积基于convolution theorem,它指出给定两个函数fg,如果Fd()Fi() 表示直接和逆傅里叶变换,* 和@987654330 @卷积和乘法,然后:

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 方法,您必须进行 3 次大小至少为 f_l + g_l 的 FFT,以及 f_l + g_l 乘法。

对于fg 的大尺寸,FFT 的n*log(n) 复杂性显然更胜一筹。对于小内核,直接方法可能更快。

scipy.signalconvolvefftconvolve 两种方法供您使用。 fftconvolve 为您透明地处理上述所有填充。

【讨论】:

“大多数(全部?)FFT 包仅适用于没有任何大素因数的尺寸。” : 准确地说你只是在谈论速度,计算本身没有问题(至少在 numpy 和 scipy 中)。 是的,在我的回答中添加了注释。典型的 FFT 算法将大小为 N = a*b 的 DFT 递归地分解为大小为 ba FFT。如果N 是主要的,你需要more sophisticated algorithms 来加快速度。在我的 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,减速 x100,这似乎表明直接计算素数大小的 DFT,没有加速。 看起来 FFTW 有加速:“小素数因子的大小最好,但 FFTW 使用 O(N log N) 算法,即使素数大小也是如此。”。也支持多处理。它可以从 python 和 pyfftw 使用。 请注意,如果使用“overlap-add”或“overlap-save”方法将输入信号拆分为多件待处理。【参考方案2】:

虽然快速卷积比直接形式卷积具有更好的“大 O”复杂度;有一些缺点或警告。我为an article 思考过这个话题,我不久前写过。

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

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

    实现复杂性。直接形式在内存、代码空间和编写者/维护者的理论背景方面更简单。

    在定点 DSP 平台(非通用 CPU)上:定点 FFT 的有限字长考虑使得大型定点 FFT 几乎无用。在尺寸范围的另一端,这些芯片具有专门的 MAC 指令,这些指令经过精心设计,可用于执行直接形式的 FIR 计算,从而增加了 te O(N^2) 直接形式比 O(NlogN) 更快的范围。这些因素往往会创建一个有限的“最佳位置”,在该“最佳位置”中,定点 FFT 可用于快速卷积。

【讨论】:

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

以上是关于与实空间卷积相比,FFT 卷积的缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python 中最快的 2D 卷积或图像过滤器

sobel边缘检测优缺点与canny算子的优缺点?

与 Qwt 相比,QCustomPlot 的优点/缺点是啥?

与其他格式相比,镶木地板格式的优缺点是啥?

与 Spring Security/Apache Shiro 相比,JAAS 的缺点是啥?

与 Electron 相比,Chrome 应用程序的优缺点是啥?