Подтвердить что ты не робот

Получение преобразования Фурье по фазе и величине - Matlab

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

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

и

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

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

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

и

Imaginary = Real*tan(Phase)

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

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

Я ожидаю увидеть то же изображение, что и вход, но я получаю мусор. Является ли моя математика неправильной? Мой код mclab 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;

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

4b9b3361

Ответ 1

Ваша функция пытается сразу проверить две вещи: (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);

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