Получение преобразования Фурье от фазы и величины - Matlab - PullRequest
19 голосов
/ 18 июня 2011

Величина и фаза преобразования Фурье F определены как:

Mag = sqrt(Real(F)^2 + Imaginary(F)^2)

и

Phase = arctan(Imaginary(F)/Real(F))

Я пытался написать код matlab, который принимает матрицу изображений в градациях серого, выполняетfft2 () на матрице, а затем вычисляет величину и фазу из преобразования.Затем я хочу вычислить мнимую и действительную части преобразования Фурье.Это делается путем перестановки первых двух уравнений в:

Real = Mag/sqrt(1 + tan(Phase)^2)

и

Imaginary = Real*tan(Phase)

и, наконец, объединения и обратного fft2:

F = Real + i*Imaginary
image = ifft2(F)

Я ожидаючтобы увидеть то же изображение, что и вход, но я получаю мусор.Моя математика не так?Мой код Matlab Mfile выглядит следующим образом:

function y = forwardBackwardFFT(image)

F = fft2(image);
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan(imag(F)./real(F));

re = sqrt((mag.^2)./(1 + tan(phase).^2));
im = re.*tan(phase);
F = re + i*im;
f = ifft2(F);

subplot(1,2,1);
imshow(image);
Title('Original Image');

subplot(1,2,2);
imshow(f);
Title('Image after forward and backward FFT');
y = f;

большое спасибо:)

1 Ответ

19 голосов
/ 18 июня 2011

Ваша функция пытается проверить две вещи одновременно: (1) БПФ и обратное БПФ изображения, и (2) разобрать комплексное число на действительные и мнимые части, преобразовать их в амплитуду и фазу, а затем собрать обратноснова.Вместо того, чтобы попробовать все это сразу и спросить, почему это не работает, вы должны протестировать каждую из этих двух функций отдельно.

Чтобы проверить, возвращает ли ifft(fft(image)) исходное изображение, вы можете просто удалить илизакомментируйте все манипуляции с комплексными числами:

function y = forwardBackwardFFT(image)

F = fft2(image);
%# stuff removed
f = ifft2(F);

subplot(1,2,1);
imshow(image);
title('Original Image');

subplot(1,2,2);
imshow(f, []);
title('Image after forward and backward FFT');
y = f;

Это работает .Так что проблема в ваших сложных числовых манипуляциях.Рассмотрим, что происходит, когда фаза = 0 или фаза = pi / 2.Тангенс 0 равен 0, что приводит к делению на ноль;и tan (pi / 2) бесконечен.

Вот некоторый код, который работает:

mag =  sqrt(real(F).^2 + imag(F).^2);
phase = atan2(imag(F),real(F));

re = mag .* cos(phase);
im = mag .* sin(phase);
F = re + 1i*im;

Вам нужно будет сделать imagesc(abs(f)), чтобы показать полученное изображение с обратным преобразованием, чтобы избавиться от (почти нулевого) мнимого компонента.

Более идиоматический способ получить величину и фазу комплексного числа состоит в следующем:

mag = abs(F);
phase = angle(F);

Надеюсь, это поможет.

...