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?
fft
frequency-spectrum
dft
user3616359
la source
la source
Réponses:
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
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 .Δf 2Hz
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 .N 1000 1Hz sinc sinc
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 .sinc de 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.sinc 0 sinc
Voici ce qui se passe pour et :N=1000 N=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=10000 sinc
Et évidemment le code pour reproduire les résultats:
la source
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.
la source
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.
la source