WaveTools

Aus LinuxUser 03/2003

WaveTools

Die Wellen, die ich rief (2)

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.

Abbildung 1: (wfct 400Hz 30ms; wfct 480Hz 30ms) | wmix -s - - | wplot | display

Abbildung 1: (wfct 400Hz 30ms; wfct 480Hz 30ms) | wmix -s – – | wplot | display

Abbildung 2: (wfct 440Hz 30ms; wfct -p90deg 40Hz 30ms) | wmix -m - - | wplot | display

Abbildung 2: (wfct 440Hz 30ms; wfct -p90deg 40Hz 30ms) | wmix -m – – | wplot | display

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.

Abbildung 3: (wfct 440Hz 1s; wfct 439Hz 1s) | wmix - - | wplot | display

Abbildung 3: (wfct 440Hz 1s; wfct 439Hz 1s) | wmix – – | wplot | display

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.

Abbildung 4: wfct -w 0.05Hz 10s | wflt -r | wplot | display

Abbildung 4: wfct -w 0.05Hz 10s | wflt -r | wplot | display

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.

Abbildung 5: sin(n×a)-Reihe

Abbildung 5: sin(n×a)-Reihe

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 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 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

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)

Der Autor

Volker Schmitt ist Mathematiker und arbeitet bei einer großen Versicherung. Wellen begegneten ihm bisher hauptsächlich bei Fouriertransformationen im Zusammenhang mit analytischer Zahlentheorie und in der Disko aus den örtlichen Beschallungsanlagen.

LinuxUser 03/2003 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben