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.

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 π/4 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 π/4 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 [0,2π) 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

Sitios web externos