Jaime, miembro de nuestro equipo de trabajo, nos ha hecho el favor de redactar esta sección ya que domina a la perfección el tema.
Solución:
los array que está mostrando son los coeficientes de la Transformada de Fourier de la señal de audio. Estos coeficientes se pueden utilizar para obtener el contenido de frecuencia del audio. La FFT está definida para funciones de entrada con valores complejos, por lo que los coeficientes que obtenga serán números imaginarios aunque su entrada sea todos valores reales. Para obtener la cantidad de potencia en cada frecuencia, debe calcular la magnitud del coeficiente FFT para cada frecuencia. Este es no solo el componente real del coeficiente, necesitas calcular la raíz cuadrada de la suma del cuadrado de sus componentes real e imaginario. Es decir, si su coeficiente es a + b * j, entonces su magnitud es sqrt (a ^ 2 + b ^ 2).
Una vez que haya calculado la magnitud de cada coeficiente de FFT, debe averiguar a qué frecuencia de audio pertenece cada coeficiente de FFT. Una FFT de N puntos le dará el contenido de frecuencia de su señal en N frecuencias igualmente espaciadas, comenzando en 0. Porque su frecuencia de muestreo es 44100 muestras / seg. y el número de puntos en su FFT es 256, su espaciado de frecuencia es 44100/256 = 172 Hz (aproximadamente)
El primer coeficiente en tu array será el coeficiente de frecuencia 0. Ese es básicamente el nivel de potencia promedio para todas las frecuencias. El resto de sus coeficientes contará desde 0 en múltiplos de 172 Hz hasta llegar a 128. En una FFT, solo puede medir frecuencias hasta la mitad de sus puntos de muestra. Lea estos enlaces sobre la frecuencia de Nyquist y el teorema de muestreo de Nyquist-Shannon si es un glotón para el castigo y necesita saber por qué, pero el resultado básico es que sus frecuencias más bajas se replicarán o alias en los cubos de frecuencias más altas. Entonces, las frecuencias comenzarán desde 0, aumentarán en 172 Hz para cada coeficiente hasta el coeficiente N / 2, luego disminuirán en 172 Hz hasta el coeficiente N – 1.
Esa debería ser información suficiente para comenzar. Si desea una introducción mucho más accesible a las FFT que la que se ofrece en Wikipedia, puede intentar Comprensión del procesamiento de señales digitales: 2ª edición. Fue muy útil para mí.
Entonces eso es lo que representan esos números. La conversión a un porcentaje de altura se puede hacer escalando cada magnitud de componente de frecuencia por la suma de todas las magnitudes de componente. Aunque, eso solo le daría una representación de la distribución de frecuencia relativa, y no la potencia real para cada frecuencia. Podría intentar escalar según la magnitud máxima posible para un componente de frecuencia, pero no estoy seguro de que se muestre muy bien. La forma más rápida de encontrar un El factor de escala sería experimentar con señales de audio fuertes y suaves para encontrar la configuración correcta.
Finalmente, debe promediar los dos canales juntos si desea mostrar el contenido de frecuencia de toda la señal de audio como un todo. Está mezclando el audio estéreo en audio mono y mostrando las frecuencias combinadas. Si desea dos pantallas separadas para las frecuencias derecha e izquierda, deberá realizar la Transformada de Fourier en cada canal por separado.
Aunque este hilo tiene años, lo encontré muy útil. Solo quería dar mi opinión a cualquiera que encuentre esto y esté tratando de crear algo similar.
En cuanto a la división en barras, esto no debe hacerse como sugiere el antti, dividiendo los datos por igual en función del número de barras. Lo más útil sería dividir los datos en partes de octavas, siendo cada octava el doble de la frecuencia de la anterior. (es decir, 100 Hz es una octava por encima de 50 Hz, que es una octava por encima de 25 Hz).
Dependiendo del número de compases que desee, divida todo el rango en rangos de octava de 1 / X. Basado en una frecuencia central dada de A en la barra, obtiene los límites superior e inferior de la barra de:
upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )
Para calcular la siguiente frecuencia central adyacente, utiliza un cálculo similar:
next lower = A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )
Luego, promedia los datos que se ajustan a estos rangos para obtener la amplitud de cada barra.
Por ejemplo: queremos dividir en rangos de 1/3 de octavas y comenzamos con una frecuencia central de 1 kHz.
Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) = 890.9
Dadas 44100hz y 1024 muestras (43hz entre cada punto de datos) deberíamos promediar los valores de 21 a 26. (890.9 / 43 = 20.72 ~ 21 y 1122.5 / 43 = 26.10 ~ 26)
(Las barras de 1/3 de octava le darían alrededor de 30 barras entre ~ 40 Hz y ~ 20 kHz). Como ya puede darse cuenta, a medida que subimos, promediaremos un rango mayor de números. Las barras bajas generalmente solo incluyen 1 o una pequeña cantidad de puntos de datos. Mientras que las barras más altas pueden ser el promedio de cientos de puntos. La razón es que 86 hz es una octava por encima de 43 hz … mientras que 10086 hz suena casi igual que 10043 hz.
lo que tienes es una muestra cuya duración en el tiempo es 256/44100 = 0.00580499 segundos. Esto significa que su resolución de frecuencia es 1 / 0.00580499 = 172 Hz. Los 256 valores que obtienes de Python corresponden a las frecuencias, básicamente, de 86 Hz a 255 * 172 + 86 Hz = 43946 Hz. Los números que obtienes son números complejos (de ahí la “j” al final de cada segundo número).
EDITADO: INFORMACIÓN INCORRECTA CORREGIDA
Necesita convertir los números complejos en amplitud calculando la raíz cuadrada (i2 + j2) donde i y j son las partes real e imaginaria, resp.
Si desea tener 32 barras, por lo que tengo entendido, debería tomar el promedio de cuatro amplitudes sucesivas, obteniendo 256/4 = 32 barras como desee.
Tienes la opción de auxiliar nuestra tarea escribiendo un comentario y puntuándolo te estamos agradecidos.