Estimaciones de densidad del espectro de potencia utilizando FFT
En este ejemplo se muestra cómo obtener estimaciones equivalentes de la densidad del espectro de potencia (PSD) no paramétricas utilizando periodogram
y fft
. Los distintos casos muestran cómo escalar correctamente el resultado de fft
para entradas de longitud par, para frecuencias normalizadas y frecuencias en hercios, y para estimaciones de la PSD unilaterales y bilaterales. En todos los casos se utiliza una ventana rectangular.
Este ejemplo se centra en señales estacionarias cuyo contenido de frecuencia es constante en el tiempo. En el caso de las señales no estacionarias con contenido de frecuencia dependiente del tiempo, la transformada de Fourier de tiempo corto es una mejor herramienta de análisis. Para obtener más información, consulte Spectrogram Computation with Signal Processing Toolbox.
Entrada de longitud par con tasa de muestreo
Obtenga el periodograma para una señal de longitud par muestreada a 1 kHz utilizando fft
y periodogram
. Compare los resultados.
Cree una señal compuesta por una onda sinusoidal de 100 Hz en N(0,1) ruido aditivo. La frecuencia de muestreo es 1 kHz. La longitud de la señal es de 1000 muestras.
fs = 1000; t = 0:1/fs:1-1/fs; x = cos(2*pi*100*t) + randn(size(t));
Obtenga el periodograma utilizando fft
. La señal tiene valor real y longitud par. Puesto que la señal tiene valor real, solo necesita estimaciones de potencia para las frecuencias positivas o negativas. Para conservar la potencia total, multiplique todas las frecuencias en ambos conjuntos (las frecuencias positivas y negativas) por un factor de dos. La frecuencia cero (DC) y la frecuencia de Nyquist no se producen dos veces. Represente el resultado.
N = length(x); xdft = fft(x); xdft = xdft(1:N/2+1); psdx = (1/(fs*N)) * abs(xdft).^2; psdx(2:end-1) = 2*psdx(2:end-1); freq = 0:fs/length(x):fs/2; plot(freq,pow2db(psdx)) grid on title("Periodogram Using FFT") xlabel("Frequency (Hz)") ylabel("Power/Frequency (dB/Hz)")
Calcule y represente el periodograma utilizando periodogram
. Muestre que los dos resultados son idénticos.
periodogram(x,rectwin(N),N,fs)
mxerr = max(psdx'-periodogram(x,rectwin(N),N,fs))
mxerr = 3.4694e-18
Entrada con frecuencia normalizada
Utilice fft
para generar un periodograma para una entrada utilizando frecuencia normalizada. Cree una señal compuesta por una onda sinusoidal en N(0,1) ruido aditivo. La onda sinusoidal tiene una frecuencia angular de rad/muestra.
N = 1000; n = 0:N-1; x = cos(pi/4*n) + randn(size(n));
Obtenga el periodograma utilizando fft
. La señal tiene valor real y longitud par. Puesto que la señal tiene valor real, solo necesita estimaciones de potencia para las frecuencias positivas o negativas. Para conservar la potencia total, multiplique todas las frecuencias en ambos conjuntos (las frecuencias positivas y negativas) por un factor de dos. La frecuencia cero (DC) y la frecuencia de Nyquist no se producen dos veces. Represente el resultado.
xdft = fft(x); xdft = xdft(1:N/2+1); psdx = (1/(2*pi*N)) * abs(xdft).^2; psdx(2:end-1) = 2*psdx(2:end-1); freq = 0:2*pi/N:pi; plot(freq/pi,pow2db(psdx)) grid on title("Periodogram Using FFT") xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Power/Frequency (dB/(rad/sample))")
Calcule y represente el periodograma utilizando periodogram
. Muestre que los dos resultados son idénticos.
periodogram(x,rectwin(N),N)
mxerr = max(psdx'-periodogram(x,rectwin(N),N))
mxerr = 4.4409e-16
Entrada de valor complejo con frecuencia normalizada
Utilice fft
para generar un periodograma para una entrada de valor complejo con frecuencia normalizada. La señal es una exponencial compleja con una frecuencia angular de rad/muestra en ruido N(0,1) de valor complejo.
N = 1000; n = 0:N-1; x = exp(1j*pi/4*n) + [1 1j]*randn(2,N)/sqrt(2);
Utilice fft
para obtener el periodograma. Puesto que la entrada es de valor complejo, obtenga el periodograma a partir de rad/muestra. Represente el resultado.
xdft = fft(x); psdx = (1/(2*pi*N)) * abs(xdft).^2; freq = 0:2*pi/N:2*pi-2*pi/N; plot(freq/pi,pow2db(psdx)) grid on title("Periodogram Using FFT") xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Power/Frequency (dB/(rad/sample))")
Utilice periodogram
para obtener y representar el periodograma. Compare las estimaciones de PSD.
periodogram(x,rectwin(N),N,"twosided")
mxerr = max(psdx'-periodogram(x,rectwin(N),N,"twosided"))
mxerr = 2.2204e-16
Consulte también
Apps
Funciones
fft
|periodogram
|pspectrum