Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

fft

Transformada rápida de Fourier

Descripción

ejemplo

Y = fft(X) calcula la transformada discreta de Fourier (DFT) de X utilizando un algoritmo de transformada rápida de Fourier (FFT).

  • Si X es un vector, fft(X) devuelve la transformada de Fourier del vector.

  • Si X es una matriz, fft(X) trata las columnas de X como vectores y devuelve la transformada de Fourier de cada columna.

  • Si X es un arreglo multidimensional, fft(X) trata los valores en la primera dimensión del arreglo cuyo tamaño no es igual a 1 como vectores y devuelve la transformada de Fourier de cada vector.

ejemplo

Y = fft(X,n) devuelve la DFT de n puntos. Si no se especifica ningún valor, Y tiene el mismo tamaño que X.

  • Si X es un vector y la longitud de X es menor que n, X se rellena con ceros finales hasta la longitud n.

  • Si X es un vector y la longitud de X es mayor que n, X está truncado a la longitud n.

  • Si X es una matriz, cada columna se trata como en el caso del vector.

  • Si X es un arreglo multidimensional, la primera dimensión del arreglo cuyo tamaño no es igual a 1 se trata como en el caso del vector.

ejemplo

Y = fft(X,n,dim) devuelve la transformada de Fourier en la dimensión dim. Por ejemplo, si X es una matriz, fft(X,n,2) devuelve la transformada de Fourier de n puntos de cada fila.

Ejemplos

contraer todo

Use las transformadas de Fourier para encontrar los componentes de frecuencia de una señal enterrada en ruido.

Especifique los parámetros de una señal con una frecuencia de muestreo de 1 kHz y una duración de señal de 1,5 segundos.

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

Forme una señal con una sinusoide de 50 Hz de 0,7 de amplitud y una sinusoide de 120 Hz de 1 de amplitud.

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

Corrompa la señal con ruido blanco de media cero con una varianza de 4.

X = S + 2*randn(size(t));

Represente la señal ruidosa en el dominio del tiempo. Es difícil identificar los componentes de frecuencia mirando la señal X(t).

plot(1000*t(1:50),X(1:50))
title("Signal Corrupted with Zero-Mean Random Noise")
xlabel("t (milliseconds)")
ylabel("X(t)")

Figure contains an axes object. The axes object with title Signal Corrupted with Zero-Mean Random Noise contains an object of type line.

Calcule la transformada de Fourier de la señal.

Y = fft(X);

Calcule el espectro de dos lados P2. Luego calcule el espectro de un lado P1 basado en P2 y la longitud de señal de valor par L.

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

