Comment vérifier les résultats FFT d'une onde sinusoïdale?

9

J'ai reçu un fichier audio (onde sinusoïdale) de 1000 Hz en entrée de mon algorithme FFT. J'ai 8192 échantillons de spectre de puissance dans un tableau.

Quelle est la meilleure et la plus simple façon de vérifier si ma sortie est correcte ou incorrecte?

Si je donne un fichier audio silencieux, la sortie est nulle pour tous les échantillons. Sur une onde sinusoïdale, le rapport O / P augmente de 20 (0e échantillon) à 26059811 (743e échantillon) et diminue progressivement à 40.

Si j'ai une idée de la plage de sortie, je peux prouver techniquement si la FFT fonctionne.

Toutes les idées seraient utiles.

Reportez-vous à ce lien pour tout doute technique.

Communauté
la source
1
pouvez-vous tracer votre tableau? (dans un tableur peut-être?)
Il y a 8192 valeurs dans le tableau.Vous voulez que je trace manuellement ou une feuille de calcul gérera cela.Je travaille sur MAC
2
J'ai tracé des dizaines de milliers d'échantillons dans MS Excel; Le gnumérique ou un autre convient également. Ou gnuplot aussi.
N'oubliez pas le bureau ouvert
Fake Name
@Fake Name: je ne suis pas en mesure de tracer le graphique ..

Réponses:

4

Il semble que vous calculiez le spectre en faisant la moyenne de 10 fenêtres (sans chevauchement?) Pour obtenir la magnitude au carré à 8192 ou 8193 fréquences (de 0 à Nyquist, mais certains algorithmes peuvent réduire la fréquence de Nyquist au bac 8192).

La première chose à vérifier est que le pic est dans le bon bac. Vous n'avez pas dit quel est le taux d'échantillonnage, mais le bac 743 serait 743/16384 fois le taux d'échantillonnage. Si le signal est vraiment à 800 Hz, cela met Fs à environ 17640 échantillons / seconde. Cela semble faux. Votre signal de test serait probablement à un taux standard tel que 8000, 16000, 22050, 32000, 44100 ou 48000. Pour Fs = 22050, le pic serait brusquement dans le bac 800/22050 * 16384 = 594.

Un autre critère à vérifier est que l'énergie totale dans le signal est approximativement la même dans les domaines temporel et fréquentiel. Voici un exemple en Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Le signal d'entrée x, qui se compose de deux sinusoïdes échantillonnées à Fs = 22050 échantillons / seconde, est segmenté en 10 fenêtres sans chevauchement de taille NFFT = 2048 échantillons. L'appel à psd (densité spectrale de puissance) calcule le spectre y comme la moyenne de la grandeur au carré de dix DFT à 16384 points (en fait, c'est 8193 points puisque x est une valeur réelle).

L'énergie calculée dans le domaine fréquentiel a un facteur d'échelle de N / 16384 car la fonction psd a été mise à l'échelle y à la taille DFT au lieu de la longueur totale du signal. Que ce soit ou non un problème dépend de la façon dont votre système gère la normalisation du PSD. Une autre normalisation facultative est la mise à l'échelle par 1 / Fs. Cela fait correspondre l'énergie au signal analogique d'origine. Les normalisations par défaut doivent être bien documentées dans la bibliothèque.

Eryk Sun
la source
J'ai testé mon signal sinusoïdal il est de 1000 Hz. La mine FFT donne la bonne réponse. Merci pour votre aide.
10

Vous devez tracer la magnitude de la sortie de la FFT. Je ne connais pas votre langage de programmation, mais en Python, vous utiliseriez quelque chose comme plot(abs(fft(a))). Pour une entrée silencieuse, la sortie doit être entièrement composée de zéros. Pour une entrée d'onde sinusoïdale, vous devriez voir deux pointes:

texte alternatif

Pour un signal réel, les pointes seront symétriques de gauche à droite. Si vous faites une vraie FFT , cependant (ce qui est plus efficace en termes de calcul), vous n'obtiendrez que la moitié gauche du tracé en tant que sortie, car elle ignore l'image miroir redondante.

Si la fréquence est plus élevée, les pointes seront plus proches du centre. Si la fréquence est parfaitement synchronisée avec la taille du morceau , le pic ne sera large que d'un point et tout le reste sera exactement égal à 0. Sinon, il aura une "jupe" effilée comme ci-dessus.

endolith
la source
Voulez-vous dire la valeur du spectre de puissance comme l'amplitude?
t -> en référence à l'heure?
Ne vous inquiétez pas du temps. Si vous vérifiez simplement si la FFT fonctionne, tout ce que vous avez à faire est de vérifier que la forme de l'amplitude est similaire à celle-ci.
endolith
Je ne suis pas en mesure de tracer de toute façon ma FFT fonctionne correctement. J'essaierai certainement de mettre en œuvre le graphique dans mon temps libre. Merci beaucoup.
1
@clabacchio: Oh. La FFT produit une sortie avec l'axe f = 0 au début et à la fin du tracé. Le point médian du tracé est l'axe f = fs / 2. Il existe souvent une fonction fftfreq ou fftshift pour réorganiser le tracé afin que la fréquence 0 soit au centre. flic.kr/p/arVeZT
endolith
0

J'ai utilisé l'outil d'analyse de Fourier dans Excel Analysis Toolpak pour effectuer une vérification rapide des données et des résultats.

uɐɪ
la source
Je travaille sur MAC.
@Warrior - Ensuite, utilisez MacPorts ou Fink pour installer Gnumeric (consultez également cette page pour plus d'informations sur un wrapper Platypus si vous le souhaitez)
Kevin Vermeer