如何使用 DFT 实现卷积?
How to implement convolutions using DFT?
所以根据我的理解,可以通过离散傅里叶变换执行卷积。从我读到的过程来看,这个过程只涉及将内核和输入的 DFT 相乘。但是,我不知道如何实现光谱的实际乘法,因为两个不同大小的阵列的 DFT 会有所不同。
所以在伪代码中假设我有一个长度为 1024 的数组 arr
和长度为 8 的内核 kern
。
为了获得 arr
和 kern
的卷积,我执行:
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 个样本长,那么你不应该为这些东西烦恼。简单的实现会更快。
所以根据我的理解,可以通过离散傅里叶变换执行卷积。从我读到的过程来看,这个过程只涉及将内核和输入的 DFT 相乘。但是,我不知道如何实现光谱的实际乘法,因为两个不同大小的阵列的 DFT 会有所不同。
所以在伪代码中假设我有一个长度为 1024 的数组 arr
和长度为 8 的内核 kern
。
为了获得 arr
和 kern
的卷积,我执行:
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 个样本长,那么你不应该为这些东西烦恼。简单的实现会更快。