Sto cercando una formula per comprimere efficacemente una forma d'onda audio per limitare i picchi. Questa non è un'applicazione di "controllo automatico del volume" in cui si dovrebbe controllare il guadagno dell'amplificatore per mantenere un livello di volume, ma piuttosto voglio limitare ("soft" troncare) singoli picchi. (So che questo introduce armoniche, ma sto cercando di analizzare i dati, non di ascoltarli.)
La mia formula (molto grezza) finora è:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Laddove il livello è il livello sonoro istantaneo, la media è il livello sonoro medio storico e il fattore è un moltiplicatore utilizzato per produrre il livello "regolato" ( fattore volte livello ).
Inoltre, questo moltiplicatore viene applicato solo se viene calcolato con un valore inferiore a 1. In caso contrario, il livello viene lasciato non regolato.
L'intento è di limitare il livello corretto ad alcuni multipli (circa 15x con questa formula) della media storica. Questa formula è una specie di ciò di cui ho bisogno, ma mostra un "calo" man mano che i numeri diventano più grandi. Cioè, il livello regolato (cioè, fattore volte livello ) aumenta fino ad un punto con crescente livello non regolato, ma poi, piuttosto che andare asintotico, inizia effettivamente ottenere più piccoli. (In effetti, il primo fattore è stato aggiunto principalmente per evitare che la formula vada a zero con valori estremamente alti.)
(La ragione per voler limitare i valori in questo modo è principalmente che il rumore transitorio non sconvolge seriamente la media corrente del livello sonoro. Ma quando si analizza il "rumore transitorio" è abbastanza significativo, quindi posso semplicemente schiacciarlo .)
Quindi, qualcuno può suggerire qualcosa di meglio? (Sembra che il comportamento asintotico sia facile da produrre quando non lo vuoi, ma difficile quando lo fai.)