Estou procurando uma fórmula para compactar efetivamente uma forma de onda de áudio para limitar picos. Este não é um aplicativo de "controle automático de volume", em que se controlaria o ganho do amplificador para manter um nível de volume, mas, em vez disso, quero limitar os picos individuais ("suaves" truncados). (Eu sei que isso introduz harmônicos, mas estou tentando analisar os dados, não ouvi-los.)
Minha fórmula (muito crua) até agora é:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Onde nível é o nível sonoro instantâneo, média é o nível sonoro médio histórico e fator é um multiplicador usado para produzir o nível "ajustado" ( fator vezes nível ).
Além disso, esse multiplicador é aplicado apenas se computar para um valor menor que 1. Caso contrário, o nível não será ajustado.
A intenção é limitar o nível ajustado a alguns múltiplos (cerca de 15x com esta fórmula) da média histórica. Essa fórmula é o que eu preciso, mas exibe um "mergulho" à medida que os números aumentam. Ou seja, o nível ajustado (isto é, fator vezes nível ) aumenta até um ponto com o aumento do nível não ajustado, mas, em vez de ficar assintótico, começa a ficar realmente menor. (De fato, o primeiro fator foi adicionado principalmente para impedir que a fórmula fosse zero com valores extremamente altos.)
(A razão para querer limitar os valores dessa maneira é principalmente para que o ruído transitório não perturbe seriamente a média de execução do nível de som. Mas quando você está analisando roncos, o "ruído transitório" é bastante significativo, então eu posso simplesmente reprimi-lo. .)
Então, alguém pode sugerir algo melhor? (Parece que o comportamento assintótico é fácil de produzir quando você não o quer, mas difícil quando o faz.)