Programming lesson
Einstieg in die digitale Signalverarbeitung mit dem DE1-SoC Audio-CODEC
Lerne die Grundlagen der digitalen Signalverarbeitung (DSP) am Beispiel des DE1-SoC Audio-CODECs: Sampling, Audio-Passthrough und Tonerzeugung aus dem Speicher – mit praktischen Tipps für das Lab 3.
Einführung in die digitale Signalverarbeitung (DSP) mit dem DE1-SoC
Die digitale Signalverarbeitung (DSP) ist ein zentrales Thema in der modernen Elektrotechnik und Informatik. Ob bei der Rauschunterdrückung in Smartphones, bei Sprachassistenten wie Siri oder Alexa oder bei der Audiobearbeitung in Apps wie TikTok – überall werden digitale Signale verarbeitet. In diesem Tutorial lernst du die Grundlagen der DSP am Beispiel des DE1-SoC Boards und seines Audio-CODECs kennen. Du erfährst, wie du Audiosignale vom Mikrofon durch den FPGA schleifst und eigene Töne aus dem Speicher abspielst – genau wie im Lab 3 der Veranstaltung Ee371.
Was ist ein Audio-CODEC und wie funktioniert Sampling?
Ein Audio-CODEC (Coder/Decoder) wandelt analoge Audiosignale in digitale Daten um und umgekehrt. Das DE1-SoC Board verwendet einen CODEC, der mit 48 kHz sampelt – das bedeutet 48.000 Messwerte pro Sekunde. Nach dem Nyquist-Shannon-Abtasttheorem können damit Frequenzen bis 24 kHz korrekt erfasst werden, was für hörbare Töne völlig ausreicht. Die Samples werden in zwei Kanälen (links/rechts) verarbeitet, typisch für Stereo-Audio.
Stell dir vor, du nimmst ein Lied von Taylor Swift auf: Der CODEC tastet die Spannung des Mikrofonsignals in regelmäßigen Abständen ab und speichert die Werte als 24-Bit-Zahlen. Diese digitalen Werte können dann im FPGA verarbeitet, gefiltert oder gespeichert werden.
Task 1: Audio-Passthrough – vom Mikrofon zum Lautsprecher
Im ersten Teil des Labs geht es darum, das eingehende Audiosignal direkt wieder auszugeben – also einen Passthrough zu realisieren. Klingt einfach, aber die Synchronisation mit dem CODEC ist entscheidend.
Die Signale verstehen: READY und VALID
Der CODEC kommuniziert über spezielle Steuersignale mit deiner FPGA-Schaltung. Das Signal read_ready zeigt an, dass ein neues Sample vom Mikrofon bereitsteht. Gleichzeitig signalisiert write_ready, dass der CODEC bereit ist, ein Sample zum Lautsprecher zu senden. Deine Schaltung muss beide Signale überwachen und nur dann Daten übernehmen oder senden, wenn die jeweilige Bereitschaft gegeben ist.
Ein häufiger Fehler ist, nur auf ein Signal zu achten. Aber: Nur wenn beide Bereitschaftssignale aktiv sind, darf ein Sample weitergereicht werden. Sonst kommt es zu Datenverlust oder Rauschen. Das ist ähnlich wie bei einem Live-Stream auf Twitch: Der Streamer (Mikrofon) liefert Daten, aber der Zuschauer (Lautsprecher) muss bereit sein, sie zu empfangen – sonst ruckelt es.
VHDL-Implementierung des Passthrough
Ein einfacher Passthrough in VHDL könnte so aussehen:
process(clk, reset)
begin
if reset = '1' then
-- Zurücksetzen
elsif rising_edge(clk) then
if read_ready = '1' and write_ready = '1' then
left_out <= left_in;
right_out <= right_in;
end if;
end if;
end process;Beachte: Die Datenleitungen sind 24 Bit breit. In LabsLand musst du eine Audiodatei hochladen, die dann in das Mikrofon eingespeist wird. Deine aufgezeichnete Ausgabe sollte mit der Eingabe übereinstimmen. Teste das unbedingt, denn dieser Task ist die Grundlage für alles Weitere.
Task 2: Einen Ton aus dem Speicher abspielen
Im zweiten Teil erzeugst du einen statischen Ton – zum Beispiel einen Sinuston mit 440 Hz (Kammerton A). Dazu speicherst du die Sample-Werte in einem ROM (Read-Only Memory) und gibst sie zyklisch aus.
MIF-Datei mit Python generieren
Das Labor stellt ein Python-Skript zur Verfügung, das eine MIF-Datei (Memory Initialization File) erzeugt. Die MIF-Datei enthält die Sample-Werte für eine Periode des Tons. Für 48 kHz Sampling und einen 440 Hz Ton benötigst du 48000/440 ≈ 109 Samples. Das Skript berechnet die Sinuswerte und schreibt sie als 24-Bit-Hexzahlen in die Datei.
Ein Beispielaufruf (angenommen):
python generate_tone.py --freq 440 --fs 48000 --bits 24 --file tone.mifDie erzeugte MIF-Datei sieht dann ungefähr so aus:
DEPTH = 109;
WIDTH = 24;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT
BEGIN
0 : 000000;
1 : 0C8C8C;
...
108 : 000000;
END;ROM in Quartus einbinden
In Quartus Prime erstellst du ein ROM-Modul über den IP Catalog: Wähle Basic Functions > On-Chip Memory > ROM: 1-PORT. Konfiguriere es mit 24 Bit Wortbreite und der Tiefe aus der MIF-Datei. Als Speichertyp wählst du M9K (oder M10K je nach FPGA) und als Taktung Single clock. Lade dann die MIF-Datei unter Memory Initialization > Init File.
Adresszähler für die Wiedergabe
Um die Samples nacheinander auszulesen, brauchst du einen Zähler, der bei jedem write_ready-Puls erhöht wird. Wenn der Zähler das Ende des ROMs erreicht (z.B. 108), springt er zurück auf 0 – so entsteht eine Dauerschleife.
process(clk, reset)
begin
if reset = '1' then
addr <= (others => '0');
elsif rising_edge(clk) then
if write_ready = '1' then
if addr = 108 then
addr <= (others => '0');
else
addr <= addr + 1;
end if;
end if;
end if;
end process;Die ROM-Ausgabe wird dann auf die Audio-Ausgänge gelegt. Wenn du Stereo möchtest, kannst du beide Kanäle mit dem gleichen Wert versorgen.
Praktische Tipps für das Lab 3
- Synchronisation: Achte darauf, dass du die CODEC-Signale richtig auswertest. Nutze
read_readyundwrite_readywie in Task 1 beschrieben. - LabsLand: Lade deine MIF-Datei zusammen mit dem Projekt hoch. Die Plattform simuliert das Mikrofon und den Lautsprecher.
- Fehlersuche: Wenn kein Ton kommt, prüfe zuerst die Bereitschaftssignale mit einem Oszilloskop oder in der Simulation. Ein häufiger Fehler ist, dass der Adresszähler zu schnell läuft (jeden Takt statt nur bei write_ready).
- Trendbezug: Die gleiche Technik wird in modernen AI-Sprachmodellen verwendet, die Audio in Echtzeit verarbeiten. Auch bei Noise-Cancelling-Kopfhörern wird das Signal digital gefiltert – oft mit FPGAs.
Weiterführende Gedanken: DSP im Alltag
Die digitale Signalverarbeitung steckt in vielen Geräten, die du täglich nutzt. Dein Smartphone filtert Rauschen aus Anrufen, deine Spielekonsole verarbeitet Audiosignale für 3D-Sound, und sogar in der Medizintechnik (z.B. EKG-Auswertung) wird DSP eingesetzt. Mit dem DE1-SoC hast du eine Plattform, um diese Konzepte praktisch zu erlernen. Der Umstieg von einfachem Passthrough zu komplexeren Filtern (Tiefpass, Hochpass) ist dann nur noch ein kleiner Schritt.
Wenn du das Lab 3 erfolgreich abschließt, hast du nicht nur eine gute Note sicher, sondern auch ein tiefes Verständnis für die digitale Audiokette – eine Fähigkeit, die in der Industrie sehr gefragt ist. Viel Erfolg!