Signalerzeugung und -identifizierung Einzeltöne mit FPGAs erzeugen und erkennen

Autor / Redakteur: Pablo Trujillo * / Johann Wiesböck

In Audiosystemen erfordert das Erkennen von Tönen viel Rechenleistung. FPGAs bieten Entwicklern Flexibilität, sich gezielt an den Sweetspot zwischen Performance und Energieeffizienz heranzutasten.

Firmen zum Thema

Bild 1: Ein System zur Erkennung von Einzeltönen mit zwei FPGA-Karten und zwei Datenwandlermodulen von Digilent.
Bild 1: Ein System zur Erkennung von Einzeltönen mit zwei FPGA-Karten und zwei Datenwandlermodulen von Digilent.
(Bild: Pablo Trujillo)

Das Erkennen von Einzel- oder Obertönen ist für Embedded Systeme eine Herausforderung, da sie viel Rechenleistung erfordert. Mit Hilfe von FPGA-Boards können Entwickler einfach verschiedene Herangehensweisen bei der Signalerzeugung und der Tonerkennung austesten. Manchmal müssen Ingenieure schnell ein Testsystem aufbauen. Und nicht immer sind Evaluationskits und -Module zur Hand, die den Anforderungen der aktuellen Anwendung genügen.

Speziell dann, wenn gleichzeitig eine diskrete Logik und eine hohe Rechenleistung benötigt werden. Hier können FPGA-Entwicklungsboards helfen. Soll beispielsweise ein Entwickler eine Methode zur Erkennung eines bestimmten Einzeltons in einem Signal evaluieren, so kann er das Signal auf einem Board erzeugen und es dann auf einem zweiten Board detektieren.

Eine derartige Aufgabe fordert nach wie vor die Hardware und die Rechenleistung eines Embedded Systems heraus. Mittels zweier FPGA-Entwicklungskits, die über das analoge Signal verbunden sind, ist das leicht zu bewerkstelligen. So kann für die Signalerzeugung das Eclypse Z7 Zynq-7000 APSoC Kit zusammen mit einem Zmod DAC 1411 D/A-Wandler-Modul verwendet werden, die beide von Digilent verfügbar sind. Ein auf dem Eclypse-Board implementierter Signalgenerator würde dann das Signal mithilfe der in der Kommunikationstechnik üblichen FSK-(Frequency Shift Keying-)Modulation erzeugen.

Auf der Empfangsseite sind das Genesys ZU-3EG Zynq Ultrascale+ MPSoC Entwicklungsboard und das Zmod ADC 1410 A/D-Wandler-Modul zur Erfassung des Signals eine gute Wahl. Beide stammen ebenfalls von Digilent und sind über dessen Vertriebspartner Trenz Electronic erhältlich. Das MPSoC (Multi-Processor System-on-Chip) des Genesys-Kits verfügt neben einer Arm Cortex-A53-APU (Application Processing Unit) mit vier Kernen auch über eine Dual-Core Arm Cortex-R5F Echtzeit-Verarbeitungseinheit (Realtime-Processing-Unit, RPU) und genügend programmierbare Logik (PL). Auf diese Weise steht ausreichend Rechenleistung für die jeweilige Aufgabe zur Verfügung.

Bei der FSK-Modulation wird eine sinusförmige Trägerfrequenz mit Hilfe unterschiedlicher Frequenzen so moduliert, dass entweder eine logische ‚0‘ oder eine logische ‚1‘ kodiert werden können. Da sie mit einem Frequenzband arbeitet, ist es möglich, nicht nur binäre Werte, sondern auch ganze Bytes zu kodieren. Der Empfänger kann dann das daraus resultierende modulierte Sinussignal mittels einer schnellen Fourier-Transformation (FFT), einer diskreten Fourier-Transformation (DFT) oder mithilfe eines Goertzel-Filter dekodieren.

Implementierung des FSK-Modulators

