Estoy tratando de implementar la compresión de rango dinámico de audio en JavaScript (sin utilizar la API de audio web).
Hay muchos artículos para técnicos de sonido y documentación de alto nivel, pero no pude encontrar ninguna referencia útil para implementar realmente la compresión digital de rango dinámico.
Por lo que entiendo, hay al menos 3 pasos en el cálculo de la señal rectificada.
- calcular el nivel de entrada
- calcular la ganancia para aplicar a la señal
- aplicando la ganancia
Proceso el audio en bloques, así que para 1) estaba pensando en calcular el RMS de un bloque
¿Algún puntero a una buena referencia? ¿O alguien dispuesto a explicarme un poco los pasos necesarios para implementar esto?
audio
dynamic-range-compression
sebpiq
fuente
fuente
Respuestas:
Aquí hay algunas sugerencias:
El principio es crear una envolvente de la señal (controlada por ataque y liberación), dar forma a esa envolvente utilizando alguna función de transferencia (controlada por relación, umbral y rodilla), y luego aplicar ese resultado a la señal original. A menudo sigue una etapa de ganancia de maquillaje.
La respuesta de @ Deve sugiere algunas posibles funciones de transferencia.
fuente
Para un comienzo simple, usaría una característica no linealsol( x ) que comprime su señal de entrada:
donde (como lo señala el endolito en los comentarios)X es la envolvente de la señal de audio de entrada yy es la envolvente de salida que se aplica a la señal de audio real. sol( x ) puede ser cualquier función que atenúe los valores de entrada grandes más fuertes que los valores de entrada pequeños. La ley A yμ -Las funciones legales se han desarrollado para comprimir señales de voz para telefonía, por ejemplo. Sin embargo, no sé qué tan bueno suena esto para la música.
Otra función de compresión muy simple sería atenuar todas las amplitudes por encima de cierto umbral.δ :
Para compresores de audio,δ generalmente se da en dB y r se expresa como alguna relación, por ejemplo, 3: 1 (es decir r = 3 ) Esto produce una función exponencial, cuando se expresa linealmente (espero que sea correcto, verifíquelo tambiénx > 0 ):
El ataque y la liberación tienen un impacto en diferentes sonidos como patadas, trampas y voces. Determinan cuánto tiempo antes de alcanzar el umbral el compresor debería comenzar a funcionar y cuánto tiempo debería seguir funcionando después de que la señal haya caído por debajo del umbral. Para implementar esto, tendrá que usar algún tipo de anticipación.
Como todas las amplitudes a continuaciónδ están atenuados, el rango dinámico disponible no está completamente explotado. Esto se corrige con la llamada "ganancia de maquillaje", que es solo una simple multiplicación de la señal comprimida con un factor de gananciaG > 1 . Al reducir primero el rango dinámico y luego amplificar los compresores de señal puede hacer que la música parezca "más fuerte".
fuente