Pourquoi la transformée de Fourier d'un cycle d'onde sinusoïdale unique n'est-elle pas une barre unique?

12

J'ai essayé différents codes de transformée de Fourier sur des ondes sinusoïdales uniques, et tous produisent un spectre distribué avec une résonance à la fréquence du signal alors qu'ils devraient théoriquement afficher une seule barre.

La fréquence d'échantillonnage a peu d'effet (10 kHz ici), cependant le nombre de cycles:

Un cycle:

entrez la description de l'image ici

100 cycles:

entrez la description de l'image ici

100000 cycles:

entrez la description de l'image ici

Il semble que la transformée de Fourier ne converge que pour un nombre infini de cycles, pourquoi? Une fenêtre temporelle d'exactement un cycle ne devrait-elle pas apporter les mêmes résultats que celle de N cycles?

Application: C'est à la fois par curiosité et aussi parce que je veux savoir à quel point la réponse échelonnée d'un système de premier ordre excitera la résonance d'un assemblage mécanique. J'ai donc besoin d'une transformée de Fourier précise de la réponse ... à laquelle je ne fais plus confiance. Que pourrais-je faire pour améliorer la précision alors, sur la base du cas de "l'onde sinusoïdale"?

entrez la description de l'image ici

PS: Ces captures d'écran particulières sont basées sur le code ici .

Monsieur Mystère
la source
6
En plus de la réponse acceptée, notez qu'il n'y a aucune raison de croire que la transformée de Fourier à temps discret (que vous calculez en utilisant la DFT) serait une impulsion pour un signal d'entrée qui est une période d'une sinusoïde. La transformée de Fourier à temps continu d'une sinusoïde est une impulsion, oui, mais cette sinusoïde est d'une durée infinie. Lorsque vous limitez le signal dans le temps, cela revient à multiplier par une fonction de fenêtre rectangulaire. Le résultat dans le domaine fréquentiel est la convolution de l'impulsion et la transformée de Fourier de la fenêtre, qui est essentiellement ce que vous observez.
Jason R
Merci pour la remarque. Alors, comment expliquez-vous que si je change le nombre NFFT en longueur du vecteur, le résultat est une seule barre?
Monsieur Mystère du
1
Bonne question. Cela se produit en raison d'une hypothèse inhérente à la DFT. Le signal de longueur finie donné à l'entrée de la TFD est supposé s'étendre périodiquement dans les deux directions avec une durée infinie. Par conséquent, lorsque vous avez un nombre entier de cycles à l'intérieur de "l'ouverture" de la TFD, vous vous retrouvez avec la transformation d'une sinusoïde de durée infinie: une seule impulsion. Cela correspond au cas d'une fuite spectrale exactement nulle et se produit rarement en pratique.
Jason R

Réponses:

30

Il s'agit d'un artefact de fenêtrage.

Le code lié remplit un 10 000 échantillon de signal avec des zéros de sorte que la longueur est une puissance de deux.

%% Author :- Embedded Laboratory

%%This Project shows how to apply FFT on a signal and its physical 
% significance.

fSampling = 10000;          %Sampling Frequency
tSampling = 1/fSampling;    %Sampling Time
L = 10000;                  %Length of Signal
t = (0:L-1)*tSampling;      %Time Vector
F = 100;                    %Frequency of Signal

%% Signal Without Noise
xsig = sin(2*pi*F*t);
...

%%Frequency Transform of above Signal
subplot(2,1,2)
NFFT = 2^nextpow2(L);
Xsig = fft(xsig,NFFT)/L;
...

Notez que dans le code ci-dessus, la FFT est prise avec la taille FFT NFFTqui est la puissance suivante de 2 plus grande que la longueur du signal (dans ce cas, 16,384.) De la documentation Mathworksfft() :

Y = fft(X,n)renvoie la DFT à n points. fft(X)est équivalent à fft(X, n)nest la taille de Xla première dimension non-singleton. Si la longueur de Xest inférieure à n, Xest complétée par des zéros à droite n. Si la longueur de Xest supérieure à n, la séquence Xest tronquée. Quand Xest une matrice, la longueur des colonnes est ajustée de la même manière.

Cela signifie que vous ne prenez pas réellement une FFT d'une «onde sinusoïdale pure» - vous prenez la FFT d'une onde sinusoïdale avec un signal plat après.

Cela équivaut à prendre la FFT d'une onde sinusoïdale multipliée par une fonction de fenêtre carrée. Le spectre FFT est alors la convolution du spectre de fréquence d'onde sinusoïdale (une fonction d'impulsion) avec le spectre de fréquence d'onde carrée (sinc (f).)

Si vous changez L = 16,384pour qu'il n'y ait pas de remplissage nul du signal, vous observerez une perfectFFT.

Autres mots-clés de recherche: "Spectral Leakage", "Window Function", "Hamming Window".


Edit: J'ai nettoyé certains documents que j'ai écrits sur ce sujet à l'université, qui sont beaucoup plus détaillés. Je l'ai posté sur mon blog .

Li-aung Yip
la source
C'était juste devant mon visage pendant tout ce temps. Bravo monsieur, je viens de changer le nombre NFFT en longueur du vecteur et ça l'a fait.
Monsieur Mystère
1
@ MisterMystère: Voir modifier pour le lien vers le matériel pertinent que j'ai écrit à l'université. Une explication beaucoup plus approfondie, y compris des photos.
Li-aung Yip
(Bien que j'aie oublié de
retaper
Juste un rappel qu'il y a peu d'avantages à passer à nextpow2 en utilisant des algorithmes matlab FFT, qui je crois est fftw (la transformation de Fourier la plus rapide dans l'ouest)
Scott Seidman