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 eine 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 gespeichert werden - wie wandelt man die vorzeichenlosen Werte aus dem Phasenakku in vorzeichenbehaftete Werte 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 Zweierkomplementdarstellung der erwarteten Zahlen. 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).

D/A-Wandler

Nun bringen Sie Ihre Dreiklang-Schaltung auf den FPGA. Dazu muessen Sie den Digital-Analog-Wandler auf unserem Board ansteuern. Dem Datenblatt entnehmen Sie, dass auch dieser Wandler die Daten fuer die beiden Audiokanaele im Zweierkomplement benoetigt, die dann bitweise seriell an den Chip uebermittelt werden. Am besten entwerfen Sie zunaechst einen Timing-Generator fuer die Signale MCLK, SCLK und LRCK sowie das Schieberegister zur Datenuebertragung. ACHTUNG: Verifizieren Sie den Timing-Generator durch eine Simulation, denn die Phasenlage der erzeugten Signale muss absolut korrekt sein! Lassen Sie die eigentliche Tonerzeugung von diesem Timing-Generator "anstossen": jedesmal wenn der Timing-Generator das Signal "next" setzt, muss ein neuer Abtastwert berechnet werden (und das Schieberegister uebernimmt den zuletzt berechneten Abtastwert). In der Datei dac.ucf ist die Pin-Belegung des FPGAs bezueglich der DAC-Signale fuer das XESS-Board notiert. Lassen Sie den FPGA den Dreiklang spielen! Hoert sich das exakt genauso wie im Sound-Simulator an? Besser pruefen koennen Sie das, indem Sie statt des Lautsprechers den Audioeingang eines Rechners an den Audioausgang unseres Boards anschliessen. Mit Hilfe des Programms "Audacity" koennen Sie die erzeugten Toene aufnehmen und analysieren.