Detailierte Funktionsweise Kompressor

  • Hallo Zusammen,


    ich hätte da mal eine grundsätzliche Frage zur Funktionsweise eines (Dynamik-)Kompressors. Hoffe ich bin hier im richtigen Forum.
    Und zwar bin ich gerade dabei mir selbst ein kleines Programm zu basteln, mit welchem ein Audio-Signal komprimiert wird. Erstmal geht es um eine einfache Version des Ganzen: Mono, Hard-Knee, keine Hold-Time, Peak (kein RMS), kein Lock-Ahead.


    Die Parameter sind Threshold, Ratio, Attack und Release.


    Nun zum Problem:
    Mir ist nicht hundertprozentig klar, was der Kompressor während der Attack- und Release-Phase macht.


    Mein Programm sieht bisher so aus: Ich lese den Pegel des Signals Sample für Sample ein und vergleiche diesen mit der Threshold. Ist das Signal oberhalb der Threshold, so wird gemäß der Kompressorkennline die Amplitude dieses Samples reduziert (also Peak und Hard-Knee). Aber wie bringe ich da die Attack- und Release-Zeiten rein? Was passiert innerhalb dieser Zeiten genau? Wenn man im Netz liest, findet man oft nur grobe Beschreibung wie "Ein- und Ausschwingphase", etc.


    Kann mir jemand sagen, wie sich der Kompressor dabei genau verhält? Nach meinem bisherigen Verständnis ist es wohl so, dass die Attackzeit quasi "startet", sobald die Threshold überschritten wird. Innerhalb dieser z.B. 10ms wird die Ratio von 1 z.B. auf 5 geregelt. Sprich die Kennlinie knick am Threshold-Punkt langsam immer weiter ab. Sobald die Attack-Zeit "abgelaufen" ist, startet die Release-Zeit, die die Ratio quasi wieder langsam zurück auf 1 setzt. Stimmt das soweit? Oder lieg ich damit total daneben und die Ratio wird überhaupt nicht beeinflusst?


    Falls jemand ein Programm-Beispiel (Quelltext, Diagramme, etc) oder Ähnliches hat, gerne her damit ;) Irgendwie hab ich mir das etwas leichter vorgestellt.


    Hoffe, ihr könnt mir mit meiner dummen Frage weiterhelfen und ein wenig Licht ins Dunkle bringen!


    Vielen Dank schonmal!


    Gruß Markus

  • vom prinzip her hast du die zusammenhänge ja schon vollkommen richtig erkannt.


    jetzt musst du dir mal ein paar reale signale auf der zeitachse anschauen. die idee bei einer etwas verlangsamten attackzeit ist, das man die ersten (transienten) signalanteile manchmal (oder besser oft) nicht antasten möchte, weil hier viele wichtige erkennungsmuster für unser ohr enthalten sind.
    der trick ist nun einfach der, die ansprechschwelle (threshold) nicht nur rein pegelabhängig zu machen, sondern auch in eine zeitliche abhängigkeit zu bringen.
    ebenso die releasezeit, was ein an die signalform angepasstes und damit unauffälligeres arbeiten ermöglicht.
    mit welchen funktionskurven die einzelnen hersteller da genau arbeiten, ist auch eine philosophiefrage. ich schätze das werden sie nur ungern verraten...


    so, ich geh jetzt mal mischen...

    mit kollegialen Grüßen
    Wolfgang

  • Danke für die Antwort. Klar, die einzelnen Funktionskurven der Hersteller machen dann den Unterschied. Wie gesagt, im Groben hab ichs schon verstanden, aber ein mir fehlt noch ein wenig des Grundverständnis.


    Z.B.: Werden während der Attack, Hold oder Releasezeit auch Signale mit Pegel unterhalb der Threshold reduziert? Sprich wird einmal die Threshold bestimmt und die dazugehörige Gainreduktion und diese Reduktion auf jedes einzelne Sample angewendet? Oder wird für jedes Sample die Reduktion anhand der Kennlinie neu bestimmt?


    Die Attack und Releasezeit beeinflusst also nicht direkt die Gainreduktion sondern eher die Threshold und daraus resultierend die Reduktion? Habe ich das richtig verstanden? Dachte das hier eher der Unterschied zwischen Peak und RMS Ermittlung liegt...


    Derzeit mache ich es so, dass ich während der Attack-Phase, also sobald die Threshold überschritten wurde, langsam die Ratio von 1 auf den eingestellten Wert fahre (linear). Währenddessen berechne ich für jedes Sample die Gainreduktion anhand der Kennlinie mit der zu dem Zeitpunkt aktuellen Ratio. D.h. kommt nach einem sehr lauten Sample ein sehr leises, so wird das laute Sample heruntergeregelt, das leise allerdings nicht.


    Derzeit klingt der Kompressor ziemlich ätzend und zerrt auch mit sehr langen Attack- oder Release-Zeiten. Ich gehe davon aus, dass die Umsetzung im Programmcode stimmt. Allerdings scheint mein Ansatz nicht der richtige zu sein.


    Dann noch ne Frage:
    1) Wann beginnt die Release-Zeit? Sobald die Attackzeit abgelaufen ist, oder sobald der Pegel unterhalb der Threshold fällt?
    2) Was macht der Kompressor wenn er auf ein Signal oberhalb der Threshold reagiert und entsprechend herunter regelt, kurz darauf aber ein noch lauteres Signal kommt? Läuft die Attackzeit erneut los?
    3) Was genau macht die Hold-Zeit? Hält diese die Reduktion während der Hold-Zeit aufrecht, auch wenn der Pegel bereits unterhalb der Threshold ist? Das würde bedeuten, dass es egal wäre ob ich bei einem 100ms langen Signal mit gleichem Pegel 10, 30 oder 50ms Hold-Zeit einstelle. Der Kompressor würde komplett identisch reagieren oder?


    Ich hoffe, dass sich vielleicht auch noch ein paar Andere finden, die mal was dazu sagen können. Stehe echt aufm Schlauch!


    Danke!!!

  • zu 1.) Release ist die Zeit, die der Kompressor das Signal komprimiert, sobald das Signal den Threshhold übersteigt.
    zu 2.) die Attack-Zeit wird ignoriert, jedoch die Release-Zeit läuft von vorne wieder los.
    zu 3.) Hold-Zeit ist die Zeit zwischen dem (letzten) überschreiten des Threshholds und vor dem Start der Release-Zeit.


    Hier noch 3 Links:


    Wikipedia


    Diverse Beispiele mit Tips & annähernden Richtwerten von Kompressor-Einstellungen


    Erklärung & Anwendungsbeispiele



    Grüßle


    sec

    "geht nicht" ? - gibt's nicht !

    ...ja, das war schon immer mein Avatar :evil:

    "Mit der Dummheit kämpfen Götter selbst vergebens" (Friedrich Schiller, "Jungfrau von Orleans" )

  • Wenn du jedes Sample einzeln bewertest, also ein hochamplitudiges Sample komprimierst, ein folgendes leises aber nicht, ist es klar, dass es ätzend klingt. Das würde ja z.B. bedeuten, dass du von einem reinen Sinus nur den Teil, der oberhalb deines Thresholds liegt, im Pegel reduzierst, den Teil unterhlab aber nicht. Damit entstellst du den Sinus und fügst Obertöne hinzu, die nicht gewollt sind. Du musst also dafür sorgen, dass eine Thresholdüberschreitung regelungstechnisch auch noch auf nachfolgende Samples wirkt und die Pegelreduktion zudem sanft wieder auf Normalpegel zurückgeführt wird, wenn der Threshold unterschritten wird, damit es keine "Abrissartefakte" gibt.


    Wenn innerhalb der Attackzeit ein weiteres Mal der Threshold überschritten wird, läuft diese unverändert bis zum Ende und dann setzt die Releasezeit ein (sodenn es nicht noch eine Holdzeit vorher gibt). Wird innerhalb der Hold- oder Releasezeit der Threshold wieder überschritten, beginnt die Hold-Zeitspanne von vorne. Gibt es nur Release, beginnt diese von vorne.


    Release kommt nach Attack oder Hold, aber nur, wenn der Threshoild unterschritten wird. In dieser Zeit wird die Pegelreduktion wieder auf 0 zurückgeführt. Hold hält die Pegelreduktion konstant innerhalb der eigestellten Zeitspanne, es sei denn, der Threshold wird nochmals überschritten, und zwar noch kräftiger.
    Mit welcher Funktion du den Pegel in der Releasezeit auf Normal zurückführst, solltest du ausprobieren. Linear, exponentiell, was hybrides... Ausprobieren, was sich für dich gut anhört... oder mach es einstellbar.


    Der Unterschied zwischen Peak und RMS-Kompressor liegt nicht in der Attackzeit, sondern in der Art, wie das Steuersignal generiert wird. Peaklimiter lässt das Nutzsignal wie es ist zum Detektor durch, der daraus aus den Einstellungen die nötige Reduktion generiert. Ein RMS-Kompressor erstellt aus dem Nutzsignal erstmal ein RMS-Signal, also einen Durchschnittswert über eine bestimmte Zeit, bevor der Detektor irgendwas mit dem Signal anfängt. Das heißt, ein einfacher Peak lässt den Kompressor ohne Weiteres erstmal gar nicht ansprechen. Erst, wenn der Pegel dauerhaft im Mittel höher wird, wird intern der Threshold überschritten und der Pegel den Einstellungen entsprechend reduziert.

  • "Ein RMS-Kompressor erstellt aus dem Nutzsignal erstmal ein RMS-Signal, also einen Durchschnittswert über eine bestimmte Zeit, bevor der Detektor irgendwas mit dem Signal anfängt. "


    -> Ein RMS - Signal ist kein einfacher Durchschnittswert (der wäre bei einem typischen Musiksignal ohne Gleichanteil exakt bei Null) sondern eine quadratische Kenngrösse. D. h. Jeder Momentanwert (Sample) wird quadriert, die einzelnen Werte über einen Zeitraum (theoretisch eine ganzzahlige Anzahl Perioden oder unendlich lange, praktisch eine fixe so lange Zeit, daß viele Perioden der niedrigsten Frq. vorkommen und abgeschnittene Perioden nicht ins Gewicht fallen) aufintegriert, durch genau diese Zeit wieder dividiert (="normiert"), dann aus dem Ergebnis die Wurzel gezogen. Ergebnis = RMS - Wert für diesen Zeitabschnitt.


    "Wenn du jedes Sample einzeln bewertest, also ein hochamplitudiges Sample komprimierst, ein folgendes leises aber nicht, ist es klar, dass es ätzend klingt. Das würde ja z.B. bedeuten, dass du von einem reinen Sinus nur den Teil, der oberhalb deines Thresholds liegt, im Pegel reduzierst, den Teil unterhlab aber nicht. Damit entstellst du den Sinus und fügst Obertöne hinzu, die nicht gewollt sind. "


    Dieser Fall wäre eine sogenannte "nichtlineare zeitinvariante Kennlinie", auch "Distortion" genannt, ein Kompressor ist aber ein nichtlineares zeitvariantes Systm, d. h. ihm ist es nicht egal bei der Bearbeitung eines Samples, was vorher war.

  • Ich habe ja auch nicht "ein einfacher Durchschnittswert" geschrieben. Dass das bei einem Audiosignal kein einfacher numerischer Durchschnitt sein kann, sollte eigentlich klar sein. Im Prinzip geht es um den Energiegehalt in einem Zeitfenster.


    Zitat

    ein Kompressor ist aber ein nichtlineares zeitvariantes Systm, d. h. ihm ist es nicht egal bei der Bearbeitung eines Samples, was vorher war.


    So sollte es sein, aber wenn er es nicht entsprechend programmiert, wird eben doch alles vor dem jeweiligen Sample ingnoriert.

  • Sorry, viel Text 8)


    markus maier
    Stell dir das mit der Attack- und Release-Zeit mal eher wie folgt vor:
    Du bist der Kompressor und hast ein Potentiometer als Regelelement. Die Zeitangaben bestimmen jetzt, wie schnell du an deinem Rad drehen kannst, um den gewünschten Zielwert in der Absenkung zu erreichen. Also wie eine Art Dämpfung, die deine Drehbewegung am Poti mehr oder wenig hemmt. Kurze Zeiten = schwache Dämpfung, lange Zeiten = starke Dämpfung, für beide Drehrichtungen verschieden einstellbar.


    Eine Attack-Zeit von 50 ms würde bedeuten, dass du (ab dem Zeitpunkt, an dem die Schwelle überschritten wird) 50 ms brauchst, um die durch Ratio (z.B. 2:1) und relativen Pegel über der Schwelle (z.B. um 6 dB überschritten) benötigte Absenkung zu erreichen. Hier müsstest du also (wenn es ein idealisiertes Sinus-Signal mit konstantem Spitzenpegel ist) um 3 dB zurückregeln. Mit welcher Kurvenform du das jetzt erreichst, ist dir überlassen.


    Mit der Release-Zeit verhält es sich ähnlich, nur bestimmt man hier eben Geschwindigkeit, mit der aus der Absenkung wieder zurück zur einfachen 1:1 Durchleitung des Signals zurückgekehrt wird.


    Du musst dich außerdem von der Vorstellung lösen, dass diese Zeiten immer "ablaufen". Wenn du den Schwellwert nur kurz aber drastisch (z.B. für 1 ms um 20 dB) überschreitest, deine Attack-Zeit aber bei sagen wir 100 ms liegt, führt das logischerweise nicht dazu, dass ein Kompressor dann trotzdem nach den 100 ms um 20 dB runterkomprimiert hat. Er wird vielleicht (je nach Ausgestaltung der Regelkurve) um 1-2 dB runterziehen und dann im Rahmen der Release-Zeit wieder freigeben.


    In dem Bild mit dem gedämpften Poti kannst du dir die Hold-Zeit wie eine Sperre vorstellen. Hast du das Poti einmal in Richtung Absenkung gedreht, ist der Rückweg für die Dauer der Hold-Zeit gesperrt, d.h. bevor du dass Signal wieder anheben kannst, musst du mindestens die Hold-Zeit abwarten.


    Und wo du auch aufpassen musst bei deiner Sample-Arithmetik: Das Ohr reagiert (näherungsweise) logarithmisch, d.h. wenn du die absoluten Sample-Werte betrachtest und die Skala als linear annimmst, wirst du nicht die erwarteten Ergebnisse bekommen. Beispiel: 16 Bit-Samples, max. positiver Wert 32767, entsprechend 0 dBFS, der Dynamikbereich ist 96 dB. Man könnte jetzt annehmen, dass die Hälfte (also 48 dB) auch beim halben Maximalwert liegt, d.h. bei 16383, dem ist aber nicht so. Vielmehr entsprechen -6 dBFS dem halben Maximalwert (oder einem Bit weniger), -12 dBFS sind dann 8191 als Samplewert usw.


    Idee zur Implementierung in deinem Programm: Ich nehme an, dass du jeweils Sample für Sample durchgehst. Nimm eine Variable als dein Poti, jeder Sample-Wert wird mit dem aktuellen Wert der Variable multipliziert, um die Absenkung zu erreichen (z.B. x = 0,5 entsprechend 6 dB Reduktion). Je nach Höhe des aktuellen Sample-Werts kannst du jetzt deine "Poti"-Variable entsprechend größer oder kleiner machen, in jedem Schritt aber immer nur ein kleines bißchen, entsprechend deiner Drehung am Poti. Beispiel: Attack-Zeit 50 ms entsprechend 2400 Samples bei 48 kHz, gewünschte Reduktion 6 dB. Dein Poti ist zunächst auf "Rechtsanschlag", d.h. keine Reduktion, x = 1. Pro Schritt müsstest du jetzt also jeweils x mit exp(-0,0003) multiplizieren, um dann nach 2400 Schritten bei etwa 0,5 zu landen. Dabei sei natürlich vorausgesetzt, dass der Signalpegel in diesen 50 ms konstant ist, d.h. die gewünschte Absenkung auch weiterhin konstant bei 6 dB bleibt.


    Der Exponent (also hier die -0,0003) ist die Größe, die du mit deiner Pegel-Erkennung regelst. 0 bedeutet keine Änderung an der Reduktion, sie bleibt wo sie ist. Negative Werte lassen den Kompressor zunehmend eingreifen, und zwar um so mehr je negativer der Wert ist. Positive Werte hingegen verringern die Reduktion. Abhängig vom Eingangspegel im Verhältnis zum Threshold würdest du also den Exponenten wählen: Signalpegel unter dem Threshold = Exponent positiv, Signalpegel über dem Threshold = Exponent negativ. Eine Einschränkung gibt es noch: Dein Sample-Skalierungsfaktor x darf niemals größer als 1 werden, sonst verstärkt dein Kompressor. Einen Make-Up-Gain würde man danach z.B. als konstanten Faktor implementieren.


    Ich hoffe das klärt einige Fragen. Viele Grüße & Erfolg
    Joern

    Faderfreaks Veranstaltungstechnik GbR