Defina el dominio de la frecuencia f y represente el espectro de amplitud de un lado P1. Las amplitudes no están exactamente en 0,7 y 1, tal y como se esperaba, debido al ruido añadido. De media, las señales más largas producen mejores aproximaciones de frecuencia.

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title("Single-Sided Amplitude Spectrum of X(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

Figure contains an axes object. The axes object with title Single-Sided Amplitude Spectrum of X(t) contains an object of type line.

Ahora tome la transformada de Fourier de la señal original sin corromper y recupere las amplitudes exactas, 0,7 y 1,0.

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title("Single-Sided Amplitude Spectrum of S(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

Figure contains an axes object. The axes object with title Single-Sided Amplitude Spectrum of S(t) contains an object of type line.

Convierta un pulso gaussiano del dominio del tiempo al dominio de la frecuencia.

Especifique los parámetros de una señal con una frecuencia de muestreo de 44,1 kHz y una duración de señal de 1 ms. Cree un pulso gaussiano con una desviación estándar de 0,1 ms.

Fs = 44100;         % Sampling frequency
T = 1/Fs;           % Sampling period
t = -0.5:T:0.5;     % Time vector
L = length(t);      % Signal length

X = 1/(0.4*sqrt(2*pi))*(exp(-t.^2/(2*(0.1*1e-3)^2)));

Represente el pulso en el dominio del tiempo.

plot(t,X)
title("Gaussian Pulse in Time Domain")
xlabel("Time (t)")
ylabel("X(t)")
axis([-1e-3 1e-3 0 1.1]) 

Figure contains an axes object. The axes object with title Gaussian Pulse in Time Domain contains an object of type line.

El tiempo de ejecución de fft depende de la longitud de la transformada. Las longitudes de transformada que solo tienen factores primos pequeños dan como resultado tiempos de ejecución significativamente más rápidos que las que tienen factores primos grandes.

En este ejemplo, la longitud de señal L es 44,101, que es un número primo muy grande. Para mejorar el rendimiento de fft, identifique una longitud de entrada que sea la siguiente potencia de 2 de la longitud de señal original. Llamar a fft con esta longitud de entrada rellena el pulso X con ceros al final hasta la longitud de transformada especificada.

n = 2^nextpow2(L);

Convierta el pulso gaussiano al dominio de la frecuencia.

Y = fft(X,n);

Defina el dominio de la frecuencia y represente las frecuencias únicas.

f = Fs*(0:(n/2))/n;
P = abs(Y/n).^2;

plot(f,P(1:n/2+1)) 
title("Gaussian Pulse in Frequency Domain")
xlabel("f (Hz)")
ylabel("|P(f)|^2")

Figure contains an axes object. The axes object with title Gaussian Pulse in Frequency Domain contains an object of type line.

Compare las ondas de coseno del dominio del tiempo y del dominio de la frecuencia.

Especifique los parámetros de una señal con una frecuencia de muestreo de 1 kHz y una duración de señal de 1 segundo.

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

Cree una matriz en la que cada fila represente una onda de coseno con frecuencia escalada. El resultado, X, es una matriz de 3 por 1.000. La primera fila tiene una frecuencia de onda de 50, la segunda fila tiene una frecuencia de onda de 150 y la tercera fila tiene una frecuencia de onda de 300.

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave

X = [x1; x2; x3];

Represente las primeras 100 entradas de cada fila de X en una única figura en orden y compare sus frecuencias.

for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title("Row " + num2str(i) + " in the Time Domain")
end

Figure contains 3 axes objects. Axes object 1 with title Row 1 in the Time Domain contains an object of type line. Axes object 2 with title Row 2 in the Time Domain contains an object of type line. Axes object 3 with title Row 3 in the Time Domain contains an object of type line.

Especifique el argumento dim para usar fft en las filas de X, es decir, para cada señal.

dim = 2;

Calcule la transformada de Fourier de las señales.

Y = fft(X,L,dim);

Calcule el espectro de dos lados y el espectro de un lado de cada señal.

P2 = abs(Y/L);
P1 = P2(:,1:L/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

En el dominio de la frecuencia, represente el espectro de amplitud de un lado para cada fila en una única figura.

for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/L):(Fs/2-Fs/L),P1(i,1:L/2))
    title("Row " + num2str(i) + " in the Frequency Domain")
end

Figure contains 3 axes objects. Axes object 1 with title Row 1 in the Frequency Domain contains an object of type line. Axes object 2 with title Row 2 in the Frequency Domain contains an object of type line. Axes object 3 with title Row 3 in the Frequency Domain contains an object of type line.

Cree una señal que conste de dos sinusoides de frecuencias 15 Hz y 40 Hz. La primera sinusoide es una onda de coseno con fase -π/4 y la segunda es una onda de coseno con fase π/2. Muestree la señal a 100 Hz durante 1 s.

Fs = 100;
t = 0:1/Fs:1-1/Fs;
x = cos(2*pi*15*t - pi/4) + cos(2*pi*40*t + pi/2);

Calcule la transformada de Fourier de la señal. Represente la magnitud de la transformada como una función de frecuencia.

y = fft(x);
z = fftshift(y);

ly = length(y);
f = (-ly/2:ly/2-1)/ly*Fs;
stem(f,abs(z))
title("Double-Sided Amplitude Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("|y|")
grid

Figure contains an axes object. The axes object with title Double-Sided Amplitude Spectrum of x(t) contains an object of type stem.

Calcule la fase de la transformada eliminando los valores de transformada de magnitud pequeña. Represente la fase como una función de frecuencia.

tol = 1e-6;
z(abs(z) < tol) = 0;

theta = angle(z);

stem(f,theta/pi)
title("Phase Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("Phase/\pi")
grid

Figure contains an axes object. The axes object with title Phase Spectrum of x(t) contains an object of type stem.

Interpole la transformada de Fourier de una señal rellenándola con ceros.

Especifique los parámetros de una señal con una frecuencia de muestreo de 80 Hz y una duración de señal de 0,8 s.

Fs = 80;
T = 1/Fs;
L = 65;
t = (0:L-1)*T;

Cree una superposición de una señal sinusoidal de 2 Hz y sus armónicos más altos. La señal contiene una onda de coseno de 2 Hz, una onda de coseno de 4 Hz y una onda de seno de 6 Hz.

X = 3*cos(2*pi*2*t) + 2*cos(2*pi*4*t) + sin(2*pi*6*t);

Represente la señal en el dominio del tiempo.

plot(t,X)
title("Signal superposition in time domain")
xlabel("t (ms)")
ylabel("X(t)")

Figure contains an axes object. The axes object with title Signal superposition in time domain contains an object of type line.

Calcule la transformada de Fourier de la señal.

Y = fft(X);

Calcule el espectro de amplitud de un lado de la señal.

f = Fs*(0:(L-1)/2)/L;
P2 = abs(Y/L);
P1 = P2(1:(L+1)/2);
P1(2:end) = 2*P1(2:end);

En el dominio de la frecuencia, represente el espectro de un lado. Dado que el muestreo de tiempo de la señal es bastante corto, la resolución de frecuencia de la transformada de Fourier no es lo suficientemente precisa para mostrar la frecuencia de pico cerca de 4 Hz.

plot(f,P1,"-o") 
title("Single-Sided Spectrum of Original Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")

Figure contains an axes object. The axes object with title Single-Sided Spectrum of Original Signal contains an object of type line.

Para evaluar mejor las frecuencias de pico, puede aumentar la longitud de la ventana de análisis rellenando la señal original con ceros. Este método interpola automáticamente la transformada de Fourier de la señal con una resolución de frecuencia más precisa.

Identifique una nueva longitud de entrada que sea la siguiente potencia de 2 de la longitud de señal original. Rellene la señal X con ceros finales para ampliar su longitud. Calcule la transformada de Fourier de la señal rellenada con ceros.

n = 2^nextpow2(L);
Y = fft(X,n);

Calcule el espectro de amplitud de un lado de la señal rellenada. Dado que la longitud de la señal n aumenta de 65 a 128, la resolución de frecuencia se convierte en Fs/n, que es 0,625 Hz.

f = Fs*(0:(n/2))/n;
P2 = abs(Y/L);
P1 = P2(1:n/2+1);
P1(2:end-1) = 2*P1(2:end-1);

Represente el espectro de un lado de la señal rellenada. Este nuevo espectro muestra las frecuencias de pico cerca de 2 Hz, 4 Hz y 6 Hz dentro de la resolución de frecuencia de 0,625 Hz.

plot(f,P1,"-o") 
title("Single-Sided Spectrum of Padded Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")

Figure contains an axes object. The axes object with title Single-Sided Spectrum of Padded Signal contains an object of type line.

Argumentos de entrada

contraer todo

Arreglo de entrada, especificado como vector, matriz o arreglo multidimensional.

Si X es una matriz de 0 por 0 vacía, fft(X) devuelve una matriz de 0 por 0 vacía.

Tipos de datos: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
Soporte de números complejos:

Longitud de transformada, especificada como [] o un escalar entero no negativo. Especificar un escalar entero positivo para la longitud de transformada puede mejorar el rendimiento de fft. La longitud se especifica normalmente como una potencia de 2 o un valor que puede factorizarse en un producto de números primos pequeños (factores primos no mayores que 7). Si n es menor que la longitud de la señal, fft ignora el resto de valores de señal más allá de la n-ésima entrada y devuelve el resultado truncado. Si n es 0, fft devuelve una matriz vacía.

Ejemplo: n = 2^nextpow2(size(X,1))

Tipos de datos: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

Dimensión en la que operar, especificada como escalar entero positivo. Si no especifica la dimensión, el valor predeterminado es la primera dimensión del arreglo de tamaño mayor que 1.

  • fft(X,[],1) opera en las columnas de X y devuelve la transformada de Fourier de cada columna.

    fft(X,[],1) column-wise operation

  • fft(X,[],2) opera en las filas de X y devuelve la transformada de Fourier de cada fila.

    fft(X,[],2) row-wise operation

Si dim es mayor que ndims(X), fft(X,[],dim) devuelve X. Si se especifica n, fft(X,n,dim) rellena o trunca X a la longitud n en la dimensión dim.

Tipos de datos: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

Argumentos de salida

contraer todo

Representación del dominio de la frecuencia devuelta como vector, matriz o arreglo multidimensional.

Si X es del tipo single, fft calcula de forma nativa en precisión simple e Y es también del tipo single. De lo contrario, Y se devuelve como tipo double.

El tamaño de Y es el siguiente:

  • Para Y = fft(X) o Y = fft(X,[],dim), el tamaño de Y es igual al tamaño de X.

  • Para Y = fft(X,n,dim), el valor de size(Y,dim) es igual a n, mientras que el tamaño del resto de dimensiones se mantiene como en X.

Si X es real, Y es simétrica conjugada y el número de puntos únicos en Y es ceil((n+1)/2).

Tipos de datos: double | single

Más acerca de

contraer todo

Transformada discreta de Fourier de un vector

Y = fft(X) y X = ifft(Y) implementan la transformada de Fourier y la transformada inversa de Fourier, respectivamente. Para X e Y de longitud n, estas transformadas se definen de la siguiente manera:

Y(k)=j=1nX(j)Wn(j1)(k1)X(j)=1nk=1nY(k)Wn(j1)(k1),

donde

Wn=e(2πi)/n

es una de n raíces de unidad.

Sugerencias

  • El tiempo de ejecución de fft depende de la longitud de la transformada. Las longitudes de transformada que solo tienen factores primos pequeños (no mayores que 7) dan como resultado tiempos de ejecución significativamente más rápidos que las que son primos o tienen factores primos grandes.

  • Para la mayoría de valores de n, las DFT de entrada real requieren aproximadamente la mitad de tiempo de cálculo que las DFT de entrada compleja. No obstante, cuando n tiene factores primos grandes la diferencia de velocidad es nula o mínima.

  • Es posible aumentar la velocidad de fft utilizando la función de utilidades, fftw. Esta función controla la optimización del algoritmo usado para calcular una FFT de tamaño y dimensiones específicos.

Algoritmos

Las funciones FFT (fft, fft2, fftn, ifft, ifft2, ifftn) se basan en una biblioteca llamada FFTW [1] [2].

Referencias

[2] Frigo, M., and S. G. Johnson. “FFTW: An Adaptive Software Architecture for the FFT.” Proceedings of the International Conference on Acoustics, Speech, and Signal Processing. Vol. 3, 1998, pp. 1381-1384.

Capacidades ampliadas

Generación de código de GPU
Genere código CUDA® para GPU NVIDIA® mediante GPU Coder™.

Historial de versiones

Introducido antes de R2006a