J'essaie de créer un analyseur de spectre graphique en python.
Je suis en train de lire 1024 octets d'un flux audio à fréquence d'échantillonnage double canal de 44,100 Hz 16 bits et de faire la moyenne de l'amplitude des 2 canaux ensemble. Alors maintenant, j'ai un tableau de 256 courts métrages signés. Je veux maintenant préformer un fft sur ce tableau, en utilisant un module comme numpy, et utiliser le résultat pour créer l'analyseur graphique de spectre, qui, pour commencer, ne fera que 32 barres.
J'ai lu les articles de wikipedia sur la transformée de Fourier rapide et la transformée de Fourier discrète, mais je ne sais toujours pas ce que le tableau résultant représente. Voici à quoi ressemble le tableau après avoir effectué un fft sur mon tableau à l'aide de 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 ces chiffres représentent exactement et comment je convertirais ces chiffres en pourcentage d'une hauteur pour chacune des 32 barres. De plus, dois-je faire la moyenne des 2 canaux ensemble?
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 des fonctions d'entrée à valeurs complexes, de sorte que les coefficients que vous obtenez seront des nombres imaginaires même si votre entrée est entièrement constituée de valeurs réelles. Afin d'obtenir la quantité de puissance dans chaque fréquence, vous devez calculer la magnitude du coefficient FFT pour chaque fréquence. Ce n'est pas juste la composante réelle du coefficient, vous devez calculer la racine carrée de la somme du carré de ses composantes réelle et imaginaire. 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'amplitude 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, en commençant à 0. Parce que votre 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. Il s'agit essentiellement du 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 atteigniez 128. Dans une FFT, vous ne pouvez mesurer des fréquences que jusqu'à la moitié de vos points d'échantillonnage. Lisez ces liens sur les Nyquist Frequency et Nyquist-Shannon Sampling Theorem 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 plus basses sont va être répliqué ou alias dans les compartiments à fréquence plus élevée. Les fréquences partiront donc 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 suffire pour vous aider à démarrer. Si vous souhaitez une introduction aux FFT beaucoup plus accessible que celle donnée sur Wikipedia, vous pouvez essayer nderstanding Digital Signal Processing: 2nd Ed. . Cela a été très utile pour moi.
Voilà donc ce que ces chiffres représentent. La conversion en pourcentage de hauteur peut être effectuée en mettant à l'échelle chaque amplitude de composante de fréquence par la somme de toutes les amplitudes de composante. Cependant, 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 la magnitude maximale possible pour une composante de fréquence, mais je ne suis pas sûr que cela s'afficherait 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 faibles pour trouver le bon réglage.
Enfin, vous devez faire la moyenne des deux canaux ensemble si vous souhaitez afficher le contenu en fréquence de l'ensemble du signal audio dans son ensemble. Vous mixez l'audio stéréo en audio mono et affichez les fréquences combinées. Si vous voulez deux affichages séparés pour les fréquences droite et gauche, vous devrez effectuer la transformation de Fourier sur chaque canal séparément.
Bien que ce fil soit vieux de plusieurs années, je l'ai trouvé très utile. Je voulais juste donner mon avis à tous ceux qui trouvent cela et tentent de créer quelque chose de similaire.
Quant à la division en barres, cela ne devrait pas être fait comme le suggère antti, en divisant les données également en fonction du nombre de barres. Le plus utile serait de diviser les données en parties d'octave, chaque octave étant le double de la fréquence de la précédente. (c'est-à-dire que 100 Hz est une octave au-dessus de 50 Hz, ce qui correspond à une octave au-dessus de 25 Hz).
Selon le nombre de mesures souhaité, vous divisez toute la plage en plages d'octave 1/X. Sur la base d'une fréquence centrale donnée de A 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 plages de 1/3 d'octaves et nous commençons avec une fréquence centrale de 1 kHz.
Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) = 890.9
Étant donné 44100 Hz et 1024 échantillons (43 Hz entre chaque point de données), nous devrions faire la moyenne des valeurs 21 à 26. (890,9/43 = 20,72 ~ 21 et 1122,5/43 = 26,10 ~ 26)
(Les barres 1/3 d'octave vous donneraient environ 30 barres entre ~ 40 Hz et ~ 20 kHz). Comme vous pouvez le comprendre maintenant, à mesure que nous montons, nous allons en moyenne une plus grande gamme de nombres. Les barres basses incluent généralement 1 ou un petit nombre de points de données. Alors que les barres supérieures peuvent être la moyenne de centaines de points. La raison étant que 86 Hz est une octave au-dessus de 43 Hz ... tandis que 10086 Hz sonne presque comme 10043 Hz.
ce que vous avez est un échantillon dont la durée est de 256/44100 = 0,00580499 secondes. Cela signifie que votre résolution de fréquence est de 1/0,00580499 = 172 Hz. Les 256 valeurs dont vous sortez Python correspondent aux fréquences, fondamentalement, 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).
MODIFIÉ: FIXE FAUX RENSEIGNEMENTS
Vous devez convertir les nombres complexes en amplitude en calculant le sqrt (i2 + j2) où i et j sont les parties réelles et imaginaires, resp.
Si vous voulez avoir 32 barres, vous devriez, pour autant que je sache, prendre la moyenne de quatre amplitudes successives, en obtenant 256/4 = 32 barres comme vous le souhaitez.