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).
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!
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).
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.