2011-06-18 13 views
19

wielkości i faza transformacji Fouriera F są zdefiniowane jako:Pierwsze Fourier Transform od fazy i wielkość - Matlab

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

i

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

Ive próbował napisać kod Matlab, że trwa w sposób Matryca obrazu w skali szarości, wykonuje fft2() na macierzy, a następnie oblicza wielkość i fazę z transformacji. Następnie chciałbym obliczyć wyobrażone i rzeczywiste części transformaty Fouriera. Odbywa się to poprzez zmianę dwóch pierwszych równań do:

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

i

Imaginary = Real*tan(Phase) 

i wreszcie łączenie i odwrotna fft2:

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

będę oczekiwać, aby zobaczyć ten sam obraz jak wejście, ale dostaję śmieci. Czy moja matematyka jest zła? Moje Matlab kod mfile jest następujący:

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; 

wielkie dzięki :)

Odpowiedz

19

Twoja funkcja próbuje przetestować dwie rzeczy naraz: (1) FFT i odwrotne FFT obrazu, oraz (2) rozmontować złożoną liczbę do części rzeczywistych i urojonych, przekształć ją w amplitudę i fazę, a następnie ponownie umieść. Zamiast próbować wszystkiego od razu i zastanawiając się, dlaczego to nie działa, należy przetestować każdą z tych dwóch funkcji osobno.

Aby sprawdzić, czy ifft(fft(image)) oddaje oryginalny obraz, można po prostu usunąć lub wypowiedzieć wszystkie skomplikowane manipulacje numer:

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; 

Ten działa. Problem polega więc na skomplikowanych manipulacjach liczbowych. Zastanów się, co stanie się, gdy faza = 0 lub faza = pi/2. Styczna 0 wynosi 0, co prowadzi do podziału przez zero; a tan (pi/2) jest nieskończony.

Oto kod, który działa:

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; 

Trzeba będzie zrobić imagesc(abs(f)) w celu wykazania uzyskanego odwrotną przekształconych zdjęcie, aby pozbyć się (prawie zero) składowej urojonej.

Bardziej idiomatyczne sposobem uzyskania wielkości i fazy liczby zespolonej jest po prostu zrobić:

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

nadzieję, że to pomaga.

+0

ahh dziękuję! to cudownie. Jaka jest duża różnica między atan (im./re) i atan2 (im, re)? Wczoraj próbowałem tego samego rodzaju rzeczy, otrzymując re i im z mag, cos i grzechu, ale nadal dało mi to śmieci. z twoją sugestią atan2(), to działa. Dziękuję chociaż ton :) –

+2

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

+0

@nibot Przepraszam, nie byłem tu od dłuższego czasu. po prostu wybrałeś ją jako zaakceptowaną odpowiedź –