Question

J'essaie de créer un analyseur de spectre graphique en python.

Je suis en train de lire 1024 octets d’un flux audio 16 bits à deux canaux et 44 100 Hz 16 bits et de calculer la moyenne de l’amplitude des deux canaux. 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 tel que numpy, et utiliser le résultat pour créer l’analyseur de spectre graphique, qui, pour commencer, ne sera que de 32 barres.

J'ai lu les articles de Wikipédia sur Transformée de Fourier rapide et Transformée de Fourier discrète, mais je ne comprends toujours pas ce que représente le tableau obtenu. Voici à quoi ressemble le tableau après avoir effectué une mise à jour sur mon tableau avec 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 les convertirais en pourcentage de hauteur pour chacune des 32 barres. Aussi, devrais-je faire la moyenne des 2 canaux ensemble?

Était-ce utile?

La solution

Le tableau que vous montrez est le coefficient de transformation de Fourier du signal audio. Ces coefficients peuvent être utilisés pour obtenir le contenu fréquentiel de l'audio. La FFT étant définie pour des fonctions d’entrée à valeurs complexes, les coefficients que vous obtenez sont des nombres imaginaires, même si votre entrée est composée de valeurs réelles. Afin d’obtenir la quantité de puissance dans chaque fréquence, vous devez calculer l’amplitude du coefficient FFT pour chaque fréquence. Ce n'est pas simplement la composante réelle du coefficient, vous devez calculer la racine carrée de la somme du carré de ses composantes réelles et imaginaires. Autrement dit, si votre coefficient est a + b * j, sa magnitude est alors sqrt (a ^ 2 + b ^ 2).

Une fois que vous avez calculé la magnitude de chaque coefficient FFT, vous devez déterminer la fréquence audio à laquelle chaque coefficient FFT appartient. Une FFT en N points vous donnera le contenu fréquentiel de votre signal à N fréquences égales, à partir de 0. Parce que votre fréquence d'échantillonnage est de 44100 échantillons / s. 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 fondamentalement le niveau de puissance moyen pour toutes les fréquences. Le reste de vos coefficients comptera à partir de 0 par multiples de 172 Hz jusqu'à 128. Dans une FFT, vous ne pouvez mesurer que des fréquences allant jusqu'à la moitié de vos points d'échantillonnage. Lisez ces liens sur la Fréquence de Nyquist et Théorème d'échantillonnage de Nyquist-Shannon Glouton pour punition et besoin de savoir pourquoi, mais le résultat de base est que vos fréquences les plus basses vont être répliquées ou aliasé dans les compartiments de fréquence supérieurs. Les fréquences commenceront 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 être suffisant pour vous aider à démarrer. Si vous souhaitez une introduction beaucoup plus accessible aux FFT que celle proposée sur Wikipedia, vous pouvez essayer Comprendre le traitement du signal numérique: 2e édition . Ce fut très utile pour moi.

Voilà donc ce que ces chiffres représentent. La conversion en pourcentage de hauteur pourrait être réalisée en mettant à l'échelle chaque amplitude de composante de fréquence par la somme de toutes les amplitudes de composante. Cela ne vous donnerait cependant qu'une représentation de la distribution de fréquence relative, et non de la puissance réelle de chaque fréquence. Vous pouvez essayer de réduire au maximum l'amplitude d'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 de mise à l’échelle réalisable est d’expérimenter des signaux audio forts et faibles pour trouver le bon réglage.

Enfin, vous devez établir une moyenne des deux canaux si vous souhaitez afficher le contenu en fréquence de l’ensemble du signal audio. Vous mélangez l'audio stéréo en audio mono et affichez les fréquences combinées. Si vous souhaitez deux affichages séparés pour les fréquences droite et gauche, vous devrez alors effectuer la transformation de Fourier sur chaque canal séparément.

Autres conseils

Même si ce fil a plusieurs années, je l’ai trouvé très utile. Je voulais juste donner mon avis à quiconque découvre cela et essaie de créer quelque chose de similaire.

En ce qui concerne la division en barres, cela ne devrait pas être fait comme antti le suggère, 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 100hz correspond à une octave au-dessus de 50hz, ce qui correspond à une octave au-dessus de 25hz).

En fonction du nombre de mesures souhaitées, vous divisez l’ensemble de la plage en plages d’octave 1 / X. En fonction d'une fréquence centrale donnée de A sur la barre, vous obtenez les limites supérieure et inférieure de la barre de:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

Pour calculer la prochaine fréquence centrale adjacente, utilisez un calcul similaire:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

Vous devez ensuite faire la moyenne des données qui correspondent à ces plages pour obtenir l'amplitude de chaque barre.

Par exemple: Nous voulons diviser en gammes de 1/3 d’octaves et nous commençons avec une fréquence centrale de 1khz.

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

Pour 44100hz et 1024 échantillons (43hz 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)

(1/3 d’octave vous donnerait environ 30 bars entre ~ 40hz et ~ 20khz). Comme vous pouvez le constater, à mesure que nous progressons, nous établissons une moyenne sur une plus grande gamme de chiffres. Les barres basses n'incluent généralement qu'un ou un petit nombre de points de données. Alors que les barres plus hautes peuvent être la moyenne de centaines de points. La raison étant que 86hz est une octave supérieure à 43hz ... alors que 10086hz sonne à peu près comme 10043hz.

Ce que vous avez est un échantillon dont la durée est 256/44100 = 0.00580499 secondes. Cela signifie que votre résolution en fréquence est 1 / 0.00580499 = 172 Hz. Les 256 valeurs que vous obtenez de Python correspondent aux fréquences 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).

RÉVISÉ: INFORMATIONS FIXES ET ERRONÉES

Vous devez convertir les nombres complexes en amplitude en calculant le sqrt (i 2 + j 2 ) où i et j sont les parties réelle et imaginaire, resp.

Si vous souhaitez avoir 32 barres, vous devez, autant que je sache, prendre la moyenne de quatre amplitudes successives, en obtenant 256/4 = 32 barres à votre guise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top