2015-04-20 5 views
1

Я реализую Convolutions с использованием Radix-2 Cooley-Tukey FFT/FFT-обратный, и мой вывод правильный, но сдвиг по завершении.Почему мой результат свертки смещается при использовании FFT

Мое решение состоит в том, чтобы установить как размер ввода, так и размер ядра до 2 м для минимально возможного m, преобразовать как входные, так и ядро ​​с использованием БПФ, затем умножить два элемента и преобразовать результат с помощью 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! и получить те же результаты, поэтому, вероятно, мне не хватает фундаментальных знаний. Мой доступный литер не помог. Итак, мой вопрос, почему это происходит?

+0

Ваше ядро ​​идентификации должно быть размером 4x4, верно? Поместите 1 в индекс [2,2] (на основе нуля), и я думаю, что вы получите лучший результат. –

+0

Да, ядро ​​4x4, я отредактировал сообщение соответственно. Я не уверен, что вы подразумеваете под нулевым основанием, но размещение 1 в [2,2] изменило бы его дальше. Помещение 1 в [0,0] дает правильный результат, но я не понимаю, почему. Это потому, что мне нужно круговое смещение ядра, чтобы центр (здесь 1) находился в позиции [0,0]? – Dith

+0

Извините, если я не понял. Индекс верхнего левого элемента в ядре FFT должен быть -n/2, где n - количество строк и столбцов. Итак, для ядра 4x4 позиция (0,0) расположена в третьей строке и третьем столбце. –

ответ

3

Итак, я нашел ответ , почему это происходит сам. Ответ дан посредством определения свертки и индексации, которая там происходит. Таким образом, по определению свертка s и K дается

(s*k)(x) = sum(s(k)k(x-k),k=-inf,inf) 

центре ядра не «известный» по этой формуле, и таким образом абстракцией мы делаем. Определить c как центр свертки. Когда x-k ​​= c в сумме, s (k) is s (x-c). Таким образом, сумма, содержащая интересный продукт s (x-c) k (c) заканчивается индексом x. Другими словами, сдвинуто вправо на c.

2

Быстрое сверление FFT выполняет круговую свертку. Если вы используете нулевую площадку, так что данные и ядро ​​округлены по центру (0,0) в массивах NxN того же размера, результат также останется центрированным. В противном случае добавятся любые смещения.

+0

Значит, это означает, что ядро ​​[[0,0,0], [0,0,0], [0, c, 0]] , где 'c' - центр ядра, будет сдвигаться ровно на 2 строки вниз и 1 столбец вправо? Это было бы разумно для меня. Поскольку вы говорите, что сосредоточено вокруг (0,0), у меня создается впечатление, что вы имеете в виду «относительно центра ядра», что позволило бы отрицательные индексы. Верный? – Dith

+1

«относительно центра ядра» да. с отрицательными индексами обертывания для «верхней левой» части. – hotpaw2