Digitale Tonerzeugung

Abtasttheorem

Die Grundlage fuer die digitale Signalverarbeitung ("DSP") und damit auch die digitale Erzeugung von Toenen liefert das Abtasttheorem: Jedes bandbegrenzte Signal kann aus einer Folge von Momentanwerten ("Abtastwerten") rekonstruiert werden, wenn die Abtastrate groesser als das Doppelte der hoechsten im Signal vorkommenden Frequenz ist (Nyquist 1928, Kotelnikow 1933, Shannon 1948). Um also ein analoges Tonsignal zu erzeugen, genuegt es, fuer eine Folge von Zeitpunkten die momentane Amplitude zu berechnen und diesen Zahlenstrom in einem Digital-Analog-Wandler in eine Momentanspannung umzusetzen, die in einem anschliessendem Filter (dem "Rekonstruktionsfilter") zur gewuenschten analogen Schwingung interpoliert wird.

Die zu erzeugenden Toene duerfen gewiss bandbegrenzt sein, da das menschliche Ohr eine natuerliche Hoergrenze hat (ca. 20 kHz). Also reicht eine Abtastrate von ca. 40 kHz aus, um alle hoerbaren Signale darzustellen. Da das Rekonstruktionsfilter umso aufwendiger wird, je naeher die Abtastrate an das Doppelte der hoechsten Signalfrequenz rueckt, wird die Abtastrate i.A. ein wenig hoeher gewaehlt (oder auch sehr viel hoeher - "Oversampling" - damit das Filter einfacher wird).

Offline- vs. Online-DSP

Alle Berechnungen zum Ermitteln eines Abtastwertes erfolgen einmal pro Abtastperiode. Die entstehenden Abtastwerte koennen entweder in einer Datei (z.B. im WAV-Format) gespeichert und irgendwann spaeter "abgespielt" werden (Offline-DSP). Dann kann man zur Berechnung komplizierte Verfahren einsetzen, die viel Rechenaufwand kosten. Oder aber die Berechnungen passieren in Echtzeit (Online-DSP). Dann koennen sie z.B. bei einer Performance in einem elektronischen Musikinstrument direkt vom Musiker genutzt werden, verlangen aber ausgekluegelte Algorithmen, die mit der begrenzten Rechenzeit auskommen muessen, um alle Berechnungen zeithaltend durchfuehren zu koennen.

Typischerweise erprobt man die Algorithmen mittels einer programmtechnischen Realisierung ( "Sound-Simulator" ), bevor sie dann in Hardware umgesetzt werden. Der Simulator kann zunaechst alle von der Programmiersprache gegebenen Moeglichkeiten (z.B. Fliesskomma, Sinus- und Exponentialfunktionen) nutzen, um das Tonerzeugungsprinzip zu erforschen. In der naechsten Variante kann man dann eine sehr viel hardwarenaehere Implementierung ausprobieren (z.B. Fixpunktrechnung, Tabellen fuer transzendente Funktionen). Erst wenn das alles zur Zufriedenheit funktioniert, wird man die Umsetzung in eine Hardwarebeschreibungssprache vornehmen.

Hier ist eine erste Aufgabe: Aendern Sie die Erzeugung der Sinusschwingung im Sound-Simulator so ab, dass die Schwingung "ausklingt", d.h. dass die Amplitude nach der Funktion exp(-b*t) abnimmt und dadurch nach 3 Sekunden etwa 1/150 ihrer Anfangsamplitude erreicht. Welchen Wert von b muessen Sie dazu waehlen? Geben Sie auch die Einheit von b an! Schreiben Sie die erzeugten Werte in eine Datei und pruefen Sie z.B. mit "gnuplot", ob die Schwingung die verlangte Form hat!

Phasenakkumulator

Kernstueck eines digitalen Tongenerators ist der "Phasenakkumulator". Das ist ein Register, auf das zu jedem Abtastzeitpunkt ein bestimmter Betrag (das Phaseninkrement) aufaddiert wird. Machen Sie ein Gedankenexperiment: Nehmen Sie an, der Phasenakkumulator haette 8 Bit Breite und wuerde mit der Abtastrate von 48.8 kHz und einem Phaseninkrement von 1 betrieben. Wenn Sie den Wert des Phasenakkus (interpretiert als vorzeichenlose 8-Bit-Zahl) ueber der Zeit aufzeichnen, welche Kurve kommt dabei heraus? Wie gross ist also die Frequenz der erzeugten Schwingung? Geben Sie die Frequenz etwas allgemeiner in Abhaengigkeit von der Abtastrate fs, der Bitbreite n des Phasenakkus und dem Phaseninkrement d an!