Um die erforderlichen hohen Frequenzen des Ausgangssignals zu erreichen, ist ein ausreichend schnelles Taktsignal nötig. Das Eclypse-Board besitzt zwei Taktquellen, die mit dem Zynq APSoC (All Programmable System-on-Chip) verbunden sind: Eine ist direkt mit dem Processing Subsystem (PS) verbunden, während die andere vom Ethernet PHY zur programmierbaren Logik (PL) geführt wird.

Da im Beispiel das PS nicht zur Erzeugung des modulierten Signals benötigt wird, kann der an die PL angeschlossene 25-MHz-Takt verwendet werden. Um höhere Frequenzen, beispielsweise 100 MHz zu erreichen, kann einer der Mixed-Mode Clock Manager (MMCM) des APSoCs eingesetzt werden. Diese sind Teil des Taktverwaltungs-Tile (Clock Management Tile / CMT) der Ultra­Scale-Architektur.

Das Signal für die FSK-Modulation ist als Sinuswelle in einem der Block-Random-Access-Memories (BRAMs) des SoCs gespeichert. Bei jeder Taktflanke wird ein Wert von einer BRAM-Adresse gelesen und danach die Adresse inkrementiert. Dabei ist es möglich, die verschiedenen Frequenzen in Abhängigkeit von den zu kodierenden Logikpegeln durch unterschiedliche Inkremente zu erzeugen. Bevor das modulierte Signal dann in die analoge Domain gewandelt werden kann, muss der D/A-Wandler des Zmod-DAC-Moduls konfiguriert werden. Dies erfolgt durch das Einstellen des Analog-Multiplexer-ICs auf der Platine auf den benötigten Wert.

Einzeltonerkennung mit dem Goertzel-Algorithmus

Nach der Erzeugung wird das analoge Signal durch den A/D-Wandler des auf die Genesys-ZU-Karte aufgesteckten Zmod ADC-Modules erfasst. Das Zmod-Board verwendet den AD9648 A/D-Wandler von Analog Devices. Dieser bietet eine Auflösung von 14 Bit, zwei Kanäle und besitzt eine Abtastrate von 100 MSamples/s. Bei der Inbetriebnahme muss das Modul konfiguriert und die Spannungsversorgung aktiviert werden. Ein frei verfügbarer IP-Block, der von Digilent für den Einsatz auf dem FPGA erstellt wurde, übernimmt diese Aufgaben. Das Zmod wird über die FPGA-transparente SYZYGY-konforme Schnittstelle mit dem Genesys-ZU-Entwicklungsboard verbunden, und zwar mittels eines SPI-Ports und eines DDR-Interfaces für die Datenübertragung.

Um diese DDR-Schnittstelle auf Zynq UltraScale+ FPGA zu generieren, müssen das IDDRE1 (Dedicated Dual Data Rate Input Register 1) Primitiv verwendet werden. Diese ähneln den IDDR-Primitiven der 7er-Serie von Xilinx. Diese sind jedoch nicht mit den neueren Generationen kompatibel. Für die Kommunikation muss das verarbeitende Subsystem zwei Taktsignale erzeugen: eines für die Übertragung über den SPI-Port mit 50MHz und eines für das DDR-Interface und die AXI-(Advanced Extensible Interface)-Module für die Ansteuerung und das BRAM mit 100 MHz. Diese Frequenz entspricht auch der Abtastrate.

Sind alle Abtastwerte gelesen und im BRAM gespeichert, kann der Goertzel-Algorithmus ausgeführt werden, um zu erkennen, ob die fraglichen Frequenzen im Signal vorhanden sind. Prinzipiell ist es auch möglich, eine FFT anzuwenden, um das Vorkommen eines einzelnen Tons in einer Zeitbereichssequenz aus ‚n‘ Abtastwerten zu detektieren. Diese ist aber nicht besonders effizient, da mehrere Multiplikationen komplexer Zahlen ausgeführt werden müssten. Die Verwendung einer Einzelpunkt-DFT würde zwar die Anzahl der Multiplikationen reduzieren und damit die Effektivität erhöhen. Aber sie löst immer noch nicht das Problem der Rechenoperationen mit den komplexen Zahlen.

