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.