Nun wollen wir auch andere Frequenzen erzeugen. Dazu kann man die Abtastrate, die Breite des Phasenakkus oder das Phaseninkrement veraendern. Warum ist es unguenstig, die Abtastrate oder die Breite des Phasenakkus zu veraendern? Was passiert, wenn man das Phaseninkrement auf 2 erhoeht? Wie kann man kleinere Abstaende in den erzeugten Frequenzen hinbekommen? Hinweis: Rechnen mit Festkommadarstellung, d.h. Erweiterung des Phasenakkus um einen Nachkommaanteil! Wie viele Bits wird man im Phasenakku benoetigen? Von was wird das abhaengen? Tipp: Betrachten Sie Ganzzahl- und Nachkommaanteil getrennt!

Jetzt setzen Sie Ihr Gedankenexperiment in die Tat um! Schreiben Sie im Sound-Simulator die hardwarenahe Formulierung eines Phasenakkus und erzeugen Sie den Kammerton a' mit 440 Hz! Waehlen Sie dabei die Abtastrate zu 50 MHz / 1024 (das laesst sich spaeter im FPGA leicht erzeugen). Wie gross muss das Phaseninkrement fuer 440 Hz sein? In welcher Zahl drueckt sich das bei der von Ihnen gewaehlten Breite des Phasenakkus aus? Beachten Sie, dass im WAV-Format vorzeichenbehaftete Abtastwerte mit jeweils 16 Bits im Zweierkomplement gespeichert werden - wie wandelt man die vorzeichenlosen Werte aus dem Phasenakku in Werte mit Vorzeichen um? Hinweis: Betrachten Sie 3-Bit-Werte! Schreiben Sie alle Bit-Kombinationen auf, zusammen mit der Interpretation als Zahl ohne Vorzeichen! Daneben schreiben Sie die vorzeichenbehafteten Zahlen auf, die Sie an Stelle der vorzeichenlosen Zahlen gerne erhalten wuerden: das ist deren Wert minus 4. In der letzten Spalte notieren Sie die Darstellung der erwarteten Zahlen im Zweierkomplement. Vergleichen Sie die erste mit der letzten Spalte! Was muss man also zur Umwandlung tun? ACHTUNG: Sie sollten unbedingt die ersten drei Schwingungen in eine Datei schreiben und z.B. mit "gnuplot" pruefen, ob Ihr Programm exakt die verlangten Daten errechnet. Nur anhoeren reicht nicht, da Sie z.B. einen Gleichspannungsoffset oder eine Phasenverschiebung nicht hoeren koennen!

Zu guter Letzt lassen Sie einen A-Dur Dreiklang ertoenen (einen Ton mit 220 Hz, plus einen Ton 4 Halbtoene hoeher, plus einen Ton noch einmal 3 Halbtoene hoeher).

Audio CODEC

Nun bringen Sie Ihre Dreiklang-Schaltung auf den FPGA. Dazu muessen Sie den Digital-Analog-Converter auf unserem Board ansteuern. Der ist Bestandteil eines einigermassen komplexen Bausteins zur Audio-Signalverarbeitung ("Audio CODEC"). Dem Datenblatt koennen Sie entnehmen, dass es bei diesem Baustein zwei digitale Interfaces gibt: eines zum Uebermitteln der Audio-Daten ueber das "Digital Audio Interface" und eines zum Einstellen der betraechtlichen Anzahl von Parametern im Audiozweig (wie z.B. Verstaerkung, Auswahl von Signalquellen und Filtern, usw.) ueber das "Control Interface" mittels einer I2C-Schnittstelle.

Um Ihnen die Entwicklung des Control-Interfaces zu ersparen und die Ansteuerung des DACs zu vereinfachen, gibt es im ECO32 das Audio-Device ("aud"). Es bietet eine Schnittstelle zur Nutzung des DACs, die nur die folgenden drei Signale umfasst:

Audio Device --> Synthesizer: dac_next
Synthesizer --> Audio Device: dac_sample_l[23:0], dac_sample_r[23:0]

Die Bedeutung der Signale ist einfach: Jedesmal, wenn das Audio-Device das Signal "dac_next" setzt, muss der Synthesizer die Berechnung eines neuen Abtastwertes beginnen. Gleichzeitig (!) uebernimmt das Device den in dac_sample_l[23:0] und dac_sample_r[23:0] schon bereitstehenden Stereo-Abtastwert (l: links, r: rechts). Das Signal "dac_next" ist fuer einen 50 MHz-Taktzyklus aktiv und hat eine Frequenz von 50 MHz / 1024, also einen zeitlichen Abstand von 1/48.828 kHz = 20.48 usec. Die Daten fuer die beiden Audiokanaele sind vorzeichenbehaftet und muessen im 24-Bit-Zweierkomplement vorliegen.

Lassen Sie den FPGA den Dreiklang spielen! Hoert sich das exakt genauso wie im Sound-Simulator an? Besser pruefen kann man das, indem man statt des Lautsprechers den Audioeingang eines Rechners an den Audioausgang unseres Boards anschliesst. Mit Hilfe des Programms "Audacity" kann man die erzeugten Toene aufnehmen und analysieren.