In Ausgabe 01/2003 haben wir ausführlich Einsatzgebiete der WaveTools, insbesondere der Programme wfct, wflt, wmix, und wplot, vorgestellt. Jetzt werfen wir einen Blick auf die restlichen Tools und zeigen deren Anwendungsmöglichkeiten.
Vom Addieren und Multiplizieren
Bei unserer Arbeit mit dem Programm wfct haben wir zwar schon unterschiedliche Wellenformen (Sinus, Dreieck, Rechteck, Sägezahn und Rauschen) generiert, aber eine Option haben wir gänzlich außer Acht gelassen: Dies ist der Parameter -p, der es ermöglicht, die Phasenverschiebung für die Ausgabe der generierten Welle zu definieren. Um eine Phasenverschiebung zu verstehen, rufen wir uns eine einfache Formel aus unserem Trigonometrie-Unterricht ins Gedächtnis zurück: Wir wissen, dass sin(x + ½PI)=cos(x) ist. Wenn also
wfct 440Hz 10ms
eine Sinus-Welle erzeugt, generieren Sie mit
wfct -p90deg 440Hz 10ms
eine Cosinus-Welle (beachten Sie, dass ½PI gerade 90° entspricht – ½PI=1.570796 können Sie aber auch im Bogenmaß über -p1.570796rad definieren). Wer sich noch an eines der Additionstheoreme, genauer
½(sin a + sin b)=sin(½(a+b))×cos(½(a-b))
erinnert, der kann dies nun grafisch überprüfen. Dafür ersetzen Sie a durch 400Hz und b durch 480Hz und erzeugen die beiden Terme links und rechts vom Gleichheitszeichen als wav-Dateien. Der erste Term wird über
(wfct 400Hz 30ms; wfct 480Hz 30ms) | wmix -s - -
erzeugt. Beachten Sie, dass die Option -s durch die Anzahl der Eingabedaten dividiert. Für den zweiten Term brauchen wir ½(a+b)=440Hz und ½(a-b)=40Hz. Somit wird dieser über
(wfct 440Hz 30ms; wfct 20Hz 30ms) | wmix -m - -
generiert. Der Parameter -m multipliziert. Einen Vergleich zeigen die Abbildungen 1 und 2, die in der Tat identisch aussehen.
Was steckt drin?
Das Programm winf zeigt Header-Information von wav-Datei an. Ohne weitere Optionen werden nur die Länge, die Sampling-Frequenz und die Auflösung (in Bits) der Datei ausgegeben. Das kann schon recht interessant sein, denn wenn Sie sich tatsächlich mal Ihren Lieblingsheuler aus dem Netz gezogen haben, gibt Ihnen winf Auskunft über die Qualität der Aufnahme. Gerade wav-Dateien werden wegen ihres hohen Speicherbedarfs von eher minderer Qualität sein, also eine niedrigere Abtastfrequenz oder kleinere Auflösung haben. Nehmen wir uns als Beispiel unsere Cosinus-Welle und holen uns über
wfct -p90deg 400Hz 1s -ocosinus.wav; winf cosinus.wav
die Informationen
cosinus.wav : time 0:01.00 s ( 11025 values), sampling 11025 Hz 8 bits
auf den Schirm. Es überrascht nicht weiter, dass die Standardwerte die Abtastrate der Frequenz auf 11025 Hz setzen, wenn die Option -s nicht angegeben wird. Der fehlende Parameter -b führt zur Standardauflösung von 8 Bits. Interessanter ist jedoch die Option -s des Programms winf, die ein wenig Statistik präsentiert. Die Ausgabe liefert neben Maximal- und Minimalwerten auch die Lautstärke der Datei, welche einen Prozentwert in Relation zur Sinus-Welle ausgibt. Hätten Sie gewusst, dass die Überlagerung der Sinus- und Cosinus-Welle noch 99,4% der Lautstärke der Sinus-Welle hat, aber schon die Überlagerung von sin(x) mit sin(x+¾PI) nur noch 76,5% (vgl. auch Listing 1) der Lautstärke des Sinus’ besitzt? Warum das so ist, können Sie sich klarmachen, indem Sie die beiden Wellen betrachten.
Listing 1
Die
winf
-Ausgabe
volker@maus: (wfct 440Hz 1s; wfct -p90deg 440Hz 1s) | wmix - - | winf -s -standard-input- : time 0:01.00 s ( 11025 values), sampling 11025 Hz 8 bits Amplitude (x[n]) : min = -1.00000 mid = -0.00931 max = +0.98438 Step (x[n+1]-x[n]): min = -0.25781 mid = +0.15814 max = +0.25781 Zero Values : n = 880 n/sec = 880.0 Extreme Values : n = 880 n/sec = 880.0 Standard Deviation (Volume): s = 0.70295 = 99.4 % volker@maus: (wfct 440Hz 1s; wfct -p135deg 440Hz 1s) | wmix - - | winf -s -standard-input- : time 0:01.00 s ( 11025 values), sampling 11025 Hz 8 bits Amplitude (x[n]) : min = -0.77344 mid = -0.00779 max = +0.75781 Step (x[n+1]-x[n]): min = -0.20312 mid = +0.12194 max = +0.19531 Zero Values : n = 880 n/sec = 880.0 Extreme Values : n = 880 n/sec = 880.0 Standard Deviation (Volume): s = 0.54108 = 76.5 %
Ebenfalls interessant ist das Ergebnis der Überlagerung von Wellen fast gleicher Frequenz. Sie interferieren schließlich (in Abbildung 3 heben sich eine 440-Hz- und eine 439-Hz-Schwingung einmal in der Sekunde fast auf), weshalb ihre Summe auch nicht die Lautstärke der Sinus-Welle erreicht.
(wfct 440Hz 1s; wfct 439Hz 1s) | wmix - - | winf
liefert 70,5% der Sinus-Lautstärke.
Hörspiel
Eine weitere Anwendung der WaveTools ist das Aneinanderhängen von wav-Dateien mit dem Programm wcat. Wer sich seine Texte z. B. von Mbrolavorlesen lässt, der kann bei der Verwendung von wörtlicher Rede im Text etwas enttäuscht sein. Warum splitten Sie also nicht den Text auf in Teile mit und ohne wörtliche Rede und lassen sie von verschiedenen Stimmen vorlesen, um sie anschließend wieder aneinander zu hängen? Sie werden sehen, wieviel lebendiger der Text dadurch wird. Als Beispiel ist der Heft-CD der Text demo.txt im Verzeichnis LinuxUser/wellen/ beigefügt. Dieser wurde durch das Skript wortrede2wav.sh in eine wav-Datei gewandelt. Skript und wav-Datei finden Sie ebenfalls auf der CD, außerdem Sourcen und Binary einer Weiterentwicklung des Programms pipefilt, das ebenfalls in das Mbrola-Umfeld gehört. Dieses wurde angepasst, um den zusätzlichen Anforderungen zu genügen.
Wenn Sie an wortrede2wav.sh eigene Texte übergeben wollen, beachten Sie, dass der Beginn und das Ende der wörtlichen Rede mit Anführungszeichen im TeX-Stil markiert werden, also mit "` und "' (vgl. auch die Datei demo.txt). Werfen Sie einen Blick in das Skript wortrede2wav.sh: Einige Kommentare helfen sicher beim Verständnis des Abschnitts, der den Text aufsplittet und schließlich mit Mbrola einzelne wav-Dateien erzeugt. Uns geht es aber hier nur um den Teil, der die kleinen wav-Stücke wieder aneinanderhängt. Dieser benutzt das Programm wcat. Das Besondere daran ist, dass wcat es schafft, die einzelnen wav-Dateien aneinanderzuhängen, obwohl diese eine unterschiedliche Abtastrate besitzen. Die von Mbrola genutzte Stimme de2 ist mit 16000 Hz gesampelt, de3 dagegen mit 22050 Hz. Entsprechend sind die Abtastraten der wav-Dateien für die unterschiedlichen Teile. Das einfache Aneinanderhängen der Dateiinhalte führte nur zu Datenmüll; wcat allerdings ist klug genug, die Header der einzelnen wav-Stücke zu untersuchen und die Abtastraten der Eingaben miteinander zu vergleichen. Wenn diese unterschiedlich sind, nimmt wcat die Abtastrate und Quantisierung der ersten Eingabe. Wollen Sie diese Werte selbst bestimmen, teilen Sie wcat dies einfach über die Option -rrate und -bquant mit. Eine vollständige Auflistung aller Optionen von wcat finden Sie in Tabelle 1.
Tabelle 1: Die <C>wcat<C>-Optionen
-rrate |
Abtastrate |
-bquant |
Auflösung |
-sgeschw |
Geschwindigkeit |
-oausgabe |
Ausgabedatei |
-h |
Hilfe |
-v |
Protokollierung |
Weg mit dem Mist
Zu den WaveTools gehört außerdem das Programm wcut, mit dem Sie Teile aus einer wav-Datei herauslösen können. Vielleicht gibt es ja ein bestimmtes Lied, das Sie besonders gut finden – bis zu der Stelle, an der der Sänger anfängt zu singen. Dann nehmen Sie doch den Anfang des Liedes heraus und lassen dann noch zehn Sekunden das Stück ausklingen:
wcut -l60s clintonspeech.wav > lied.wav (wcut -s60s -l10s clintonspeech.wav ; wfct -w 0.05Hz 10s | wflt -r) | wmix -m - - > fade.wav wcat lied.wav fade.wav > heuler.wav
Erst werden mit der Option -l60s die ersten 60 Sekunden von clintonspeech.wav ausgeschnitten und in lied.wav abgespeichert. Danach werden zehn Sekunden nach den ersten 60 Sekunden ausgeschnitten (-l10s) – der Offset wird mit -s60s gesetzt – und diese mit einer abfallenden Geraden multipliziert, um die Amplitudenwerte schließlich gegen Null gehen zu lassen. Das Ergebnis der Multiplikation wird in fade.wav abgelegt, um es schließlich mit Hilfe von wcat mit dem ersten Teil lied.wav zur neuen Version heuler.wav zusammenzusetzen. Schauen wir uns dazu noch einmal die abfallende Gerade an: Diese ist konstruiert aus dem Anfang einer mit der Option -w erzeugten Sägezahnkurve, deren Frequenz mit 0.05Hz auf 20 Sekunden gestreckt wurde. Mit dem Aufruf -l10s werden die ersten zehn Sekunden ausgewählt und mit wflt -r gedreht, damit die Kurve abfällt, wie es in Abbildung 4 zu sehen ist.
Die komplette Liste der Optionen von wcut finden Sie in Tabelle 2.
Tabelle 2: Die <C>wcut<C>-Optionen
-sstart |
Offset, ab dem geschnitten werden soll |
-eende |
Offset, bis zu dem geschnitten werden soll |
-ldauer |
Länge des auszuschneidenden Teils |
-oausgabe |
Ausgabedatei |
-h |
Hilfe |
-v |
Protokollierung |
Das Mikroskop
Das Programm wview kann wav-Dateien interaktiv am Bildschirm darstellen. Mit den Pfeiltasten [hoch] und [runter] bestimmen Sie das Intervall der darzustellenden Information, mit den Tasten [links] und [rechts] können Sie das von Ihnen bestimmte Intervall in der Zeitachse wandern lassen. Außerdem können Sie mit [Bild hoch] und [Bild runter] zoomen. Das Programm lässt sich, da es im SVGA-Modus läuft, nur mit [Q] oder [Strg+c] beenden.
Dividieren
Als Ergänzung finden Sie auf unserer Heft-CD das Programm winv. Dieses ist nicht in den WaveTools enthalten; ich habe es selbst geschrieben, um die Addition und Multiplikation des Programms wmix noch um die Division zu erweitern. Der Wertebereich der Amplitude liegt zwischen -1 und 1. Das Invertieren der Werte wird diesen Bereich sicher verlassen. Deshalb normiert winv seine Ausgabe derart, dass der maximale Ausschlag 1 beträgt.
Auf der Heft-CD finden Sie das Binary winv, das statisch gelinkt ist. Dieses können Sie in das Verzeichnis /usr/local/bin kopieren (cp .../winv /usr/local/bin). Das Programm besitzt alle Ein- und Ausgabemöglichkeiten und Optionen der anderen WaveTools. Testen wollen wir winv an einer mathematischen Formel, die aus dem Rechnen mit komplexen Zahlen entstammt [2] und in Abbildung 5 zu sehen ist.
Wir wählen n=4 und für den Winkel 100 Hz. Dann erzeugen wir die linke Seite durch
(wfct 100Hz 30ms; wfct 200Hz 30ms; wfct 300Hz 30ms; wfct 400Hz 30ms) | wmix - - - -
während wir für die rechte Seite nun winv für den Term im Nenner des Bruchs einsetzen und diesen über
(wfct 250Hz 30ms; wfct 200Hz 30ms; wfct 50Hz 30ms | winv) | wmix -m - - - | wflt -n
generieren. Dabei normieren wir das Ergebnis final noch einmal mit wflt -n, um die Normierung, die innerhalb von winv vorgenommen wurde, wieder rückgängig zu machen. Schauen wir uns den linken Term in Abbildung 6 an und vergleichen wir ihn mit dem rechten Term in Abbildung 7, so sehen wir, dass die Gleichung schon grob stimmt. Die eckige Gestalt dieser Abbildung macht uns aber darauf aufmerksam, dass es sich um eine numerische Instabilität handelt. Diese können wir in den Griff bekommen, indem wir höher quantisieren und die Auflösung mit der Option -b16 auf 16 Bit erhöhen. Das Ergebnis in Abbildung 8 ist entsprechend zufriedenstellend und nicht mehr von Abbildung 6 zu unterscheiden.

Abbildung 6: (wfct 100Hz 30ms;wfct 200Hz 30ms;wfct 300Hz 30ms;wfct 400Hz 30ms) | wmix – – – – | wplot | display

Abbildung 7: (wfct 250Hz 30ms;wfct 200Hz 30ms;wfct 50Hz 30ms | winv) | wmix -m – – – | wflt -n | wplot | display

Abbildung 8: (wfct -b16 250Hz 30ms;wfct -b16 200Hz 30ms;wfct -b16 50Hz 30ms | winv) | wmix -m – – – | wflt -n | wplot | display
Glossar
-
Mbrola
-
Ein Werkzeug, das zusammen mit txt2pho Texte vorliest. Die beiden Programme wurden in der LinuxUser-Ausgabe 04/2002 [1] ausführlich besprochen.
Infos
[1] Jo Moskalewski: “Lesestunde – Sprachsynthesizer Mbrola”, LinuxUser 04/2002, S. 25
[2] Herbert Pieper: “Die komplexen Zahlen”, Deutsch Taschenbücher, Nr.44, Frankfurt am Main, 1999 (ISBN 3817116144)







