Main Content

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). Y tiene el mismo tamaño que X.

  • 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 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

Encuentre los componentes de frecuencia de una señal enterrada en ruido y las amplitudes de las frecuencias de pico mediante la transformada de Fourier.

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 que contenga un desplazamiento de CC de 0,8 de amplitud, una sinusoide de 50 Hz de 0,7 de amplitud y una sinusoide de 120 Hz de 1 de amplitud.

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

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

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

Represente la señal ruidosa en el dominio del tiempo. Los componentes de la frecuencia no se pueden ver en la gráfica.

plot(1000*t,X)
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, xlabel t (milliseconds), ylabel X(t) contains an object of type line.

Calcule la transformada de Fourier de la señal.

Y = fft(X);

Debido a que las transformadas de Fourier incluyen números complejos, represente la magnitud compleja del espectro fft.

plot(Fs/L*(0:L-1),abs(Y),"LineWidth",3)
title("Complex Magnitude of fft Spectrum")
xlabel("f (Hz)")
ylabel("|fft(X)|")

Figure contains an axes object. The axes object with title Complex Magnitude of fft Spectrum, xlabel f (Hz), ylabel |fft(X)| contains an object of type line.

La gráfica muestra cinco picos de frecuencia, incluido el pico de 0 Hz del desplazamiento de CC. En este ejemplo, se espera que la señal tenga tres picos de frecuencia en 0 Hz, 50 Hz y 120 Hz. Aquí, la segunda mitad de la gráfica es un reflejo de la primera mitad, pero sin incluir el pico de 0 Hz. Se debe a que la transformada discreta de Fourier de una señal en el dominio del tiempo tiene una naturaleza periódica, donde la primera mitad de su espectro se encuentra en frecuencias positivas y la otra en frecuencias negativas, y el primer elemento se reserva para la frecuencia cero.

Para señales reales, el espectro fft es un espectro de dos lados, donde el espectro de las frecuencias positivas es el conjugado complejo del espectro de las frecuencias negativas. Para mostrar el espectro fft en las frecuencias positivas y negativas, puede utilizar fftshift. Para que L tenga una longitud igualada, el dominio de frecuencia empieza desde la frecuencia negativa de Nyquist -Fs/2 hasta Fs/2-Fs/L con un espacio o resolución de frecuencia de Fs/L.

plot(Fs/L*(-L/2:L/2-1),abs(fftshift(Y)),"LineWidth",3)
title("fft Spectrum in the Positive and Negative Frequencies")
xlabel("f (Hz)")
ylabel("|fft(X)|")

Figure contains an axes object. The axes object with title fft Spectrum in the Positive and Negative Frequencies, xlabel f (Hz), ylabel |fft(X)| contains an object of type line.

Para encontrar las amplitudes de los tres picos de frecuencia, convierta el espectro fft en Y en el espectro de amplitud de un lado. Como la función fft incluye un factor de escalado L entre la señal original y la transformada, vuelva a escalar Y dividiéndolo entre L. Tome la magnitud compleja del espectro fft. El espectro de amplitud de dos lados P2, donde el espectro de las frecuencias positivas es el conjugado complejo del espectro de las frecuencias negativas, tiene la mitad de amplitudes de pico de la señal del dominio del tiempo. Para convertirlo en un espectro de un lado, coja la primera mitad del espectro de dos lados P2. Multiplique por 2 el espectro de las frecuencias positivas. No es necesario que multiplique por 2 P1(1) y P1(end), ya que estas amplitudes corresponden a la frecuencia 0 y la frecuencia de Nyquist, respectivamente, y no tienen pares de conjugados complejos en las frecuencias negativas.

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 para el espectro de un lado. Represente el espectro de amplitud de un lado P1. Como cabía esperar, las amplitudes no son exactas, sino que están cerca de 0,8, 0,7 y 1 debido al ruido añadido. En la mayoría de los casos, las señales más largas producen mejores aproximaciones de frecuencia.

f = Fs/L*(0:(L/2));
plot(f,P1,"LineWidth",3) 
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), xlabel f (Hz), ylabel |P1(f)| contains an object of type line.

Ahora tome la transformada de Fourier de la señal original sin corromper y recupere las amplitudes exactas en 0,8, 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,"LineWidth",3) 
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), xlabel f (Hz), ylabel |P1(f)| 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, xlabel Time (t), ylabel X(t) 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/sqrt(n)).^2;

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

Figure contains an axes object. The axes object with title Gaussian Pulse in Frequency Domain, xlabel f (Hz), ylabel |P(f)| 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), xlabel Frequency (Hz), ylabel |y| contains an object of type stem.

Calcule la fase de la transformada eliminando los valores de la transformada de magnitudes pequeñas. 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), xlabel Frequency (Hz), ylabel Phase/ pi 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, xlabel t (ms), ylabel X(t) 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, xlabel f (Hz), ylabel |P1(f)| 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, xlabel f (Hz), ylabel |P1(f)| 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 (con 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