Pourquoi ai-je une fuite de fréquence dans DFT après un remplissage nul si la résolution de fréquence est correcte?


12

Prenons cet exemple:

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

Dans ce scénario, la résolution de fréquence est de 2 et toutes les composantes de fréquence sont capturées correctement. Cependant, si je fais cela:

  X=fft(x,1000);

la résolution en fréquence est de 1, mais il y a une fuite spectrale. Un effet similaire est observé ici . Il me semble que les transformées de Fourier des deux fenêtres (une de longueur 500 et une de longueur 1000) ont des zéros aux fréquences qui sont présentées dans le signal, donc je ne vois pas pourquoi une fuite se produira?


le zéro-padding ne réduira pas les fuites spectrales apparentes, mais rendra seulement les bosses de fuites spectrales plus lisses.
robert bristow-johnson

Réponses:


18

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Et une partie zoomée:

entrez la description de l'image ici

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

1
Réponse très complète +1. "[...] vous n'augmenterez que l'espacement des fréquences." Elle devrait être diminuée je suppose.
Matt L.

2

La fuite spectrale est généralement un autre nom pour l'effet de convolution Sinc ou l'artefact du fenêtrage rectangulaire dans l'autre domaine (t ou temps dans votre cas). Et le remplissage nul est effectué en ajoutant une fenêtre rectangulaire (qui est vos données d'origine non nulles) à une FFT plus longue.

Votre hypothèse selon laquelle le FT devrait être nul du tout, mais une fréquence est fausse en général. Tout signal de longueur finie (et non nul) aura une étendue infinie de spectre non nul. Cette étendue infinie de spectre (en forme de Sinc ou la transformation d'autres fenêtres) se révélera invisible dans un résultat DFT / FFT uniquement pour les sinusoïdes pures qui s'étendent sur toute la largeur de la FFT avec une périodicité entière exacte dans cette largeur. Le remplissage nul ne permet pas cela.


1

Les fuites surviennent notamment avec les fenêtres de longueur finie, que vous avez toujours en pratique. Cependant, si vous avez exactement un nombre entier de périodes de vos composantes sinusoïdales, la périodisation inhérente à la FFT agit comme si les sinus étaient "infinis", et ses fréquences tombent exactement sur des cases discrétisées. Et ainsi la fuite est en quelque sorte annulée, par pure chance: si vous connaissiez à l'avance la période de votre signal, vous n'auriez pas besoin de l'analyser avec les outils de Fourier.

Avec le rembourrage zéro, vous n'avez plus de sinus pur. Ni avec une fenêtre multiple de période non entière. Vous concaténez des morceaux de sinus qui ont des changements brusques aux limites de la fenêtre. Le signal périodisé n'est donc plus un "sinus infini". Par conséquent, vous pouvez obtenir ce que vous assimilez à une fuite, mais qui est un effet de remplissage nul, comme parfaitement expliqué par @jojek.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.