Ce phénomène n'a rien à voir avec une fuite spectrale. Ce que vous observez, c'est l'effet du remplissage nul. Etant donné un nombre d'échantillons , il existe une résolution de fréquence maximale possible qui peut être atteinte:NΔ f Δf
Δf=fsN
Dans votre cas, est exactement . Si vous mettez votre signal à zéro, il n'y a pas d'informations supplémentaires à récupérer - vous ne diminuerez que l' espacement des fréquences .Δf2Hz
Dans l'exemple ci-dessus, lorsque vous augmentez à , vous obtenez un espacement de fréquence de . Tous les échantillons supplémentaires observés ne sont qu'une interpolation, effectuée par la fonction window ( dans votre cas). Vous commencerez à observer les lobes latéraux du spectre des fenêtres. Puisque vous avez implicitement multiplié votre signal par une fenêtre rectangulaire, cela entraînera la convolution du spectre de votre signal (deux Dirac + DC) avec la fonction .N10001Hzsincsinc
Une autre façon de voir les choses est d'imaginer que la DFT est fondamentalement une banque de filtres, composée de fonctions décalées . Ceux-ci sont alignés de telle manière, que le sommet de l'un est où les zéros de tous les autres sont présents. Si vous commencez à chercher entre ces zéros , vous commencerez à prendre ces échantillons. Voici un exemple de tracé d'une telle banque de filtres .sincde i n csinc
Imaginons que la fréquence correspondant au filtre bleu soit présente. Cela donnera l'amplitude dans un bac correspondant. Toutes les fréquences restantes ne sont pas présentes (orange et jaune), donc vous multipliez ces par et vous n'obtenez rien dans les bacs. Dans le cas du remplissage nul, ce ne sera plus le cas. Des échantillons de ce bleu tomberont dans les cases intermédiaires et seront interpolés sinc.sinc0sinc
Voici ce qui se passe pour et :N=1000N=10000
Et une partie zoomée:
A noter:
Pour , il n'y a aucune fuite. Il y a des pointes parfaites, représentant chacune de vos fréquences et décalage CC.N=500
Nous pouvons également observer le bruit FFT tout en bas.
Pour la forme de la fonction est clairement visible.N=10000sinc
Et évidemment le code pour reproduire les résultats:
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'})