2011-06-18 135 views
19

幅度和傅立叶相位变换F被定义为:入门从相位和幅度傅立叶变换 - Matlab的

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 M文件的代码如下:

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; 

感谢很多:)

回答

19

你的函数试图在一次测试两件事情:(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); 

希望这有助于。

+0

啊谢谢一吨!棒极了。 atan(im./re)和atan2(im,re)之间最大的区别是什么?昨天我尝试了同样类型的东西,从mag和cos和罪恶中获得重新和im,但它仍然给我垃圾。与你的建议atan2(),它的作品。感谢一吨虽然:) –

+2

@Dave:见http://en.wikipedia.org/wiki/Atan2#Motivation。 –

+0

@nibot不好意思的男人,还没来过这里。只是选择它作为接受的答案 –