2011-06-18 309 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不好意思的男人,還沒來過這裏。只是選擇它作爲接受的答案 –