Se necesita una fórmula de limitación de pico / compresión de audio

9

Estoy buscando una fórmula para comprimir efectivamente una forma de onda de audio para limitar los picos. Esta no es una aplicación de "control de volumen automático" en la que se controlaría la ganancia del amplificador para mantener un nivel de volumen, sino que quiero limitar los picos individuales (truncamiento "suave"). (Sé que esto introduce armónicos, pero estoy tratando de analizar los datos, no escucharlos).

Mi fórmula (muy cruda) hasta ahora es:

factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))

Cuando el nivel es el nivel de sonido instantánea, media es el nivel de sonido promedio histórico, y factor de es un multiplicador utilizado para producir el nivel "ajustado" ( factor de veces el nivel ).

Además, este multiplicador solo se aplica si se calcula a un valor inferior a 1. De lo contrario, el nivel no se ajusta.

La intención es limitar el nivel ajustado a algún múltiplo (aproximadamente 15x con esta fórmula) del promedio histórico. Esta fórmula es más o menos lo que necesito, pero muestra una "caída" a medida que los números aumentan. Es decir, el nivel ajustado (es decir, el factor multiplicado por el nivel ) aumenta hasta un punto al aumentar el nivel no ajustado, pero luego, en lugar de volverse asintótico, comienza a reducirse. (De hecho, el primer factor se agregó principalmente para evitar que la fórmula llegue a cero con valores extremadamente altos).

(La razón para querer limitar los valores de esta manera es principalmente para que el ruido transitorio no altere seriamente el promedio de ejecución del nivel de sonido. Pero cuando analizas ronquidos, el "ruido transitorio" es bastante significativo, así que puedo simplemente silenciarlo .)

Entonces, ¿alguien puede sugerir algo mejor? (Parece que el comportamiento asintótico es fácil de producir cuando no lo quieres, pero difícil cuando lo haces).

Daniel R Hicks
fuente

Respuestas:

9

Aquí hay dos problemas: cómo obtener una estimación confiable del nivel y cómo comprimir los datos.

  • Utilice estadísticas robustas en los datos originales (sin límite de picos) como mediana o cuantiles en lugar de un promedio móvil para hacer que su detección de "nivel típico" sea robusta para los valores atípicos.
  • k×tanh(Xk)C

ejemplo

  • Azul: señal original
  • Verde: 2 veces la mediana del valor absoluto sobre una ventana deslizante como detección de "nivel típico"
  • Rojo: compresión de tanh (fórmula dada arriba con k igual al nivel trazado en verde)
pichenettes
fuente
Gracias, eso parece prometedor. Lo enchufaré y veré cómo funciona.
Daniel R Hicks
1
Lo probé y parece estar funcionando bien (después de aclarar un par de comprobaciones con los dedos). Mi único problema con esto es que no parece haber ninguna forma de ajustar la nitidez de la "rodilla" sin arruinar el nivel del clip o lo que sea.
Daniel R Hicks
¿Por qué la "mediana móvil" es mejor que la "media móvil"? Leí en muchos lugares que es menos sensible a los valores atípicos. Pero no puedo ver esto con datos reales . ¿Alguna idea sobre esta pregunta?
Basj