Hilfe bei der Implementierung der Komprimierung des Audiodynamikbereichs

8

Ich versuche, die Komprimierung des Audio-Dynamikbereichs in JavaScript zu implementieren (ohne Verwendung der Web-Audio-API).

Es gibt viele Artikel für Tontechniker und einige hochrangige Dokumentationen, aber ich konnte keine hilfreiche Referenz für die tatsächliche Implementierung der Komprimierung des digitalen Dynamikbereichs finden.

Soweit ich weiß, gibt es mindestens drei Schritte zur Berechnung des gleichgerichteten Signals.

  1. Berechnung des Eingangspegels
  2. Berechnen der Verstärkung, die auf das Signal angewendet werden soll
  3. Anwenden der Verstärkung

Ich verarbeite das Audio in Blöcken, also dachte ich für 1) daran, den Effektivwert eines Blocks zu berechnen

Irgendwelche Hinweise auf eine gute Referenz? Oder jemand, der bereit ist, mir die Schritte zu erklären, die erforderlich sind, um dies umzusetzen?

sebpiq
quelle
1
Nur um sicher zu gehen: Sie möchten so etwas implementieren: wells.com/plugins/c1-compressor , richtig?
Deve
ja :) aber viel viel einfacher! Die Kontrollen, die ich brauche, wären Schwelle, Knie, Verhältnis, Angriff, Freisetzung. Aber ich kann mit noch einfacher beginnen
sebpiq

Antworten:

4

Hier sind ein paar Vorschläge:

  • Es gibt viele OpenSource-Implementierungen (Sox, Audacity usw.). Selbst wenn Sie sie nicht verstehen, können Sie den Code möglicherweise von C nach Javascript übersetzen.
  • Mir ist keine gute Erklärung des Online-Prozesses bekannt, aber es gibt viele Bücher zu diesem Thema:
    • Die digitale Audiosignalverarbeitung behandelt dieses Thema und ist gut geschrieben. (Wie DAFX , aber DAFX ist schlecht organisiert und die Berichterstattung ist weniger einfach)
    • Digital Audio mit Java behandelt dieses Thema ebenfalls und enthält funktionierenden Java-Code, der sich leicht in andere Sprachen wie Javascript übersetzen lässt. Dieses Buch hat viele, viele Mängel, aber es ist gut für jemanden ohne Erfahrung in der Audioprogrammierung.

Das Prinzip besteht darin, eine Hüllkurve des Signals zu erstellen (gesteuert durch Angriff und Freigabe), diese Hüllkurve mithilfe einer Übertragungsfunktion (gesteuert durch Verhältnis, Schwelle und Knie) zu formen und dieses Ergebnis dann wieder auf das ursprüngliche Signal anzuwenden. Oft folgt eine Make-up-Gain-Phase.

Die Antwort von @ Deve schlägt einige mögliche Übertragungsfunktionen vor.

Björn Roche
quelle
Die Sache ist, dass ich C nicht kenne, und ja, das ist ein großes Hindernis bei der Arbeit mit Audio-DSP, da ich vorhandene Implementierungen nicht überprüfen kann. Ansonsten, danke für die Bücher, werde ich auf jeden Fall zumindest das erste überprüfen.
Sebpiq
Das DAFX-Buch enthält Matlab-Code. IDK, wenn es Matlab-Code für einen Kompressor hat.
Björn Roche
Für das Buch "Digitale Audiosignalverarbeitung" sagen Kommentare zu Amazon, dass es besser für Menschen mit elektrotechnischem Hintergrund ist. Kennen Sie ein Buch, das sich mehr auf Algorithmen konzentriert, das beste wäre beispielsweise Pseudocode?
Sebpiq
1
Auf die eine oder andere Weise müssen Sie einige neue Fähigkeiten erlernen, denke ich.
Björn Roche
Ja, ich weiß! Und dafür bin ich bereit. Es ist nur so, dass ich zum Beispiel keinen Matlab-Code möchte, da ich nicht dafür bezahlen möchte, dass Matlab sie testen kann. Deshalb habe ich gefragt, ob Sie andere Bücher mit beispielsweise Pseudocode anstelle einer bestimmten Sprache kennen (wie Java, an dessen Lernen ich wirklich nicht interessiert bin).
Sebpiq
2

Für einen einfachen Start würde ich eine nichtlineare Kennlinie , die Ihr Eingangssignal komprimiert:g(x)

y=g(x)

xyg(x)μ

δ

g(x)={xforxδax+(1a)δforx>δ
a<1x>0
log(g(x))={log(x)forxδ1rlog(x)+(11r)log(δ)forx>δ

δrr=3x>0

g(x)={xforxδδ11/rx1/rforx>δ
logg(x)x=δxx

Attack und Release wirken sich auf verschiedene Sounds wie Kicks, Snares und Vocal aus. Sie legen fest, wie lange vor Erreichen des Schwellenwerts der Kompressor arbeiten soll und wie lange er noch arbeiten soll, nachdem das Signal den Schwellenwert unterschritten hat. Um dies zu implementieren, müssen Sie eine Art Vorausschau verwenden.

δG>1

Deve
quelle
Vielen Dank! Tolle Erklärung. Ich bin zu einer Übertragungsfunktion gekommen, die der von Ihnen angegebenen nahe kommt, aber meine hat den Schwellenwert nicht enthalten (ich habe ihn mit dem Schwellenwert = 0 vereinfacht), daher muss ich neu berechnen.
Sebpiq
Tatsächlich ist die Übertragungsfunktion, die ich durch Hinzufügen des Schwellenwerts erhalte, x ^ (1 / r) * 10 ^ (- Sigma / (20 * r))
sebpiq
g(δ)=δ
Diese sehen aus wie Verzerrung, nicht wie Komprimierung. Verzerrung ist eine Änderung des Pegels, die von Abtastung zu Abtastung auftritt, während die Komprimierung über viele Zyklen der Wellenform erfolgt (von denen jede aus vielen Abtastwerten besteht). Nichtlineare Verzerrungen werden schrecklich klingen.
Endolith
@endolith Du hast recht, danke für den Hinweis. Ich habe meine Antwort entsprechend aktualisiert.
Deve