为什么在使用FFT时我的卷积结果会发生偏移

时间:2015-04-20 11:40:51

标签: signal-processing fft shift convolution

我正在使用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的在线计算器执行了相同的计算!得到相同的结果,所以我可能错过了一些基础知识。我的可用文献没有帮助。所以我的问题,为什么会发生这种情况?

2 个答案:

答案 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)循环居中,则结果也将保持居中。否则任何偏移都会增加。