Beispiel zum Dithering und Noise Shaping

Antworten
frankl
Aktiver Hörer
Beiträge: 487
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beispiel zum Dithering und Noise Shaping

Beitrag von frankl »

Hallo Forenten,

angeregt durch Ulis Spektrogramme in diesem Thread habe ich mir nochmal meinen eigenen Beitrag in diesem Thread angesehen (der in der dortigen Diskussion wohl fast untergegangen ist). Ich möchte hier nochmal eine mit Bildern erweiterte Version posten.

Es soll mit einem richtigen Musikstück demonstriert werden, wozu dithering und noise shaping gut sind. In Ulis Thread geht es darum, ein Signal mit sehr niedrigem Pegel abzuspielen und wieder zu digitalisieren. Was ich hier vormache spielt nur im Digitalen, deshalb in einem separaten Thread.

Dies kann jeder nachmachen, der 'SOX' und 'Audacity' oder äquivalente Programme hat.

Hier ist ein Musikstück in der Datei data.wav ("Sketches" mit Paul Motion (Schlagzeug, meist Becken), Joe Lovano (Saxophon) und Bill Frisell (E-Gitarre)) mit 44100 16-Bit-Samples pro Sekunde, jedes Sample wird also durch eine ganze Zahl im Bereich −32768 bis 32767 dargestellt. In 'audacity' sieht das graphisch so aus:

Bild

und in der Spektralansicht wird gezeigt, welche Frequenzbereiche jeweils dominieren:

Bild

Mit dieser Kommandozeile

Code: Alles auswählen

    sox data.wav -t raw -e float -b 64 - | sox -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e float -b 64 - vol 0.000025 | sox -V -D -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e signed -b 16 - |sox -t raw -c 2 -r 44100 -e signed -b 16 - testbad.wav vol 512.0
werden
  • dann die Lautstärke um den Faktor 40000 verringert (in der ursprünglichen 16 Bit Darstellung wären jetzt alle Samples 0, aber durch die genaue Fließkommadarstellung ist hier noch alle Information vorhanden).
  • dann werden die Samples wieder in ganze Zahlen mit 16Bit umgerechnet (mathematisch: mit 32768 multipliziert und zur nächsten ganzen Zahl gerundet)
  • dann wird die Lautstärke um den Faktor 512 erhöht (nur damit man was sieht und hört)
In der Ergebnisdatei testbad.wav haben jetzt alle Samples einen von drei Werten (meist 0, manchmal +512 oder -512). Um das besser zu sehen, wird die Lautstärke nochmal um den Faktor 64 erhöht, dann sieht das so aus:

Bild

und in der Spektralansicht:

Bild

Anhören ist grausam, meist Stille und scheußliche Klicks; die brutale Rundung auf 16 Bit Ganzzahlen hat die Musikdatei unwiederbringlich zerstört!

Die folgende Kommandozeile

Code: Alles auswählen

    sox data.wav -t raw -e float -b 64 - | sox -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e float -b 64 - vol 0.000025 | sox -V -D -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e signed -b 16 - dither   |sox -t raw -c 2 -r 44100 -e signed -b 16 - test.wav vol 512.0
sieht fast genauso aus, wie die erste - bis auf das Wort "dither" und dem Namen der Ergebnisdatei test.wav! Der Unterschied ist, dass 'sox' jetzt zuerst eine "zufällige" kleine Zahl zu jedem Sample addiert, bevor in 16 Bit Ganzzahlen zurück konvertiert wird. ("Kklein" heißt hier: in der Größenordnung von einem Ganzzahlschritt in der 16 Bit Darstellung.)

Hm, und was soll das retten? Sehen wir wieder die graphische Darstellung an:

Bild

Und mit höherer Lautstärke:

Bild

mit einem kleinen Ausschnitt:

Bild

und Spektralansicht:

Bild

Das sieht nach lautem Rauschen aus. Das ist es auch, aber wenn man genau hinsieht, schimmert in der Spektralansicht auch etwas vom Original durch. Und das bestätigen die Ohren, beim Abspielen ist ein lautes Rauschen zu hören und darunter ist das ursprüngliche Stück wieder zu erkennen.

