Analyser l'audio en utilisant une transformation de Fourier rapide
J'essaie de créer un analyseur de spectre graphique en python.
Je suis actuellement en train de lire 1024 octets d'un flux audio à fréquence d'échantillonnage double canal 16 bits 44,100 Hz et de faire la moyenne de l'amplitude des 2 canaux ensemble. Alors maintenant, j'ai un tableau de 256 shorts signés. Je veux maintenant préformer une fft sur ce tableau, en utilisant un module comme numpy, et utiliser le résultat pour créer l'analyseur de spectre graphique, qui, pour commencer, ne sera que de 32 bars.
J'ai lu les articles de wikipédia sur Transformée de Fourier rapide et transformée de Fourier discrète mais je ne sais toujours pas ce que représente le tableau résultant. Voici à quoi ressemble le tableau après avoir préformé un fft sur mon tableau en utilisant numpy:
[ -3.37260500e+05 +0.00000000e+00j 7.11787022e+05 +1.70667403e+04j
4.10040193e+05 +3.28653370e+05j 9.90933073e+04 +1.60555003e+05j
2.28787050e+05 +3.24141951e+05j 2.09781047e+04 +2.31063376e+05j
-2.15941453e+05 +1.63773851e+05j -7.07833051e+04 +1.52467334e+05j
-1.37440802e+05 +6.28107674e+04j -7.07536614e+03 +5.55634993e+03j
-4.31009964e+04 -1.74891657e+05j 1.39384348e+05 +1.95956947e+04j
1.73613033e+05 +1.16883207e+05j 1.15610357e+05 -2.62619884e+04j
-2.05469722e+05 +1.71343186e+05j -1.56779748e+04 +1.51258101e+05j
-2.08639913e+05 +6.07372799e+04j -2.90623668e+05 -2.79550838e+05j
-1.68112214e+05 +4.47877871e+04j -1.21289916e+03 +1.18397979e+05j
-1.55779104e+05 +5.06852464e+04j 1.95309737e+05 +1.93876325e+04j
-2.80400414e+05 +6.90079265e+04j 1.25892113e+04 -1.39293422e+05j
3.10709174e+04 -1.35248953e+05j 1.31003438e+05 +1.90799303e+05j...
Je me demande ce que représentent exactement ces nombres et comment je convertirais ces nombres en un pourcentage d'une hauteur pour chacune des 32 barres. Aussi, devrais-je faire la moyenne des canaux 2 Ensemble?
3 réponses
Le tableau que vous montrez est les coefficients de Transformée de Fourier du signal audio. Ces coefficients peuvent être utilisés pour obtenir le contenu en fréquence de l'audio. La FFT est définie pour les fonctions d'entrée à valeur complexe, de sorte que les coefficients que vous obtenez seront des nombres imaginaires même si votre entrée est toutes des valeurs réelles. Afin d'obtenir la quantité de puissance dans chaque fréquence, vous devez calculer l'ampleur du coefficient FFT pour chaque fréquence. C'est pas juste le réel composante du coefficient, vous devez calculer la racine carrée de la somme du carré de ses composants réels et imaginaires. Autrement dit, si votre coefficient est a + b * j, alors sa magnitude est sqrt (a^2 + b^2).
Une fois que vous avez calculé l'ampleur de chaque coefficient FFT, vous devez déterminer à quelle fréquence audio chaque coefficient FFT appartient. Une FFT à N points vous donnera le contenu en fréquence de votre signal à N fréquences également espacées, à partir de 0. Parce que votre la fréquence d'échantillonnage est de 44100 échantillons / sec. et le nombre de points dans votre FFT est de 256, votre espacement de fréquence est de 44100 / 256 = 172 Hz (environ)
Le premier coefficient de votre tableau sera le coefficient de fréquence 0. C'est essentiellement le niveau de puissance moyen pour toutes les fréquences. Le reste de vos coefficients comptera de 0 en multiples de 172 Hz jusqu'à ce que vous arriviez à 128. Dans une FFT, vous ne pouvez mesurer des fréquences jusqu'à la moitié de vos points d'échantillonnage. Lisez ces liens sur le Fréquence de Nyquist etthéorème D'échantillonnage de Nyquist-Shannon Si vous êtes un glouton pour la punition et avez besoin de savoir pourquoi, mais le résultat de base est que vos fréquences inférieures vont être répliquées oualias dans les compartiments de fréquence supérieure. Ainsi, les fréquences commenceront à partir de 0, augmenteront de 172 Hz pour chaque coefficient jusqu'au coefficient N/2, puis diminueront de 172 Hz jusqu'au coefficient N - 1.
Cela devrait être assez d'informations pour vous aider à démarrer. Si vous si vous souhaitez une introduction beaucoup plus accessible aux FFTs que ce qui est donné sur Wikipedia, vous pouvez essayer comprendre le traitement du Signal numérique: 2ème Ed.. Il a été très utile pour moi.
C'est donc ce que représentent ces nombres. La conversion en un pourcentage de hauteur pourrait être effectuée en mettant à l'échelle chaque grandeur de composante de fréquence par la somme de toutes les grandeurs de composante. Bien que, cela ne vous donnerait qu'une représentation de la distribution de fréquence relative, et non la puissance réelle pour chaque fréquence. Vous pouvez essayer de mettre à l'échelle par la magnitude maximale possible pour une composante de fréquence, mais je ne suis pas sûr que cela s'affiche très bien. Le moyen le plus rapide de trouver un facteur d'échelle réalisable serait d'expérimenter sur des signaux audio forts et doux pour trouver le bon réglage.
Enfin, vous devriez faire la moyenne des deux canaux ensemble si vous voulez afficher le contenu en fréquence de l'ensemble du signal audio dans son ensemble. Vous mélangez l'audio stéréo en audio mono et montrez le fréquences combinées. Si vous voulez deux affichages distincts pour les fréquences droite et gauche, vous devrez effectuer la transformation de Fourier sur chaque canal séparément.
Bien que ce fil ait des années, je l'ai trouvé très utile. Je voulais juste donner mon avis à tous ceux qui trouvent cela et essaient de créer quelque chose de similaire.
En ce qui concerne la division en barres, cela ne devrait pas être fait comme le suggère antti, en divisant les données de manière égale en fonction du nombre de barres. Le plus utile serait de diviser les données en octave parties, chaque octave étant le double de la fréquence de la précédente. (IE. 100hz est une octave au-dessus de 50 hz, ce qui est une octave au-dessus de 25hz).
Selon le nombre de mesures que vous voulez, vous divisez toute la plage en plages d'octaves 1 / X. Basé sur une fréquence centrale de l'Un sur la barre, vous obtenez les limites supérieure et inférieure de la barre à partir de:
upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )
Pour calculer la prochaine fréquence centrale adjacente, vous utilisez un calcul similaire:
next lower = A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )
Vous faites ensuite la moyenne des données qui correspondent à ces plages pour obtenir l'amplitude de chaque barre.
Par exemple: Nous voulons diviser en 1/3 octaves gammes et nous commençons par un fréquence centrale de 1khz.
Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) = 890.9
Compte tenu des échantillons 44100hz et 1024 (43hz entre chaque point de données), nous devrions moyenner les valeurs 21 à 26. ( 890.9 / 43 = 20.72 ~ 21 et 1122.5 / 43 = 26.10 ~ 26 )
(1/3 octave bars vous obtiendrait environ 30 bars entre ~ 40hz et ~20khz). Comme vous pouvez le comprendre maintenant, au fur et à mesure que nous augmenterons, nous aurons en moyenne une plus grande gamme de nombres. Les barres basses ne comprennent généralement que 1 ou un petit nombre de points de données. Alors que les barres plus élevées peuvent être la moyenne de des centaines de points. La raison étant que 86hz est une octave au-dessus de 43hz... alors que 10086hz sonne presque le même que 10043hz.
Ce que vous avez est un échantillon dont la longueur dans le temps est 256/44100 = 0.00580499 secondes. Cela signifie que votre résolution de fréquence est 1 / 0.00580499 = 172 Hz. Les 256 valeurs que vous obtenez de Python correspondent aux fréquences, essentiellement, de 86 Hz à 255*172+86 Hz = 43946 Hz. Les nombres que vous sortez sont des nombres complexes (d'où le "j" à la fin de chaque deuxième nombre).
ÉDITÉ: CORRECTION D'INFORMATIONS ERRONÉES
Vous devez convertir les nombres complexes en amplitude en calculant la sqrt(je2 + j2) où i et j sont les parties réelles et imaginaires, resp.
Si vous voulez avoir 32 bars, vous devriez, autant que je sache, prendre la moyenne de quatre amplitudes successives, en obtenant 256 / 4 = 32 bars comme vous le souhaitez.