2011-06-18 36 views
19

La magnitud y fase de una transformada de Fourier F se definen como:Primeros transformada de Fourier de la fase y la magnitud - Matlab

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

y

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

he tratado de escribir código de MATLAB que se lleva en una matriz de imagen en escala de grises, realiza fft2() en la matriz y luego calcula la magnitud y la fase de la transformación. Luego deseo calcular las partes imaginarias y reales de la transformada de Fourier. Esto se hace mediante la reordenación de las dos primeras ecuaciones en:

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

y

Imaginary = Real*tan(Phase) 

y, finalmente, la combinación y fft2 inversa:

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

que cabe esperar para ver la misma imagen que la entrada, pero me sale basura. ¿Mis cálculos están equivocados? Mi código de MATLAB MFILE es el siguiente:

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; 

muchas gracias :)

Respuesta

19

Su función está tratando de probar dos cosas a la vez: (1) la FFT y la FFT inversa de una imagen, y (2) desmonte un número complejo en partes reales e imaginarias, transformar a amplitud y fase, y luego volver a armarlo. En lugar de intentar todo al mismo tiempo y preguntarse por qué no funciona, debe probar cada una de estas dos funciones por separado.

Para probar si ifft(fft(image)) da vuelta la imagen original, sólo puede eliminar o comentar todas las manipulaciones de números complejos:

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; 

Este obras. Entonces, el problema es con sus complejas manipulaciones numéricas. Considere lo que sucede cuando fase = 0 o fase = pi/2. La tangente de 0 es 0, lo que lleva a una división por cero; y tan (pi/2) es infinito.

Aquí hay un código que funciona:

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; 

Usted tendrá que hacer imagesc(abs(f)) con el fin de mostrar la imagen inversa transformada resultante, para deshacerse de un componente imaginario (casi cero).

Una forma más idiomática para obtener la magnitud y fase de un número complejo es simplemente hacer:

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

Espero que esto ayude.

+0

ahh thanks a ton! Eso es genial. ¿Cuál es la gran diferencia entre atan (im./re) y atan2 (im, re)? Ayer probé el mismo tipo de cosas, obtener re e im de mag, cos y pecado, pero aún así me dio basura. con su sugerencia de atan2(), funciona. Muchas gracias :) :) –

+2

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

+0

@nibot lo siento, no he estado aquí por un tiempo. simplemente lo seleccionó como la respuesta aceptada –

Cuestiones relacionadas