Wie kann das sein? Die grobe Idee ist, dass ein Fließkommawert wie zum Beispiel 0.1 durch die Addition einer Zufallszahl bei der Rundung nicht immer zu einer 0 führt, sondern manchmal auch zu einer 1, und zwar so, dass von 100 Samples mit dem Wert 0.1 ungefähr 10 Mal bei der Rundung 1 und sonst 0 herauskommt, also im "Mittel" etwa 0.1. Jedes einzelne Sample wird dadurch nur noch ungenauer repräsentiert. Beim Hören und bei der Berechung der Spektralansicht wird aber nicht Sample für Sample separat verarbeitet, sondern es findet gerade eine Mittelung über kurze Zeitintervalle statt, um das Frequenzspektrum zu analysieren. Durch das Dithering wird im Ergebnis also zusätzliche statistische Information über das Originalsignal kodiert, und zwar gut genug, damit wir das Stück wiedererkennen können. Ganz wichtig ist an dieser Stelle, dass vor der Rundung (also Rückübersetzung in 16 Bit Zahlen) unsere Samples eine höhere Genauigkeit haben. Wenn das nicht der Fall wäre, gäbe es ja gar nichts, was das Dithering statistisch kodieren könnte und es würde nur ein leises zusätzliches Rauschen erzeugt.

Zum Schluss noch das noise shaping. Das geht mit dieser Kommandozeile:

Code: Alles auswählen

    sox data.wav -t raw -e float -b 64 - | sox -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e float -b 64 - vol 0.000025 | sox -V -D -t raw -c 2 -r 44100 -e float -b 64 - -t raw -c 2 -r 44100 -e signed -b 16 - dither -f high-shibata  |sox -t raw -c 2 -r 44100 -e signed -b 16 - testgood.wav vol 512.0
Jetzt merkt sich 'sox' die Abweichungen der auf 16 Bit gerundeten Samples von den genaueren Originalsamples und diese Terme gehen in einigen der folgenden Samples auch in die Berechnung des gerundeten Wertes ein. Das will ich hier nicht genauer erklären, sondern nur anmerken, dass dadurch viel von dem durch Dithering erzeugten Rauschen in höhere Frequenzen verschoben wird.

Das Ergebnis in der Datei testgood.wav sieht nun so aus:

Bild

Beim Anhören ist nun ziemlich leise gut die Originalmusik zu erkennen. Geht das auch lauter? Es zeigt sich, dass mit einem steilen Tiefpassfilter bei 13 kHz (darüber höre ich eh nichts) folgendes übrig bleibt:

Bild

Das kann dann auch lauter gemacht werden:

Bild

und in der Spektralansicht:

Bild

ist recht viel von der Originaldatei zu erkennen.

Beim Anhören sind jetzt die langen eingeschwungenen Töne des Saxophons und der E-Gitarre wieder gut zu erkennen. Transienten, also sehr kurze Impulse, insbesondere die Schlagzeugbecken, sind allerdings nicht mehr auszumachen. Das passt ganz gut zu der Statistik-Erklärung von oben.

Also, ich war verblüfft, als ich das erste Mal gesehen und gehört habe, wieviel von der Musik, deren Samples durch die Lautstärkeveringerung eine kleinere Amplitude als das kleinste Bit haben, noch rekonstruiert werden kann. Und ich finde es interessant, wie ähnlich die graphische Mustererkennung in der Spektralansicht der Mustererkennung beim Hören zu sein scheint.

Die Audiodateien will ich hier nicht verlinken, damit es keine Copyright-Probleme gibt. (Wer sox hat, kann das ja auch leicht nachmachen. Und es gibt PN).

Viele Grüße,
Frank
Bild
uli.brueggemann
Aktiver Hersteller
Beiträge: 4659
Registriert: 23.03.2009, 15:58
Wohnort: 33649
Kontaktdaten:

Beitrag von uli.brueggemann »

Yep, Dithering ist schon eine faszinierende Geschichte.

Spannend ist es auch, wenn man die Bittiefe verringert, also die unteren Bits eines Tracks abschneidet. Das kann man so weit treiben, bis sich ein Stück eben nicht mehr so nett anhört. Und wenn man dann wiederum anstelle der truncation ein Dithering auf diesselbe Bittiefe durchführt wird es faszinierend, wie angenehm das Stück trotz des erhöhten Rauschens klingt. Und hier lassen sich dann auch schön unterschiedliche noise shapings untersuchen, also ob man etwa tsssss oder schschschsch beim Rauschen hört.

Weitere nette Erläuterungen zum Thema findet man z.B. bei iZotope, was für die Ohren gibt es z.B. hier.

Grüsse
Uli
Bild
Antworten