rapida - Obteniendo transformada de Fourier a partir de fase y magnitud-Matlab
transformada rapida de fourier en matlab ejemplos (1)
Su función es intentar probar dos cosas a la vez: (1) FFT y FFT inversa una imagen, y (2) desmontar un número complejo en partes reales e imaginarias, transformar en 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 comprobar si ifft(fft(image))
devuelve la imagen original, 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;
Esto funciona 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;
Tendrá que hacer imagesc(abs(f))
para mostrar la imagen transformada inversa resultante, para deshacerse de un componente imaginario (casi cero).
Una forma más idiomática de obtener la magnitud y la fase de un número complejo es simplemente hacer:
mag = abs(F);
phase = angle(F);
Espero que esto ayude.
La magnitud y la fase de una transformada Fourier F se definen como:
Mag = sqrt(Real(F)^2 + Imaginary(F)^2)
y
Phase = arctan(Imaginary(F)/Real(F))
Intenté escribir el código de matlab que toma 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 reorganizando las primeras dos ecuaciones en:
Real = Mag/sqrt(1 + tan(Phase)^2)
y
Imaginary = Real*tan(Phase)
y finalmente combinando e inverso fft2:
F = Real + i*Imaginary
image = ifft2(F)
Esperaría ver la misma imagen que la entrada, pero me sale basura. ¿Mis cálculos están equivocados? Mi código mfile de matlab 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 :)