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 необходимо выполнить перед вычислением БПФ.

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


person Luca    schedule 11.11.2014    source источник


Ответы (2)


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

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

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

person AnonSubmitter85    schedule 11.11.2014
comment
Итак, это делает постоянную составляющую в центре корзины. Я предполагаю, что это нужно сделать и для других библиотек. Я вижу в сообщении здесь dsp.stackexchange.com /questions/2570/ что самое левое значение в выводе Kiss FFT также является компонентом постоянного тока, за которым следуют низкие и высокие частоты. Итак, чтобы воспроизвести этот код Matlab, мне также нужно было бы реализовать процедуру, подобную fftshift, в Kiss FFT? - person Luca; 11.11.2014
comment
@Luca, если вы применяете сдвиг перед БПФ, он не сдвигает нулевую частоту к центру, поскольку сдвигает исходное изображение, а не спектр. - person Cape Code; 11.11.2014
comment
Если вы используете стандартную библиотеку БПФ, уже должен быть механизм для смещения частотного спектра. Однако, если это не так, вам просто нужно взять свое изображение (в пиксельной области) и умножить каждое значение на (-1)^(x+y), где x и y — это расположение пикселей в изображении (с индексацией 0). Если взять БПФ этого, свойство смещения частоты БПФ вступит в силу и эффективно центрирует ваш спектр. - person rayryeng; 11.11.2014
comment
@CapeCode: Да, вы правы. Тем не менее, я думаю, что это также имеет какое-то отношение к сдвигу происхождения. В исходном коде преобразованное Фурье изображение умножается на ядро ​​Гаусса (построенное в частотной области, которое является гауссовым). Итак, я предполагаю, что fftshift изображения сделает происхождение согласованным. - person Luca; 11.11.2014
comment
@Luca Пожалуйста, посмотрите пример моего редактирования. Я надеюсь, что это поможет прояснить ситуацию. - person AnonSubmitter85; 11.11.2014

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

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

И более подробное руководство здесь.

person Cape Code    schedule 11.11.2014
comment
Небольшой комментарий: пример не был предоставлен. Я бы тоже хотел увидеть этот пример! - person rayryeng; 11.11.2014
comment
@rayryeng ой забыл ссылку. Вот, спасибо, что указали. - person Cape Code; 11.11.2014
comment
Спасибо за комментарий. Знаете ли вы, делает ли Kiss FFT нечто подобное? Как это можно проверить с помощью kiss FFT или других библиотек, таких как FFTW? - person Luca; 11.11.2014
comment
@ Лука, я не знаю о «Kiss FFT». - person Cape Code; 11.11.2014
comment
Это не отвечает на вопрос ОП. Он/она спрашивает, почему своп делается до ДПФ. - person AnonSubmitter85; 11.11.2014
comment
@ AnonSubmitter85, строго говоря, правильно. Но я подозреваю, что ОП просто заинтересован в применении БПФ и обратного БПФ. - person Cape Code; 11.11.2014