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