Jessaie déchantillonner une onde sinusoïdale et de tracer ses composantes de fréquence, mais jai des problèmes de mise en œuvre Le résultat de la prise de 65536 échantillons dun cycle dune onde sinusoïdale avec une amplitude maximale de 1 et une fréquence de 100 peut être vu ci-dessous. Où laxe Y correspond à lamplitude de la somme de Fourier complexe et laxe des x est le numéro de léchantillon .Comment puis-je voir la fréquence de londe sinusoïdale à partir de ce tracé?, Je voudrais avoir un tracé de fréquence en fonction de la magnitude et non de léchantillon Nombre en fonction de la magnitude.
Je mattendais à un gros pic damplitude 1 ou 2 pics damplitude 0,5 chacun, mais il me semble avoir une grande amplitude, je ne sais pas ce que je pourrais faire de mal.
Code Matlab:
Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform);
Commentaires
- Les implémentations FFT ont souvent un gain proportionnel à $ N $ ou $ \ sqrt {N} $. Votre résultat nest pas ‘ déraisonnable.
- En divisant la magnitude par $ N $, vous obtenez deux pics dune magnitude denviron 0,425 chacun (ce qui est toujours inférieur au 0,5 attendu ) .Comment puis-je changer laxe des x en fréquence à partir du numéro de léchantillon?
Réponse
Il semble comme si vous « confondez votre fréquence en Hertz et en radians / s puisque vous avez le facteur $ 2 \ pi $ dans vos deux périodes déchantillonnage dt et votre signal. Jai réécrit un peu de votre code pour clarifier ce que je pense que vous voulez vraiment.
Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)")
Si votre fréquence déchantillonnage est de 65536 échantillons / seconde , et vous voulez par exemple une tonalité à 12 KHz, vous pouvez la créer comme indiqué. Donc, ici, votre période déchantillonnage est de 1/65536 secondes.
Votre espoir dobtenir deux pics avec une amplitude de 0,5 chacun était correct – votre ton généré ne létait pas.
En ce qui concerne la mise à léchelle de laxe des x pour quil soit en Hertz, créez simplement un vecteur avec le même nombre de points que votre résultat FFT et avec un incrément linéaire de $ – fs / 2 $ à $ + fs / 2 $ . Notez également le fftshift que jai utilisé dans lintrigue. Cest parce que la sortie de la fonction FFT de Matlab va linéairement de 0 à fs. Je trouve plus facile de visualiser le fait davoir centré DC, mais dans les deux cas, cest bien. Sans le fftshift, le vecteur faxis passerait de 0 à fs .
Réponse
Certaines FFT nécessitent une division par 1 / N pour représenter la magnitude « naturellement » (ce qui ne préserve pas lénergie ). Pour étiqueter laxe X, il faut connaître la fréquence déchantillonnage (Fs). Sil est connu, alors f_x = bin_index * Fs / N, jusquà N / 2, puis mis en miroir pour les fréquences négatives. Si la fréquence dun pic spectral (votre onde sinusoïdale dentrée) nest pas « t exactement périodique dans la longueur de la FFT (par exemple un nombre entier de cycles), alors la magnitude du bin de résultat FFT le plus proche sera plus petite, et vous devrez interpoler entre les bins pour trouver une estimation plus proche de la magnitude du pic (les interpolations de noyau parabolique ou fenêtré-Sinc sont courantes).
Réponse
Pour ajouter quelques formules à la réponse de hotpaw2:
Avec la FFT vous calculez une représentation de votre signal comme
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
où $ f_k = \ frac {k} {N} f_s $ pour $ k = 0,1, …, N / 2-1 $ et $ f_k = \ frac {kN} {N} f_s $ pour $ k = N / 2, …, N-1 $, en supposant $ N $ pair.
Maintenant, la FFT exige que les échantillons soient prélevés avec létape déchantillonnage $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, et la FFT du tableau échantillon $ (x_n) _n $ donne le tableau damplitude mis à léchelle $ (N \ hat x_k) _k $, puisque $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Le redimensionnement i s généralement laissées en dehors des implémentations FFT à traiter par lutilisateur de la bibliothèque FFT.
Réponse
FFT fournit une méthode de calcul DFT ce que vous savez déjà. considérons maintenant un signal x (n) et sa DFT X (k). si votre signal est composé de N (65536 dans votre cas) échantillons, alors X (k) fournira des valeurs à des fréquences discrètes de 2*pi*k/N
. En fait, la DFT ci-dessus X (k) signifie X(2*pi*k/N)
. donc si vous trouvez X (1), cela signifie que vous trouvez le coefficient DFT à une fréquence discrète de 2 * pi * 1 / N et similaire, X (2) signifie le coefficient pour 2 * pi * 2 / N et ainsi de suite. Chaque coefficient montre la contribution de cette fréquence dans ce signal si elle est grande, cela signifie que la fréquence constitue la majeure partie du signal. donc pour tracer fft par rapport à la fréquence, remplacez laxe déchantillonnage par laxe de fréquence ayant des points 2*pi*k/N
où k = 0 à 65535.FT ne fournit jamais aucune information concernant le temps. il fournit simplement des informations de fréquence du signal.