¿Por qué tengo fugas de frecuencia en DFT después del relleno cero si la resolución de frecuencia es buena?

12

Consideremos este ejemplo:

Fs=1000; 
Ns=500;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);
X=fft(x);

En este escenario, la resolución de frecuencia es 2 y todos los componentes de frecuencia se capturan correctamente. Sin embargo, si hago esto:

  X=fft(x,1000);

la resolución de frecuencia es 1, pero hay una fuga espectral. Efecto similar se ve aquí . Me parece que las transformadas de Fourier de ambas ventanas (una con una longitud de 500 y otra con una longitud de 1000) tienen ceros en las frecuencias que se presentan en la señal, así que no veo por qué ocurrirá una fuga.

usuario3616359
fuente
el relleno cero no reducirá la fuga espectral aparente, pero solo hará que las protuberancias de la fuga espectral parezcan más suaves.
Robert Bristow-Johnson

Respuestas:

18

N Δf

Δf=fsN

Δf2Hz

N10001Hzsincsinc


sincsinc

ingrese la descripción de la imagen aquí

sinc0sinc


N=1000N=10000

ingrese la descripción de la imagen aquí

Y una parte ampliada:

ingrese la descripción de la imagen aquí

Cosas a tener en cuenta:

  • N=500

  • También podemos observar el ruido FFT en la parte inferior.

  • N=10000sinc


Y obviamente el código para reproducir los resultados:

Fs=1000; 
Ns=500;
Ns2=1000;
Ns3=10000;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);

X1 = abs(fft(x))/length(x);
X2 = abs(fft(x, Ns2))/Ns;
X3 = abs(fft(x, Ns3))/Ns;

F1 = 0:Fs/Ns:Fs-Fs/Ns;
F2 = 0:Fs/Ns2:Fs-Fs/Ns2;
F3 = 0:Fs/Ns3:Fs-Fs/Ns3;

plot(F1, 20*log10(X1))
hold on
plot(F2, 20*log10(X2))
plot(F3, 20*log10(X3))
xlim([0, Fs/2])
grid on
legend({'N=500', 'N=1000', 'N=10000'})
jojek
fuente
1
Respuesta muy completa +1. "[...] solo aumentará el espaciado de frecuencia". Debería ser disminución , supongo.
Matt L.
2

La fuga espectral suele ser otro nombre para el efecto de convolución de Sinc o el artefacto de la ventana rectangular en el otro dominio (t o tiempo en su caso). Y el relleno cero se realiza agregando una ventana rectangular (que es su información original que no es cero) a una FFT más larga.

Su hipótesis de que el FT debe ser cero en todas las frecuencias menos una es en general falsa. Cualquier señal de longitud finita (y distinta de cero) tendrá una extensión infinita de espectro distinto de cero. Esa extensión infinita del espectro (en forma de Sinc, o la transformación de otras ventanas) pasará a ser invisible en un resultado DFT / FFT solo para sinusoides puros que abarcan todo el ancho FFT con una periodicidad entera exacta en ese ancho. El relleno cero no lo permite.

hotpaw2
fuente
1

La fuga surge notablemente con ventanas de longitud finita, que siempre tiene en la práctica. Sin embargo, si tiene exactamente un número entero de períodos de sus componentes sinusoidales, la periodización inherente FFT actúa como si los senos fueran "infinitos", y sus frecuencias caen exactamente en contenedores discretos. Y así, la fuga se cancela de alguna manera, por pura suerte: si supiera de antemano el período de su señal, no necesitaría analizarlo con las herramientas de Fourier.

Con el relleno cero ya no tienes un seno puro. Tampoco con período múltiple de ventana múltiple. Estás concatenando trozos de senos que tienen cambios abruptos en los límites de la ventana. Entonces, toda la señal periodizada ya no es un "seno infinito". Por lo tanto, puede obtener lo que asimila con las fugas, pero que es un efecto de relleno cero, como lo explica perfectamente @jojek.

Laurent Duval
fuente