107 votos

Analizar audio usando la transformación rápida de Fourier

Estoy tratando de crear una gráfica de un analizador de espectro en python.

Actualmente estoy leyendo 1024 bytes de 16 bits de doble canal de 44.100 Hz de frecuencia de muestreo de audio stream y el promedio de la amplitud de los 2 canales. Así que ahora tengo una matriz de 256 firmado cortos. Ahora quiero preformas una fft en la matriz, utilizando un módulo de numpy, y utilizar el resultado para crear la interfaz gráfica del analizador de espectro, que, para empezar va a ser sólo de 32 compases.

He leído los artículos de wikipedia en la transformada Rápida de Fourier y transformada de Fourier Discreta pero todavía estoy claro de lo que la matriz resultante representa. Esto es lo que la matriz se ve después de la preforma de una fft en mi matriz de uso de la colección:

   [ -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...

Me estoy preguntando qué es exactamente estos números representan y cómo iba a convertir estos números en un porcentaje de la altura de cada uno de los 32 compases. También, debería ser el promedio de los 2 canales juntos?

204voto

A. Levy Puntos 8344

La matriz que se muestra es la transformada de Fourier de los coeficientes de la señal de audio. Estos coeficientes pueden ser utilizados para obtener el contenido de frecuencia de la señal de audio. La FFT es definido por el complejo de valores de funciones de entrada, de modo que los coeficientes de salir serán los números imaginarios a pesar de que su entrada es de todos los valores reales. Con el fin de obtener la cantidad de energía en cada una de las frecuencias, es necesario calcular la magnitud de la FFT coeficiente para cada frecuencia. Este es no sólo el componente real del coeficiente, es necesario calcular la raíz cuadrada de la suma de los cuadrados de sus componentes real e imaginaria. Es decir, si el coeficiente es a + b*j, entonces su magnitud es sqrt(a^2 + b^2).

Una vez que se ha calculado la magnitud de cada FFT coeficiente, usted tiene que averiguar la frecuencia de audio de cada FFT coeficiente pertenece. Un N punto de FFT le dará el contenido de frecuencia de la señal en N equidistantes de frecuencias, a partir de 0. Debido a que su frecuencia de muestreo es de 44100 muestras / seg. y el número de puntos de la FFT es de 256, su espaciamiento de frecuencia es de 44100 / 256 = 172 Hz (aproximadamente)

El primer coeficiente de la matriz será el 0 coeficiente de frecuencia. Que es básicamente el nivel de potencia media para todas las frecuencias. El resto de sus coeficientes contará a partir de 0 en múltiplos de 172 Hz hasta llegar a 128. En una FFT, usted sólo puede medir frecuencias de hasta la mitad de sus puntos de muestra. Leer estos enlaces en la Frecuencia Nyquist y de Nyquist-Shannon Teorema de Muestreo si usted es un masoquista y necesitan saber por qué, pero el resultado básico es que la parte baja de frecuencias van a ser replicado o alias en la mayor frecuencia de los cubos. De modo que las frecuencias se empieza desde 0 el aumento de 172 Hz para cada coeficiente de hasta N/2 coeficiente, para luego disminuir en 172 Hz hasta la N - 1 coeficiente.

Eso debería ser suficiente información para comenzar. Si a usted le gusta de un modo mucho más accesible introducción a la Fft de lo que se da en la Wikipedia, se puede intentar la Comprensión de Procesamiento de Señal Digital: 2ª Ed.. Fue muy útil para mí.

Así que eso es lo que representan esos números. La conversión de un porcentaje de la altura se podría hacer mediante la ampliación de cada componente de frecuencia de la magnitud por la suma de todos los componentes de magnitudes. Aunque, eso sólo te dan una representación de la frecuencia relativa de distribución, y no de la potencia real para cada frecuencia. Usted podría tratar de una escala por la magnitud máxima posible para un componente de la frecuencia, pero no estoy seguro de que eso iba a mostrar muy bien. La manera más rápida de encontrar una viable factor de escala sería el experimento en voz alta y suave de las señales de audio para encontrar el ajuste correcto.

Por último, debe ser el promedio de los dos canales juntos, si desea mostrar el contenido de la frecuencia de toda la señal de audio como un todo. Se mezcla el audio estéreo en mono de audio y mostrando la combinación de frecuencias. Si desea dos pantallas separadas por la derecha y la izquierda frecuencias, que usted necesita para realizar el análisis de Fourier en cada canal por separado.

26voto

Erik A. Puntos 121

Aunque este hilo es de años, me pareció muy heplful. Sólo quería dar mi aporte a quien encuentre esto y estamos tratando de crear algo similar.

Como para la división en las barras de esto no se debe hacer como antti sugieren, dividiendo los datos igualmente basado en el número de barras. El más útil sería dividir los datos en la octava partes, cada una octava ser el doble de la frecuencia de la anterior. (ie. 100hz es una octava por encima de 50 hz, que es una octava por encima de 25hz).

Dependiendo de la cantidad de barras que usted desea, usted divide el conjunto de la gama en 1/X intervalos de octavas. Basándose en un centro de frecuencia de Una en el bar, consigue los límites superior e inferior de la barra de:

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

Para calcular el siguiente contiguo centro de frecuencia de uso similar de cálculo:

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

Luego el promedio de los datos que encaja dentro de estos rangos para obtener la amplitud de cada barra.

Por ejemplo: Queremos dividir en 1/3 octavas rangos y comenzamos con un centro de frecuencia de 1khz.

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

Dado 44100hz y 1024 muestras (43hz entre cada punto de datos) y el promedio de los valores de 21 a través de la 26. ( 890.9 / 43 = 20.72 ~ 21 y 1122.5 / 43 = 26.10 ~ 26 )

(1/3 de octava a las barras de conseguir alrededor de 30 bares de entre ~40hz ~20khz). Como se puede averiguar por ahora, como vamos más que de un promedio de un mayor rango de números. Bajo bares normalmente sólo incluyen 1 o un pequeño número de puntos de datos. Mientras que las barras más altas pueden ser el promedio de los cientos de puntos. La razón es que 86hz es una octava más arriba de 43hz... mientras 10086hz suena casi igual que 10043hz.

10voto

Antti Huima Puntos 15465

lo que tienen es una muestra, cuya duración en el tiempo es 256/44100 = 0.00580499 segundos. Esto significa que su resolución de frecuencia es de 1 / 0.00580499 = 172 Hz. Los 256 valores de salir de Python corresponden a las frecuencias, básicamente, de 86 Hz a 255*172+86 Hz = 43946 Hz. Los números son los números complejos (de ahí la "j" al final de cada segundo número).

EDITADO: SE CORRIGIÓ LA INFORMACIÓN INCORRECTA

Usted necesita para convertir los números complejos en amplitud mediante el cálculo de la función sqrt (**2 + j**2) donde i y j son las partes real e imaginaria, respectivamente.

Si quieres tener 32 bares, usted debe entiendo que tomar el promedio de los cuatro amplitudes sucesivas, obteniendo 256 / 4 = 32 bares como usted desea.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X