【发布时间】:2015-04-20 11:40:51
【问题描述】:
我正在使用 Radix-2 Cooley-Tukey FFT/FFT-inverse 实现卷积,我的输出是正确的,但在完成时发生了偏移。
我的解决方案是将输入大小和内核大小都归零为 2^m 以获得最小的 m,使用 FFT 转换输入和内核,然后将两个元素相乘并使用 FFT 逆将结果转换回来。
作为结果问题的示例:
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 的在线计算器执行了相同的计算!并得到相同的结果,所以可能是我缺少一些基础知识。我现有的文献没有帮助。所以我的问题是,为什么会发生这种情况?
【问题讨论】:
-
您的身份内核应该是 4x4 大小,对吧?将 1 放在索引 [2,2] 中(从零开始),我认为您会得到更好的结果。
-
是的,内核是 4x4,我相应地编辑了帖子。我不确定您所说的从零开始是什么意思,但是将 1 放在 [2,2] 会进一步改变它。将 1 放在 [0,0] 会产生正确的结果,但我不明白为什么。是不是因为我需要对内核进行循环移位,所以中心(这里是 1)位于 [0,0] 位置?
-
对不起,如果我不清楚。 FFT 内核中左上角元素的索引应为 -n/2,其中 n 是行数和列数。因此,对于 4x4 内核,(0,0) 位置位于第三行第三列。
-
感谢您的回复。但是,仍然不清楚我应该如何索引它,更不用说解释为什么会发生这种情况(理论上)。使用大小为 5x5 的内核零填充到 8x8 会产生相同的结果(仅移动 1 行和 1 列)。你说左上角应该是-n/2。所以你说的是,在执行 FFT 时应该在左上角,在那之前是 -n/2。嗯。 -n/2 怎么不是负索引?是移位量吗?以及如何确定内核锚点/中心?哦,天哪,我不明白...对不起...
标签: signal-processing fft shift convolution