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
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
E una parte ingrandita:
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'})