MATLAB Language
Transformadas de Fourier y Transformadas de Fourier inversas
Buscar..
Sintaxis
Y = fft (X)% calcula la FFT de Vector o Matriz X utilizando una Longitud de transformación predeterminada de 256 (que se confirmará para la versión)
Y = fft (X, n)% calcula la FFT de X utilizando n como Longitud de transformación, n debe ser un número basado en 2 potencias. Si la longitud de X es menor que n, entonces Matlab rellenará automáticamente X con ceros de manera que la longitud (X) = n
Y = fft (X, n, dim)% calcula la FFT de X usando n como Longitud de transformación a lo largo de la dimensión dim (puede ser 1 o 2 para horizontal o vertical respectivamente)
Y = fft2 (X)% Calcule la FFT 2D de X
Y = fftn (X, dim)% Calcule la FFT dimidimensional de X, con respecto al vector de dimensiones dim.
y = ifft (X)% calcula la Inversa de FFT de X (que es una matriz / vector de números) utilizando la longitud de transformación predeterminada de 256
y = ifft (X, n)% calcula el IFFT de X utilizando n como Longitud de transformación
y = ifft (X, n, dim)% calcula el IFFT de X utilizando n como Longitud de transformación sobre dimensión dim (puede ser 1 o 2 para horizontal o vertical respectivamente)
y = ifft (X, n, dim, 'simétrico')% La opción Simétrico hace que ifft trate X como conjugado simétrico a lo largo de la dimensión activa. Esta opción es útil cuando X no es exactamente simétrico conjugado, simplemente debido a un error de redondeo.
y = ifft2 (X)% Calcule los pies 2D inversos de X
y = ifftn (X, dim)% Calcule el fft dim-dimensional inverso de X.
Parámetros
Parámetro | Descripción |
---|---|
X | Esta es su señal de entrada de dominio de tiempo, debería ser un vector de números. |
norte | este es el parámetro NFFT conocido como Longitud de transformación, piense en él como en la resolución de su resultado FFT, DEBE ser un número que sea una potencia de 2 (es decir, 64,128,256 ... 2 ^ N) |
oscuro | esta es la dimensión en la que desea calcular FFT, use 1 si desea calcular su FFT en la dirección horizontal y 2 si desea calcular su FFT en la dirección vertical. Tenga en cuenta que este parámetro generalmente se deja en blanco, ya que la función es Capaz de detectar la dirección de tu vector. |
Observaciones
Matlab FFT es un proceso muy paralelizado capaz de manejar grandes cantidades de datos. También puede utilizar la GPU con gran ventaja.
ifft(fft(X)) = X
La declaración anterior es verdadera si se omiten los errores de redondeo.
Implementar una transformada de Fourier simple en Matlab
La Transformada de Fourier es probablemente la primera lección en Procesamiento de Señal Digital, su aplicación está en todas partes y es una herramienta poderosa cuando se trata de analizar datos (en todos los sectores) o señales. Matlab tiene un conjunto de poderosas cajas de herramientas para la Transformada de Fourier. En este ejemplo, usaremos la Transformada de Fourier para analizar una señal de onda sinusoidal básica y generar lo que a veces se conoce como Periodograma utilizando FFT:
%Signal Generation
A1=10; % Amplitude 1
A2=10; % Amplitude 2
w1=2*pi*0.2; % Angular frequency 1
w2=2*pi*0.225; % Angular frequency 2
Ts=1; % Sampling time
N=64; % Number of process samples to be generated
K=5; % Number of independent process realizations
sgm=1; % Standard deviation of the noise
n=repmat([0:N-1].',1,K); % Generate resolution
phi1=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 1
phi2=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 2
x=A1*sin(w1*n*Ts+phi1)+A2*sin(w2*n*Ts+phi2)+sgm*randn(N,K); % Resulting Signal
NFFT=256; % FFT length
F=fft(x,NFFT); % Fast Fourier Transform Result
Z=1/N*abs(F).^2; % Convert FFT result into a Periodogram
Tenga en cuenta que la Transformada Discreta de Fourier se implementa mediante la Transformada Rápida de Fourier (fft) en Matlab, ambos producirán el mismo resultado, pero FFT es una implementación rápida de DFT.
figure
w=linspace(0,2,NFFT);
plot(w,10*log10(Z)),grid;
xlabel('w [\pi rad/s]')
ylabel('Z(f) [dB]')
title('Frequency Range: [ 0 , \omega_s ]')
Transformadas de Fourier inversas
Uno de los principales beneficios de la Transformada de Fourier es su capacidad de revertir al Dominio del Tiempo sin perder información. Consideremos la misma señal que usamos en el ejemplo anterior:
A1=10; % Amplitude 1
A2=10; % Amplitude 2
w1=2*pi*0.2; % Angular frequency 1
w2=2*pi*0.225; % Angular frequency 2
Ts=1; % Sampling time
N=64; % Number of process samples to be generated
K=1; % Number of independent process realizations
sgm=1; % Standard deviation of the noise
n=repmat([0:N-1].',1,K); % Generate resolution
phi1=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 1
phi2=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 2
x=A1*sin(w1*n*Ts+phi1)+A2*sin(w2*n*Ts+phi2)+sgm*randn(N,K); % Resulting Signal
NFFT=256; % FFT length
F=fft(x,NFFT); % FFT result of time domain signal
Si abrimos F
en Matlab, encontraremos que es una matriz de números complejos, una parte real y una parte imaginaria. Por definición, para recuperar la señal del dominio del tiempo original, necesitamos tanto el real (que representa la variación de la magnitud) como el imaginario (que representa la variación de la fase), para regresar al dominio del tiempo, uno puede querer simplemente:
TD = ifft(F,NFFT); %Returns the Inverse of F in Time Domain
Tenga en cuenta que el TD devuelto sería la longitud 256 porque establecimos NFFT en 256, sin embargo, la longitud de x es solo 64, por lo que Matlab rellenará los ceros hasta el final de la transformación TD. Entonces, por ejemplo, si NFFT fue 1024 y la longitud fue 64, entonces el TD devuelto será 64 + 960 ceros. También tenga en cuenta que debido al redondeo de punto flotante, puede obtener algo como 3.1 * 10e-20 pero para propósitos generales: para cualquier X, ifft (fft (X)) es igual a X dentro del error de redondeo.
Digamos por un momento que después de la transformación, hicimos algo y solo nos queda la parte REAL de la FFT:
R = real(F); %Give the Real Part of the FFT
TDR = ifft(R,NFFT); %Give the Time Domain of the Real Part of the FFT
Esto significa que estamos perdiendo la parte imaginaria de nuestra FFT y, por lo tanto, estamos perdiendo información en este proceso inverso. Para conservar el original sin perder información, siempre debe mantener la parte imaginaria de la FFT utilizando imag
y aplicar sus funciones a ambas o a la parte real.
figure
subplot(3,1,1)
plot(x);xlabel('time samples');ylabel('magnitude');title('Original Time Domain Signal')
subplot(3,1,2)
plot(TD(1:64));xlabel('time samples');ylabel('magnitude');title('Inverse Fourier Transformed - Time Domain Signal')
subplot(3,1,3)
plot(TDR(1:64));xlabel('time samples');ylabel('magnitude');title('Real part of IFFT transformed Time Domain Signal')
Imágenes y FT multidimensionales.
En la imagen médica, la espectroscopia, el procesamiento de imágenes, la criptografía y otras áreas de la ciencia y la ingeniería, es a menudo el caso de que se desea calcular las transformadas de Fourier multidimensionales de las imágenes. Esto es bastante sencillo en Matlab: las imágenes (multidimensionales) son solo matrices n-dimensionales, después de todo, y las transformadas de Fourier son operadores lineales: una transformada de Fourier a lo largo de otras dimensiones. Matlab proporciona fft2
y ifft2
para hacer esto en 2-d, o fftn
en n-dimensiones.
Una de las posibles fallas es que la transformada de Fourier de las imágenes generalmente se muestra "centrada en el orden", es decir, con el origen del espacio k en el centro de la imagen. Matlab proporciona el comando fftshift
para intercambiar la ubicación de los componentes de CC de la transformada de Fourier de manera adecuada. Esta notación de ordenación hace que sea mucho más fácil realizar técnicas comunes de procesamiento de imágenes, una de las cuales se ilustra a continuación.
Relleno cero
Una forma "rápida y sucia" de interpolar una imagen pequeña a un tamaño más grande es transformarla con Fourier, rellenar con ceros la transformación de Fourier y luego tomar la transformación inversa. Esto se interpola de manera efectiva entre cada píxel con una función de base de forma sincera, y se usa comúnmente para ampliar los datos de imágenes médicas de baja resolución. Empecemos cargando un ejemplo de imagen incorporado.
%Load example image
I=imread('coins.png'); %Load example data -- coins.png is builtin to Matlab
I=double(I); %Convert to double precision -- imread returns integers
imageSize = size(I); % I is a 246 x 300 2D image
%Display it
imagesc(I); colormap gray; axis equal;
%imagesc displays images scaled to maximum intensity
Ahora podemos obtener la transformada de Fourier de I. Para ilustrar lo que hace fftshift
, comparemos los dos métodos:
% Fourier transform
%Obtain the centric- and non-centric ordered Fourier transform of I
k=fftshift(fft2(fftshift(I)));
kwrong=fft2(I);
%Just for the sake of comparison, show the magnitude of both transforms:
figure; subplot(2,1,1);
imagesc(abs(k),[0 1e4]); colormap gray; axis equal;
subplot(2,1,2);
imagesc(abs(kwrong),[0 1e4]); colormap gray; axis equal;
%(The second argument to imagesc sets the colour axis to make the difference clear).
Ahora hemos obtenido el FT 2D de una imagen de ejemplo. Para rellenarlo con cero, queremos tomar cada espacio k, rellenar los bordes con ceros y luego tomar la transformada posterior:
%Zero fill
kzf = zeros(imageSize .* 2); %Generate a 492x600 empty array to put the result in
kzf(end/4:3*end/4-1,end/4:3*end/4-1) = k; %Put k in the middle
kzfwrong = zeros(imageSize .* 2); %Generate a 492x600 empty array to put the result in
kzfwrong(end/4:3*end/4-1,end/4:3*end/4-1) = kwrong; %Put k in the middle
%Show the differences again
%Just for the sake of comparison, show the magnitude of both transforms:
figure; subplot(2,1,1);
imagesc(abs(kzf),[0 1e4]); colormap gray; axis equal;
subplot(2,1,2);
imagesc(abs(kzfwrong),[0 1e4]); colormap gray; axis equal;
%(The second argument to imagesc sets the colour axis to make the difference clear).
En este punto, el resultado es bastante poco destacable:
Una vez que tomamos las transformaciones inversas, podemos ver que (¡correctamente!) Los datos de relleno cero proporcionan un método sensato para la interpolación:
% Take the back transform and view
Izf = fftshift(ifft2(ifftshift(kzf)));
Izfwrong = ifft2(kzfwrong);
figure; subplot(1,3,1);
imagesc(abs(Izf)); colormap gray; axis equal;
title('Zero-filled image');
subplot(1,3,2);
imagesc(abs(Izfwrong)); colormap gray; axis equal;
title('Incorrectly zero-filled image');
subplot(1,3,3);
imagesc(I); colormap gray; axis equal;
title('Original image');
set(gcf,'color','w');
Tenga en cuenta que el tamaño de imagen con relleno cero es el doble del original. Uno puede rellenar a cero por más de un factor de dos en cada dimensión, aunque obviamente hacerlo no aumenta arbitrariamente el tamaño de una imagen.
Consejos, trucos, 3D y más allá.
El ejemplo anterior es válido para imágenes en 3D (como se genera a menudo por técnicas de imagen médica o microscopía confocal, por ejemplo), pero requiere que fft2
sea reemplazado por fftn(I, 3)
, por ejemplo. Debido a la naturaleza algo incómoda de escribir fftshift(fft(fftshift(...
varias veces, es bastante común definir funciones como fft2c
localmente para proporcionar una sintaxis más fácil a nivel local, como:
function y = fft2c(x)
y = fftshift(fft2(fftshift(x)));
Tenga en cuenta que la FFT es rápida, pero las transformaciones de Fourier multidimensionales y grandes aún tomarán tiempo en una computadora moderna. Además, es intrínsecamente complejo: la magnitud del espacio k se mostró arriba, pero la fase es absolutamente vital; Las traducciones en el dominio de imagen son equivalentes a una rampa de fase en el dominio de Fourier. Hay varias operaciones mucho más complejas que uno podría desear hacer en el dominio de Fourier, como filtrar frecuencias espaciales altas o bajas (al multiplicarlo con un filtro), o enmascarar puntos discretos correspondientes al ruido. En consecuencia, hay una gran cantidad de código generado por la comunidad para manejar las operaciones comunes de Fourier disponibles en el sitio principal del repositorio comunitario de Matlab, el Intercambio de archivos .