Perché ho una perdita di frequenza in DFT dopo zero padding se la risoluzione della frequenza va bene?


12

Consideriamo questo esempio:

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);

In questo scenario, la risoluzione della frequenza è 2 e tutti i componenti della frequenza vengono acquisiti correttamente. Tuttavia, se lo faccio:

  X=fft(x,1000);

la risoluzione della frequenza è 1, ma c'è una perdita spettrale. Effetto simile si vede qui . Mi sembra che le trasformate di Fourier di entrambe le finestre (una con lunghezza 500 e una con lunghezza 1000) abbiano zeri alle frequenze presentate nel segnale, quindi non vedo perché si verificherà una perdita?


lo zero padding non ridurrà la perdita spettrale apparente, ma renderà solo più morbidi i dossi della perdita spettrale.
robert bristow-johnson l'

Risposte:


18

Questo fenomeno non ha nulla a che fare con la perdita spettrale. Quello che stai osservando è l'effetto di zero padding. Dato un numero di campioni , esiste una risoluzione di frequenza massima possibile che può essere raggiunta:N Δf

Δf=fsN

Nel tuo caso, è esattamente . Se si azzera il segnale, non ci sono informazioni aggiuntive da recuperare: si riduce solo la spaziatura di frequenza .Δf2Hz

Nell'esempio sopra, quando aumenti a , ottieni una spaziatura di frequenza di . Tutti i campioni extra osservati sono semplicemente un'interpolazione, fatta dalla funzione finestra ( nel tuo caso). Inizierai ad osservare i lobi laterali dello spettro delle finestre. Poiché hai implicitamente moltiplicato il tuo segnale per una finestra rettangolare, ciò comporterà la convoluzione dello spettro del tuo segnale (due Dirac + DC) con la funzione .N10001Hzsincsinc


Un altro modo di vederlo è immaginare che DFT sia fondamentalmente un banco di filtri, costituito da funzioni spostate . Questi sono allineati in modo tale che quel picco di uno è dove sono presenti gli zeri di tutti i rimanenti. Se inizi a cercare tra quegli zeri , inizierai a prendere quei campioni. Ecco un esempio di trama di tale banco filtro .sincsinc

inserisci qui la descrizione dell'immagine

Immaginiamo che sia presente la frequenza corrispondente al filtro blu. Ciò produrrà l'ampiezza in un contenitore corrispondente. Tutte le frequenze rimanenti non sono presenti (arancione e giallo), quindi moltiplichi quelle per e non ottieni nulla nei bin. Nel caso di zero padding, non sarà più così. I campioni di quel blu cadranno nei contenitori intermedi e saranno sinc-interpolati.sinc0sinc


Ecco cosa succede per e :N=1000N=10000

inserisci qui la descrizione dell'immagine

E una parte ingrandita:

inserisci qui la descrizione dell'immagine

Cose da notare:

  • Per , non vi è alcuna perdita. Ci sono picchi perfetti, che rappresentano ciascuna delle tue frequenze e offset DC.N=500

  • Possiamo anche osservare il rumore FFT in fondo.

  • Per la forma della funzione è chiaramente visibile.N=10000sinc


E ovviamente il codice per riprodurre i risultati:

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'})

1
Risposta molto completa +1. "[...] aumenterai solo la spaziatura di frequenza." Dovrebbe essere una diminuzione, suppongo.
Matt L.

2

La perdita spettrale è in genere un altro nome per l'effetto di convoluzione Sinc o artefatto di finestre rettangolari nell'altro dominio (t o tempo nel tuo caso). E lo zero padding viene fatto aggiungendo una finestra rettangolare (che è i dati originali diversi dallo zero pad) a un FFT più lungo.

La tua ipotesi che l'FT dovrebbe essere zero ma una frequenza è falsa in generale. Qualsiasi segnale a lunghezza finita (e diverso da zero) avrà un'estensione infinita di spettro diverso da zero. Quell'estensione infinita di spettro (a forma di sincro, o la trasformazione di altre finestre) risulterà invisibile in un risultato DFT / FFT solo per sinusoidi puri che coprono l'intera larghezza FFT con la periodicità intera esatta in quella larghezza. L'imbottitura zero non lo consente.


1

Le perdite si verificano in particolare con finestre a lunghezza finita, che hai sempre in pratica. Tuttavia, se si dispone esattamente di un numero intero di periodi dei componenti sinusoidali, la periodizzazione intrinseca FFT si comporta come se i seni fossero "infiniti" e le sue frequenze cadano esattamente su bin discretizzati. E così la perdita viene in qualche modo cancellata, per pura fortuna: se conoscessi in anticipo il periodo del tuo segnale, non avresti bisogno di analizzarlo con gli strumenti di Fourier.

Con zero padding non hai più un seno puro. Né con finestra multipla periodo non intero. Stai concatenando pezzi di seno che presentano bruschi cambiamenti ai confini della finestra. Quindi l'intero segnale periodizzato non è più un "seno infinito". Quindi puoi ottenere ciò che assimili con una perdita, ma che è un effetto zero-padding, come spiegato perfettamente da @jojek.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.