formule de limitation de crête / compression audio nécessaire

9

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

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

Daniel R Hicks
la source

Réponses:

9

Deux problèmes ici: comment obtenir une estimation fiable du niveau et comment compresser les données.

  • Utilisez des statistiques robustes sur les données d'origine (non limitées par les pics) comme la médiane ou les quantiles au lieu d'une moyenne mobile pour rendre votre détection de "niveau typique" robuste aux valeurs aberrantes.
  • k×tanh(Xk) fonctionne bien comme formule de compression et c'est en fait ce qui se passe dans certains circuits audio (en utilisant les OTA). Pour obtenir une compression adaptative qui préserve la dynamique du signal d'origine et supprime simplement les transitoires, faites k suivre le niveau "moyen" lissé.C

exemple

  • Bleu: signal d'origine
  • Vert: 2 x médiane de la valeur absolue sur une fenêtre coulissante comme détection de "niveau typique"
  • Rouge: compression tanh (formule donnée ci-dessus avec k égal au niveau tracé en vert)
pichenettes
la source
Merci, cela semble prometteur. Je vais le brancher et voir comment ça se passe.
Daniel R Hicks
1
Je l'ai essayé et il semble bien fonctionner (après avoir effacé quelques vérifications des doigts). Mon seul problème est qu'il ne semble pas y avoir de moyen d'ajuster la netteté du "genou" sans bloquer le niveau du clip ou quoi que ce soit.
Daniel R Hicks
Pourquoi la «médiane mobile» est-elle meilleure que la «moyenne mobile»? J'ai lu dans de nombreux endroits qu'il est moins sensible aux valeurs aberrantes. Mais je ne peux pas voir cela avec des données réelles . Une idée sur cette question?
Basj