Arrays 如何使用DFT实现卷积?

Arrays 如何使用DFT实现卷积?,arrays,signal-processing,fft,convolution,Arrays,Signal Processing,Fft,Convolution,根据我的理解,通过离散傅里叶变换进行卷积是可能的。从我所读到的内容来看,这个过程只涉及到内核和输入的DFT的相互转换。然而,我不知道如何实现光谱的实际乘法,因为两个不同大小阵列的DFT是不同的 因此,在psuedocode中,假设我有一个长度为1024的数组arr,以及长度为8的内核kern 要获得arr和kern的卷积,我执行以下操作: IDFT(干膜厚度(arr)*干膜厚度(kern)) 但是DFT(arr)是长度为1024的数组,DFT(kern)是长度为8的数组。那么它们是如何相乘的

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

因此,在psuedocode中,假设我有一个长度为1024的数组
arr
,以及长度为8的内核
kern

要获得
arr
kern
的卷积,我执行以下操作:


IDFT(干膜厚度(arr)*干膜厚度(kern))


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

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

请注意,如果您的内核比您的输入小得多,那么这根本没有效率。在这种(通常的)情况下,您可以使用重叠添加或重叠保存方法将输入分成与内核大小相同的块

例如,见:


对于非常小的内核,这仍然是无效的。如果您的内核实际上只有8个样本长,那么您不应该为这些东西而烦恼。简单的实现会更快。

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

请注意,如果您的内核比您的输入小得多,那么这根本没有效率。在这种(通常的)情况下,您可以使用重叠添加或重叠保存方法将输入分成与内核大小相同的块

例如,见:


对于非常小的内核,这仍然是无效的。如果您的内核实际上只有8个样本长,那么您不应该为这些东西而烦恼。简单的实现会更快。

您只需将较小的信号(kern)调零到较大信号的大小。@PAUR非常感谢。您只需将较小的信号(kern)调零即可对于更大信号的大小。@PaulR非常感谢。所以对于二维卷积,我必须添加那么多行和列,然后再添加零填充。还有,为什么不能在内核达到较大输入的大小之前进行零填充?@ACCurrent是的,对于2D,必须在两个维度上进行填充。也可以在二维中进行重叠添加。你不能只填充到输入大小,因为卷积的输出需要适合IDFT,而输出大小是输入大小的总和。所以对于2D卷积的情况,我必须添加那么多行和列,然后零填充。还有,为什么不能在内核达到较大输入的大小之前进行零填充?@ACCurrent是的,对于2D,必须在两个维度上进行填充。也可以在二维中进行重叠添加。您不能只增加输入大小,因为卷积的输出需要适合IDFT,而输出大小是输入大小的总和。