fftshift перед вычислением преобразования Фурье: Matlab

Я смотрю на некоторый код FFT в проекте Matlab и FFT и обратное FFT вычисляется следующим образом:

% Here image is a 2D image.
image_fft = fftshift(image,1);
image_fft = fftshift(image_fft,2);

image_fft = fft(image_fft,[],1);
image_fft = fft(image_fft,[],2);

image_fft = fftshift(image_fft,1);
image_fft = fftshift(image_fft,2);

% Some processing and then same sequence of fftshift, ifft and fftshift to move to
% time domain

Я попытался найти некоторую информацию в Интернете, но у меня возникли проблемы с вопросом, зачем делать fftshift перед вычислением FFT.

Другой вопрос, который у меня есть, заключается в том, является ли это чем-то действительно специфичным для Matlab. Например, я планирую перенести этот код на C++ и использовать KISS FFT. Должен ли я быть разным?

2 ответа

Решение

Причина, по которой людям нравится менять местами до DFT, заключается в том, что он делает центральный пиксель изображения с нулевым фазовым сдвигом. Это часто делает алгоритмы, которые зависят от фазы, легче думать и реализовывать. Он не является специфичным для Matlab, и если вы хотите перенести точную версию кода на другой язык, вам также необходимо выполнить предварительную замену.

РЕДАКТИРОВАТЬ:

Позвольте мне привести пример, который, я надеюсь, прояснит ситуацию. Допустим, что наше изображение представляет собой сумму множества функций sinc с различными местоположениями по всему изображению. В частотной области каждая из этих функций sinc является прямоугольной функцией с той же амплитудой, но с разным линейным компонентом фазы, который определяет местоположение sinc в области изображения. Меняя местами изображение перед выполнением ДПФ, мы делаем нулевую линейную фазовую составляющую представления центральной области в частотной области. Более того, линейные фазовые компоненты других функций sinc теперь будут зависеть от их расстояния от центрального пикселя. Если бы мы не поменяли местами изображение заранее, то линейные фазовые компоненты функций прямоугольника были бы функцией их расстояния от пикселя в верхнем левом углу изображения. Это было бы неинтуитивно и включало бы в себя те же соображения по фазовому переносу, что и при уравнении частот в диапазоне (pi,2pi) рад / выборка с более интуитивным (-pi,0) рад / выборка.

Для изображений лучше использовать fft2, Это соглашение Matlab, чтобы организовать 2D FFT с DC в углах. Предположительно из-за соглашений строки / массива. fftshift позволяет более интуитивно понятное отображение БПФ с DC в центре.

Я не до конца понимаю, о чем фрагмент кода, который вы скопировали. Вот пример fft и обратного fft изображения с использованием matlab.

И более подробный урок здесь.

Другие вопросы по тегам