Der Goertzel-Algorithmus hingegen ist recht effizient. Implementiert in Form eines IIR-(Infinite Impulse Response-)Filters zweiter Ordnung, verwendet er zwei reelle Rückkopplungskoeffizienten und einen einzigen komplexen Feedforward-Koeffizienten. Dadurch sinkt die Anzahl der arithmetischen Berechnungen. Auf dem Genesys-ZU-Board läuft der Algorithmus auf der Arm Cortex-R5F-Echtzeitverarbeitungseinheit des Zynq MPSoC. Der Filter benötigt eine statische Anzahl von Abtastwerten, um die Anwesenheit des gewünschten Tons zu erkennen. Diese Werte müssen sowohl der programmierbaren Logik als auch dem verarbeitenden Subsystem zur Verfügung stehen.

Eine von Digilent vorgeschlagene Lösung ist die Verwendung eines AXI-IP-Blocks, der eine konfigurierbare Anzahl an konvertierten Werten liest und diese in das BRAM schreibt. Das Block-RAM muss dabei als echter Dual-Port-Speicher konfiguriert werden. Dabei wird ein Port mit dem AXI-Modul zur Erfassungssteuerung und der andere mit dem AXI-BRAM-Kontroller verbunden. Das AXI-Steuermodul benötigt nur zwei Register: eines für den Start der Erfassung und das andere für die Einstellung der Fensterlänge. Bild 6 zeigt das vollständige Blockdiagramm des Systems zur Dekodierung, einschließlich des Zynq UltraScale+-Blocks, des Treibers für das Zmod ADC Modul, das Erfassungssteuerungsmodul, das BRAM, den AXI-BRAM-Kontroller zum Speichern der Abtastwerte sowie die anderen AXI-Blöcke.

Möglichkeiten zum Verbessern der Leistung

Während der Goertzel-Algorithmus dank der RPU des Zynq UltraScale+ gut funktioniert, ist er für die Verwendung am Edge nicht besonders geeignet, da er zur Ausführung ein ganzes Fenster erfassen muss. Selbst wenn die Echtzeitverarbeitungseinheit mit 500 MHz läuft und die Verarbeitung aller Samples 60 µs dauert, wäre die maximale Frequenz auf 16 kHz begrenzt.

Es gibt mehrere Möglichkeiten, die Leistung zu verbessern. Einerseits könnte der Algorithmus in der programmierbaren Logik ausgeführt werden, so dass jedes Signal zum Zeitpunkt der Erfassung verarbeitet werden kann. Die Verwendung eines Notch-Filters zusammen mit einem Peak-Detektor würde die Berechnungszeit auf einen Bruchteil der vom Goertzel-Algorithmus benötigten Zeit reduzieren. In diesem Fall ginge aber die Information über die Signalphase verloren.

Eine weitere Möglichkeit besteht darin, beide RTU-Cores auf dem Zynq UltraScale+ einzusetzen, da diese den Split-Modus betrieben werden können. Im Gegensatz zur DFT, bei der eine zeitliche Dezimierung implementiert werden kann, benötigen IIR-Filter die vorhergehenden Ergebnisse, um die nächsten zu berechnen. Hier wird die Verzögerung immer noch 60 µs betragen, aber der Durchsatz wird sich verbessern, da die Ausgabe mit der doppelten Frequenz aktualisiert wird.

Auf der Homepage von Digilent ist ein vollständiges Beispielsprojekt verfügbar.

* Pablo Trujillo ... ist ein FPGA-Entwickler für Leistungselektronikgeräte und Spezialist für DSP- und Leistungs- elektronik-Steuerungsdesign.

(ID:47327433)