Je recherche une formule pour compresser efficacement une forme d'onde audio afin de limiter les pics. Ce n'est pas une application de "contrôle automatique du volume" où l'on contrôlerait le gain de l'amplificateur pour maintenir un niveau de volume, mais je veux plutôt limiter (tronquer "en douceur") les pics individuels. (Je sais que cela introduit des harmoniques, mais j'essaie d'analyser les données, pas de les écouter.)
Ma formule (très grossière) jusqu'à présent est la suivante:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Où level est le niveau sonore instantané, average est le niveau sonore moyen historique et factor est un multiplicateur utilisé pour produire le niveau "ajusté" ( facteur multiplié par le niveau ).
De plus, ce multiplicateur n'est appliqué que s'il calcule à une valeur inférieure à 1. Sinon, le niveau n'est pas ajusté.
L'intention est de limiter le niveau ajusté à un multiple (environ 15x avec cette formule) de la moyenne historique. Cette formule est en quelque sorte ce dont j'ai besoin, mais présente une "baisse" à mesure que les chiffres augmentent. C'est-à-dire que le niveau ajusté (c.-à-d. Le facteur multiplié par le niveau ) augmente jusqu'à un certain point avec l'augmentation du niveau non ajusté mais ensuite, plutôt que de devenir asymptotique, il commence à diminuer. (En fait, le premier facteur a été ajouté principalement pour empêcher la formule d'aller à zéro avec des valeurs extrêmement élevées.)
(La raison de vouloir limiter les valeurs de cette façon est principalement que le bruit transitoire ne perturbe pas sérieusement la moyenne courante du niveau sonore. Mais lorsque vous analysez les ronflements, le "bruit transitoire" est assez important, donc je peux simplement le supprimer .)
Alors, quelqu'un peut-il suggérer quelque chose de mieux? (Il semble que le comportement asymptotique soit facile à produire lorsque vous ne le souhaitez pas, mais difficile lorsque vous le faites.)