J'essaie d'implémenter la compression de la plage dynamique audio en JavaScript (sans utiliser l'API audio Web).
Il y a beaucoup d'articles pour les techniciens du son et une documentation de haut niveau, mais je n'ai trouvé aucune référence utile pour implémenter la compression de la plage dynamique numérique.
D'après ce que je comprends, il y a au moins 3 étapes dans le calcul du signal rectifié.
- calculer le niveau d'entrée
- calculer le gain à appliquer au signal
- appliquer le gain
Je traite l'audio en blocs, donc pour 1) je pensais calculer le RMS d'un bloc
Des conseils sur une bonne référence? Ou quelqu'un qui veut m'expliquer un peu les étapes nécessaires pour mettre en œuvre cela?
Réponses:
Voici quelques suggestions:
Le principe est de créer une enveloppe du signal (contrôlée par l'attaque et le relâchement), de façonner cette enveloppe à l'aide d'une fonction de transfert (contrôlée par le rapport, le seuil et le genou), puis d'appliquer ce résultat au signal d'origine. Une étape de gain de maquillage suit souvent.
La réponse de @ Deve suggère quelques fonctions de transfert possibles.
la source
Pour un démarrage simple, j'utiliserais une caractéristique non linéaireg( x ) qui comprime votre signal d'entrée:
où (comme indiqué par endolith dans les commentaires)X est l' enveloppe du signal audio d'entrée ety est l'enveloppe de sortie qui est appliquée au signal audio réel. g( x ) peut être n'importe quelle fonction qui atténue les grandes valeurs d'entrée plus fortes que les petites valeurs d'entrée. La loi A etμ -Des fonctions de loi ont été développées pour compresser des signaux vocaux pour la téléphonie, par exemple. Je ne sais pas à quel point cela sonne bien pour la musique.
Une autre fonction de compression très simple serait d'atténuer toutes les amplitudes au-dessus d'un certain seuilδ :
Pour les compresseurs audio,δ est généralement donné en dB et r est exprimé sous forme de rapport, par exemple 3: 1 (c.-à-d. r = 3 ). Cela donne une fonction exponentielle, lorsqu'elle est exprimée linéairement (espérons qu'elle est correcte, veuillez la vérifier, égalementx > 0 ):
L'attaque et la libération ont un impact sur différents sons comme les coups de pied, les collets et la voix. Ils déterminent combien de temps avant que le seuil soit atteint, le compresseur doit commencer à fonctionner et combien de temps il doit encore fonctionner après que le signal est tombé en dessous du seuil. Pour mettre en œuvre cela, vous devrez utiliser une sorte d'anticipation.
Comme toutes les amplitudes ci-dessousδ sont atténués, la plage dynamique disponible n'est pas pleinement exploitée. Ceci est corrigé par le soi-disant "gain de rattrapage" qui est juste une simple multiplication du signal compressé avec un facteur de gainG > 1 . En réduisant d'abord la plage dynamique puis en amplifiant les compresseurs de signal, la musique peut paraître "plus forte".
la source