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.
Réponses:
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:
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.
la source
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: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.
la source
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.
la source