从相位和幅度获取傅立叶变换-Matlab

|| 傅立叶变换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)对图像进行FFT和逆FFT,以及(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;
这可行。所以问题出在您的复数运算上。考虑当phase = 0或phase = 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);
希望这可以帮助。     

要回复问题请先登录注册