Ответ 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);
Надеюсь, что это поможет.