DFT, по определению , использует n=0..N-1
и k=0..N-1
, где n
- индекс в сигнале временной области и k
индекс в сигнале частотной области. k
также соответствует частоте. DFT определяется таким образом по аналогии с рядами Фурье.
Поскольку частота в ДПФ является периодической, можно думать, что k=N-1
соответствует k=-1
. Таким образом, функция сдвига перемещает верхнюю половину частот слева от начала координат, чтобы их можно было легче интерпретировать как отрицательные частоты. Но это исключительно удобно для отображения, так как он приводит сигнал частотной области к форме, с которой мы более знакомы (возможно, потому, что это облегчает объяснение некоторого анализа Фурье, и, следовательно, учебники отображают его таким образом, и, следовательно, мы узнаем о Фурье, взглянув на графики частот с началом координат в середине).
Для большинства задач обработки изображений нам не нужно смещать исходную точку. Опять же, это только для отображения, это удобно и красиво.
Например, для вычисления взаимной корреляции:
cc = ifft( fft(img1) * conj(fft(img2)) )
Здесь верхний левый пиксель cc
является источником. Если img1==img2
, верхний левый пиксель будет максимальным значением. Если бы у нас была функция fft
, которая сместила начало координат в середину, тогда изображение взаимной корреляции cc
также получило бы свое начало в середине. После нахождения пика нам нужно будет сделать несколько вычислений, чтобы выяснить, каково смещение между img1
и img2
. (Не то чтобы это было сложно, но это показывает, что смещение не обязательно выгодно.)
При свертывании у человека часто есть ядро в пространственной области с центром в середине (как, например, в в этом недавнем вопросе ). В этом случае необходимо сместить начало координат вверху слева, прежде чем вычислять ДПФ. Но нет смысла сдвигать источник сигналов в частотной области только для того, чтобы умножить их вместе, а затем отменить сдвиг. Можно просто напрямую умножить сигналы, которые имеют источник в верхнем левом углу:
kernel = ifftshift(kernel)
filtered = ifft( fft(img) * fft(kernel) )
Обратите внимание, что есть две разные функции сдвига, часто называемые fftshift
и ifftshift
. Один смещает начало координат от верхнего левого угла до середины, другой перемещает начало координат от середины к верхнему левому углу. Эти две функции выполняют одно и то же для сигналов (изображений) четного размера, но отличаются, если размеры нечетные.