如何使用 DFT 实现卷积?

How to implement convolutions using DFT?

所以根据我的理解,可以通过离散傅里叶变换执行卷积。从我读到的过程来看,这个过程只涉及将内核和输入的 DFT 相乘。但是,我不知道如何实现光谱的实际乘法,因为两个不同大小的阵列的 DFT 会有所不同。

所以在伪代码中假设我有一个长度为 1024 的数组 arr 和长度为 8 的内核 kern

为了获得 arrkern 的卷积,我执行:

IDFT(DFT(arr)*DFT(kern))

但是DFT(arr)是一个长度为1024的数组,DFT(kern)是一个长度为8的数组,那么它们是如何相乘的呢?

要使用 DFT 进行卷积,DFT 的大小必须至少与卷积结果一样大——您的内核大小加上您的输入大小。您将它们都用零填充到这个大小,然后对 DFT 和 IDFT 使用相同的大小。

请注意,如果您的内核比您的输入小得多,这 根本没有效率。在这种(通常)情况下,您可以使用 overlap-add 或 overlap-save 方法将输入分成与内核大小大致相同的块。

参见,例如:https://www.youtube.com/watch?v=FPzZj30hPY4

仍然对于非常小的内核来说效率不高。如果你的内核真的只有 8 个样本长,那么你不应该为这些东西烦恼。简单的实现会更快。