FFT de l'onde sinusoïdale ne venant pas comme prévu, c'est-à-dire point unique

14

Le tracé cyan est un spectre de 50 Hz, et le magenta est une onde sinusoïdale de 50,1 Hz (ayant une amplitude de 0,7). Les deux sont échantillonnés à 1024 échantillons / s. J'ai effectué une FFT de 1024 points pour obtenir ce spectre.

Pourquoi le spectre 50 Hz n'est-il qu'une seule valeur? Pourquoi le sinus 50,1 Hz est-il composé d'autres fréquences que 50,1 Hz? d'où viennent ces nouvelles fréquences?

Je n'ai fait aucun traitement non linéaire sur le signal 50,1 Hz! De plus, le 50,1 Hz semble avoir une amplitude maximale plus petite, c'est-à-dire qu'il n'est pas de 0,7, alors qu'en fait l'onde sinusoïdale que j'ai générée a une amplitude de 0,7.

Pourquoi est-ce?

Deux spectres, pour 50 Hz et 50,1 Hz respectivement Obtenu par la commande MATALB fft ();

gpuguy
la source
Pourriez-vous s'il vous plaît poster le code que vous avez utilisé pour produire cette intrigue? Ma meilleure supposition, c'est que parce que vos signaux sont si proches les uns des autres, le FFT ne peut pas les résoudre correctement. Cela, ou un certain étalement spectral parce que les échantillons ne correspondent pas aux fréquences.
Tom Kealy
4
Les réponses ci-dessous sont correctes. Le terme pour ce que vous observez est appelé fuite spectrale et est observé lorsque vous analysez une sinusoïde dont la fréquence ne se situe pas exactement au centre de l'un de vos bacs de sortie DFT.
Jason R
s'il vous plaît, puis-je savoir ce que vous avez tracé contre quoi pour que vous puissiez obtenir votre pic à la marque 50Hz
Nazario_Jnr
Voir cette réponse pour une description détaillée de ce qu'est le problème et comment le résoudre.
Dilip Sarwate

Réponses:

14

En fait, la réponse de Matt donne déjà un point de vue sur le problème ici: la DFT est implicitement périodique à la fois dans le domaine temporel et fréquentiel (voir cette question ). À partir de vos paramètres, nous pouvons calculer que votre période d'observation est de 1 s. Cela signifie que vous observez 50 périodes d'une tonalité de 50 Hz. L'extension périodique de cet intervalle d'observation entraînera toujours une onde sinusoïdale apparente. Si vous prenez la tonalité de 50,1 Hz, vous transformez 50,1 périodes d'une oscillation. Extension périodique ce signal entraînera des sauts de phase qui provoqueront des affluents spectraux supplémentaires.

fs/NDFT=1024Hz/1024=1Hz ne peut pas être représenté par un seul bac et l'énergie est étalée sur le domaine fréquentiel. Dans votre exemple, c'est la raison du spectre magenta légèrement asymétrique et de la plus petite amplitude du bac 50 Hz par rapport à la magnitude 0,7 du spectre 50 Hz.

Les deux effets décrits ci-dessus contribuent au spectre que vous observez.

Deve
la source
1
Ça a du sens. Mais pour être plus clair, les fuites spectrales que vous avez décrites sont un problème avec l'outil (FFT) pour observer les spectres. Ce n'est pas un défaut perse dans le signal. Signifie que si j'entends un signal audio de 50,1 Hz, il apparaîtra à mes oreilles comme une tonalité unique et non comme une sorte de «bruit». Ai-je raison?
gpuguy
1
Vous avez absolument raison. Il montre à quel point il est important de comprendre ce que la DFT fait réellement afin de pouvoir l'interpréter correctement. En guise de note: ce que vous "entendriez" dans une implémentation réelle dépend également de la façon dont vous convertissez le discret en signal analogique.
Deve
11

C'est l'effet de tronquer ou de fenêtrer le signal sinusoïdal. Vous devez tronquer de telle manière que si vous ajoutez le signal décalé à celui tronqué, ce sera toujours l'onde sinusoïdale d'origine.

Matt L.
la source
6

Vous n'obtiendrez qu'un seul point FFT de résultat pour une fréquence de sinusoïde pure non modulée qui est exactement un entier périodique dans l'ouverture ou la largeur FFT. Toute autre fréquence de sinusoïde apparaîtra en convolution avec la transformation (un Sinc périodique) de la fenêtre par défaut (un rectangle).

50,1 Hz n'est pas exactement périodique dans la fenêtre 1 seconde de votre FFT.

Ces autres cellules ou fréquences de résultat FFT de "fuite" sont nécessaires pour représenter la discontinuité produite entre les limites de la fenêtre par tout signal qui n'est pas exactement entier périodique dans la largeur FFT. En effet, tous les vecteurs de base d'un DFT sont exactement des nombres entiers périodiques dans la largeur du DFT, et n'ont donc pas de discontinuité nette entre la fin et le début du vecteur de base. Donc, tout signal qui n'a pas ces caractéristiques ne peut pas être représenté par un seul vecteur de base DFT (et son conjugué complexe), donc les informations sur le reste du signal doivent aller quelque part.

L'énergie totale étant préservée par la transformée FFT (théorème de Parseval'a), l'énergie dans les bacs de "fuite" s'éloigne du bac de crête. Ainsi, la magnitude du bac de crête doit être inférieure.

hotpaw2
la source
5

Je parie que votre onde sinusoïdale est nulle au premier et au dernier échantillon? Ça ne devrait pas l'être. Il doit être aligné de manière à ce que l' échantillon suivant après le dernier échantillon soit nul, afin que vous puissiez copier et coller des copies du signal les unes après les autres et qu'elles aient l'air continues, sans échantillons dupliqués. Peut-être pensez-vous à cela comme du papier peint de bureau carrelé, où un bord doit rencontrer parfaitement le bord opposé lorsqu'il est carrelé. :)

Voir https://gist.github.com/endolith/236567 pour un exemple de python:

# Sampling rate
fs = 128 # Hz

# Time is from 0 to 1 seconds, but leave off the endpoint, so that 1.0 seconds is the first sample of the *next* chunk
length = 1 # second
N = fs * length
t = linspace(0, length, num = N, endpoint = False)

# Generate a sinusoid at frequency f
f = 10 # Hz
a = cos(2 * pi * f * t)

# Use FFT to get the amplitude of the spectrum
ampl = 1/N * abs(fft(a))

Découvrez comment deux copies du signal s'emboîtent de bout en bout pour créer une onde continue:

entrez la description de l'image ici

Lorsque cela se produit, l'énergie FFT est entièrement contenue dans un seul bac:

entrez la description de l'image ici

endolith
la source
1
J'ai eu le même problème que OP. Il a été résolu grâce au paramètre endpoint = False flag. Je pensais que l'espace de ligne est (fermé, ouvert) par défaut mais il se révèle être (fermé, fermé). J'ai trouvé le bug grâce à votre code.
Trismegistos
-1

Cela se produit en raison de la fuite spectrale et du fenêtrage. La réponse idéale, c'est-à-dire la fonction d'impulsion, est pour une onde sinusoïdale à temps continu. Lorsque vous prenez la DFT d'une onde sinusoïdale discrète dans un ordinateur numérique, vous prenez essentiellement la transformée de Fourier du sinus fenêtré et échantillonné, puis l'échantillonnez dans le domaine fréquentiel. Cela provoque la fuite spectrale. Voir: http://w.astro.berkeley.edu/~jrg/ngst/fft/leakage.html

Akshat
la source