110 votes

Analyser l'audio à l'aide de la transformée de Fourier Rapide

Je suis en train de créer un graphique de l'analyseur de spectre en python.

Je suis en train de lire 1024 octets de 16 bits double canal d'échantillonnage de 44100 Hz taux de flux audio et de la moyenne de l'amplitude de l'2 canaux. Alors maintenant, j'ai un tableau de 256 signé shorts. Je veux maintenant pour préformer une fft sur ce tableau, à l'aide d'un module numpy, et utiliser le résultat pour créer le graphique de l'analyseur de spectre, qui, pour commencer sera juste 32 bars.

J'ai lu les articles de wikipédia sur la transformée Rapide de Fourier et transformée de Fourier Discrète mais je ne suis toujours pas clair de ce que le tableau représente. C'est ce que le tableau ressemble après je préforme une 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 qu'est exactement ces chiffres représentent et comment je voudrais convertir ces chiffres en pourcentage de la hauteur pour chacun des 32 bars. Aussi, dois-je être en moyenne les 2 canaux, ensemble?

212voto

A. Levy Points 8344

Le tableau vous indique les coefficients de la transformée de Fourier du signal audio. Ces coefficients peuvent être utilisés pour obtenir la fréquence du contenu de l'audio. La FFT est défini pour le complexe évalués fonctions de saisie, de sorte que les coefficients de vous en sortir seront les nombres imaginaires, même si votre entrée est toutes les valeurs réelles. Afin d'obtenir la quantité d'énergie à chaque fréquence, vous devez calculer la magnitude de la FFT coefficient pour chaque fréquence. Ce n'est pas seulement la composante réelle du coefficient, vous avez besoin de calculer la racine carrée de la somme des carrés de ses composantes réelle et imaginaire. C'est, si votre coefficient est a + b*j, puis sa magnitude est de sqrt(a^2 + b^2).

Une fois que vous avez calculé l'ampleur de chaque FFT coefficient, vous avez besoin de savoir qui de fréquence audio à chaque FFT coefficient de appartient à. Un N point FFT vont vous donner le contenu fréquentiel du signal à N équidistants des fréquences, en commençant à 0. Parce que votre fréquence d'échantillonnage est de 44100 échantillons / sec. et le nombre de points de la FFT est 256, votre espacement de fréquence est de 44100 / 256 = 172 Hz (environ)

Le premier coefficient dans votre tableau sera l'0 fréquence coefficient. C'est essentiellement le niveau de puissance moyen pour toutes les fréquences. Le reste de votre coefficients compter à partir de 0 en multiples de 172 Hz jusqu'à ce que vous obtenez à 128. Dans une FFT, vous ne pouvez mesurer des fréquences allant jusqu'à la moitié de vos points d'échantillonnage. Lisez ces liens sur la Fréquence de Nyquist et de Nyquist-Shannon Théorème de l'Échantillonnage si vous êtes maso et ont besoin de savoir pourquoi, mais le résultat principal est que votre basses fréquences vont être répliquées ou un alias dans la plus grande fréquence des seaux. Donc, les fréquences vont commencer à partir de 0, en augmentation de 172 Hz pour chaque coefficient jusqu'à la N/2 coefficient, puis diminuer de 172 Hz jusqu'à ce que le N - 1 coefficient.

Qui devrait être suffisant pour vous aider à démarrer. Si vous souhaitez un beaucoup plus accessible, introduction à la Fft que ce n'est donnée sur Wikipédia, vous pouvez essayer de Compréhension de Traitement de Signal Numérique: 2ème Ed.. Il a été très utile pour moi.

C'est ce que ces chiffres représentent. La conversion à un pourcentage de la hauteur pouvait être fait par la mise à l'échelle de chaque composante de fréquence de l'ampleur par la somme de toutes les grandeurs. Bien que, ce ne serait que de vous donner une représentation de la fréquence relative de la distribution, et non pas de la puissance réelle de chaque fréquence. Vous pouvez essayer de la mise à l'échelle par la magnitude maximale possible pour une composante de fréquence, mais je ne suis pas sûr que ce serait très bien. Le moyen le plus rapide pour trouver un mécanisme d'facteur d'échelle serait d'expérimenter sur les forts et doux des signaux audio à trouver le bon réglage.

Enfin, vous devriez être en moyenne sur les deux canaux ensemble, si vous souhaitez afficher le contenu de fréquence du signal audio de l'ensemble. Vous êtes en train de mixer l'audio stéréo en mono et en montrant le combiné fréquences. Si vous avez besoin de deux écrans distincts pour la droite et la gauche fréquences, que vous avez besoin pour effectuer l'analyse de Fourier sur chaque canal séparément.

27voto

Erik A. Points 121

Bien que ce fil est ans, je l'ai trouvé très heplful. Je voulais juste donner mon entrée à toute personne qui le trouve et essaie de créer quelque chose de similaire.

Pour la division dans les bars, cela ne devrait pas être fait comme antti suggèrent, en divisant les données fondée sur le 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).

En fonction du nombre de barres que vous voulez, vous divisez l'ensemble de la gamme en 1/X octaves. 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 attenant à la fréquence centrale vous utilisez un calcul similaire:

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

Vous avez ensuite la moyenne des données qui s'inscrit dans ces gammes d'obtenir l'amplitude pour chaque barre.

Par exemple: Nous souhaitons diviser en 1/3 octaves plages et on commence avec une fréquence de 1 khz.

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

Compte tenu de 44100hz et 1024 échantillons (43 hz entre chaque point de données), il faut faire la moyenne des valeurs de 21 à 26. ( 890.9 / 43 = 20.72 ~ 21 et 1122.5 / 43 = 26.10 ~ 26 )

(1/3 d'octave bars vous obtenir autour de 30 bars entre ~40 hz et ~20 khz). Comme vous pouvez le comprendre maintenant, nous allons plus nous seront en moyenne un plus grand nombre de numéros. Faible bars typiquement seulement inclure 1 ou d'un petit nombre de points de données. Alors que les barres supérieures peut être que la moyenne de plusieurs centaines de points. La raison étant que 86 hz est une octave aboe 43 hz... alors que 10086hz sonne presque le même que 10043hz.

10voto

Antti Huima Points 15465

ce que vous avez est un échantillon dont la durée dans le temps est 256/44100 = 0.00580499 secondes. Cela signifie que votre résolution en fréquence est de 1 / 0.00580499 = 172 Hz. Les 256 valeurs que vous sortez de Python correspondent aux fréquences, pour l'essentiel, de 86 Hz à 255*172+86 Hz = 43946 Hz. Les chiffres que vous obtenez sont des nombres complexes (d'où le "j" à la fin de chaque deuxième numéro).

MODIFIÉ: CORRECTION DES INFORMATIONS ERRONÉES

Vous avez besoin de convertir des nombres complexes en amplitude par le calcul de la racine carrée(i**2 + j**2) où i et j sont les parties réelles et imaginaires, resp.

Si vous voulez avoir de 32 barres, vous devez autant que je sache prendre la moyenne de quatre amplitudes successives, obtenir 256 / 4 = 32 barres que vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X