我正在使用Radix-2 Cooley-Tukey FFT / FFT-inverse实现Convolutions,我的输出是正确的,但在完成后移位。
我的解决方案是将输入大小和内核大小填充到2 ^ m以获得最小可能的m,使用FFT转换输入和内核,然后将两个元素相乘并使用FFT-inverse将结果转换回来。
作为结果问题的一个例子:
0 1 2 3 0 0 0 0
4 5 6 7 0 0 0 0
8 9 10 11 0 0 0 0
12 13 14 15 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
使用标识内核
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
变为
0 0 0 0 0 0 0 0
0 0 1 2 3 0 0 0
0 4 5 6 7 0 0 0
0 8 9 10 11 0 0 0
0 12 13 14 15 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
似乎任何大小的输入和内核产生相同的移位(1行和1列),但我可能是错的。我使用this link的在线计算器执行了相同的计算!得到相同的结果,所以我可能错过了一些基础知识。我的可用文献没有帮助。所以我的问题,为什么会发生这种情况?
答案 0 :(得分:4)
所以我最终找到了答案为什么这种情况发生在我自己身上。回答是通过卷积的定义和那里发生的索引来给出的。因此,根据定义, s 和 k 的卷积由
给出(s*k)(x) = sum(s(k)k(x-k),k=-inf,inf)
这个公式的内核中心不“已知”,因此我们做了一个抽象。将 c 定义为卷积的中心。当总和中 x-k = c 时, s(k)是 s(x-c)。所以包含有趣产品 s(x-c)k(c)的总和最终在索引 x 。换句话说,通过 c 向右移动。
答案 1 :(得分:2)
FFT快速卷积执行循环卷积。如果将零填充为零,使得数据和内核在相同大小的NxN数组中以(0,0)循环居中,则结果也将保持居中。否则任何偏移都会增加。