如何使用DFT实现卷积?

时间:2016-11-18 09:58:23

标签: arrays signal-processing fft convolution

因此,根据我的理解,可以通过离散傅立叶变换执行卷积。从我阅读的过程来看,简单地涉及多个内核和输入的DFT。但是,我无法理解如何实现光谱的实际乘法,因为两个不同大小的阵列的DFT会有所不同。

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

要获得arrkern的卷积,我执行:

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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