2011-06-18 4 views
19

L'amplitude et la phase d'une transformation de Fourier F sont définis comme:Mise à transformée de Fourier de la phase et de magnitude - Matlab

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

et

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

Ive a essayé d'écrire du code MATLAB qui prend en matrice d'image en niveaux de gris, exécute fft2() sur la matrice puis calcule l'amplitude et la phase à partir de la transformée. Je souhaite ensuite calculer les parties imaginaires et réelles de la transformée de Fourier. Cela se fait en réorganisant les deux premières équations dans:

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

et

Imaginary = Real*tan(Phase) 

et enfin la combinaison et fft2 inverse:

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

Je me attends de voir la même image que l'entrée, mais je reçois des ordures. Est-ce que mes maths sont fausses? Mon matlab code MFILE est la suivante:

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; 

merci beaucoup :)

Répondre

19

Votre fonction tente de tester deux choses à la fois: (1) FFT et FFT inverse d'une image, et (2) désassembler un nombre complexe en parties réelles et imaginaires, se transforme en amplitude et en phase, puis le remet en place. Au lieu d'essayer tout cela en même temps et de vous demander pourquoi cela ne fonctionne pas, vous devriez tester chacune de ces deux fonctions séparément.

Pour tester si ifft(fft(image)) redonne l'image d'origine, vous pouvez simplement supprimer ou commenter toutes les manipulations de nombres complexes:

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; 

Ce fonctionne. Donc, le problème est avec vos manipulations de nombres complexes. Considérez ce qui se passe quand phase = 0 ou phase = pi/2. La tangente de 0 est 0, ce qui conduit à une division par zéro; et tan (pi/2) est infini.

Voici un code qui fonctionne:

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; 

Vous devrez faire imagesc(abs(f)) afin de montrer l'inverse transformé l'image résultante, pour se débarrasser d'un (presque zéro) composante imaginaire.

Une plus idiomatiques façon d'obtenir l'amplitude et la phase d'un nombre complexe est simplement faire:

mag = abs(F); 
phase = angle(F); 

Hope this helps.

+0

ahh merci une tonne! c'est génial. Quelle est la grande différence entre atan (im./re) et atan2 (im, re)? Hier, j'ai essayé le même type de chose, en recevant re et im du mag et du cos et du péché, mais ça m'a quand même donné des déchets. avec votre suggestion de atan2(), cela fonctionne. Merci beaucoup cependant :) –

+2

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

+0

@nibot désolé homme, havent été ici depuis un moment. il suffit de le sélectionner comme réponse acceptée –

Questions connexes