Erfolgreiches Decodieren und Abspielen von Audiodateien in Embedded-Systemen
Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey
2019-11-05
Es wird zunehmend erwartet, dass Embedded-Designs mit einer Audioschnittstelle ausgestattet sind. Gleichzeitig erwarten die Nutzer von Embedded-Systemen eine immer bessere Audioqualität. Das stellt die Entwickler vor eine Herausforderung: Wie lassen sich MP3- oder andere Audiodateien auf einem System abspielen, das auf einem Mikrocontroller basiert? Diese Systeme verfügen nicht nur über beschränkte Ressourcen, sondern ihnen fehlen auch die anwenderfreundlichen Audioschnittstellen, die Entwickler in einem Linux-System nutzen können. Dadurch wird das Decodieren von Audiodateien und die erfolgreiche Umwandlung der Inhalte in analogen Klang wesentlich schwieriger.
Entwickler müssen zudem sorgsam abwägen, ob sie eine Hardware- oder eine Software-Lösung bevorzugen und welche Komponenten sie nutzen wollen, da Kosten, Platzbedarf und Entwicklungszeit entscheidende Faktoren sind.
In diesem Artikel werden verschiedene Hardware- und Software-Lösungen von AKM Semiconductor, Adafruit, STMicroelectronics und Cirrus Logic Inc. vorgestellt, die Entwickler verwenden können, um ihre Embedded-Geräte effizient und wirkungsvoll mit Audiodateien auszustatten. Er enthält auch einige „Tipps und Tricks“ für die erfolgreiche Implementierung.
Auswahl eines Embedded-Audioformats
Bevor wir uns im Detail damit befassen, wie sich Audiofunktionalität in ein Embedded-Gerät einbinden lässt, sollten wir uns überlegen, weshalb normalerweise das MP3-Format bevorzugt wird. Genau genommen gibt es drei mögliche Audioformate, die von den Entwicklern in einem Embedded-System eingesetzt werden können: Puls-Code-Modulation (PCM), WAV und MP3.
PCM ist ein nicht komprimiertes, verlustfreies Audioformat, das häufig von Audio-Codecs verwendet wird, um die digitale Darstellung des Audiostreams in den analogen Klang umzuwandeln, den der Nutzer zu hören bekommt. Es ist ein umfassend unterstütztes Standardformat, das auf die Zeit der CDs zurückgeht. PCM könnte in einem Embedded-System genutzt werden, doch das Problem ist, dass PCM-Dateien in der Regel wesentlich größer sind als WAV- oder MP3-Dateien. In einem Gerät mit beschränkten Ressourcen, in dem es auf jeden Cent ankommt, könnte es nötig werden, einen größeren externen Speicher oder einen Mikrocontroller mit größerem Speicher zu verwenden, um das PCM-Format zu unterstützen. Daher wird PCM meist vermieden, außer wenn das Produkt lediglich in geringer Stückzahl gefertigt wird, es nur um eine einzige Audio-Datei geht oder kein Kostendruck besteht.
WAV-Dateien sind ebenfalls unkomprimiert und verlustfrei und daher dem PCM-Format sehr ähnlich. Obwohl WAV-Dateien häufiger für Embedded-Anwendungen genutzt werden als PCM-Dateien, benötigen sie unter Umständen ebenfalls viel Platz. WAV-Dateien sind dann gut geeignet, wenn das Embedded-System bereits über eine SD-Karte oder einen großen Speicher verfügt.
In den meisten Systemen ist das bevorzugte Audioformat jedoch die MP3-Datei. MP3-Dateien sind verlustbehaftet, daher kann ein Teil der Klangqualität bei der Codierung verloren gehen. Allerdings sind sie wesentlich kleiner als PCM- oder WAV-Dateien, die Übertragung und Speicherung der Datei(en) auf dem Gerät geht daher schneller und sie benötigen weniger Speicherplatz.
Sobald klar ist, dass mit MP3-Dateien gearbeitet werden soll, können die Entwickler sich zwischen einer Hardware- und einer Softwarelösung entscheiden.
Hardwarebasierte MP3-Decodierung
Die schnellste und einfachste Lösung ist in den meisten Fällen, einen Hardware-MP3-Decoder zu verwenden, beispielsweise den 1681 VS1053B von Adafruit (Abbildung 1). Der VS1053B kann die Dateiformate MP3, WAV, OGG oder MIDI direkt über einen seriellen Datenstrom aufnehmen und sie decodieren, was keine größere Anstrengung auf Seiten des Entwicklers erfordert. Nach der Decodierung des Streams wandelt der VS1053B ihn mit einem 18-Bit-Digital-Analog-Wandler (DAC) in Klang um.
Abbildung 1: Der VS1053B von Adafruit ist ein hardwarebasierter MP3-Decoder-Chip, der einen Audio-Datenstrom in das entsprechende analoge Audiosignal umwandelt. Für diese Lösung ist nur wenig Software erforderlich und der Entwickler muss nicht verstehen, wie sich eine MP3-Datei decodieren oder umwandeln lässt. (Bildquelle: Adafruit)
Besonders interessant am VS1053B ist, dass er sich sogar debuggen und mit einem einfachen UART steuern lässt, im Gegensatz zu vielen Decodern, die I2C verwenden. Außerdem verfügt er über acht allgemeine Eingangs-/Ausgangspins, die sich für Funktionalitäten wie das Lesen von Bits oder das Einstellen von Schaltern oder Status-LEDs nutzen lassen.
Entwickler, die es mit einer hardwarebasierten Lösung probieren möchten, müssen für den VS1053B nicht unbedingt ihre eigene Breakout-Karte entwerfen. Adafruit bietet den 1381 VS1053B Codec + MicroSD-Breakout-Karte an. Neben dem VS1053B besitzt die Karte einen Slot für eine MicroSD-Karte, auf der Audiodateien zur Decodierung gespeichert werden können (Abbildung 2). Die Breakout-Karte ist so ausgelegt, dass sie mit einem Mikrocontroller verbunden werden kann, der sich über einen SPI- oder SDIO-Port mit der SD-Karte verbindet, um die Audiodatei auszulesen. Dann wird der Stream der Audiodatei zum Decodieren an den VS1053B gesendet. Die Ausgabe des VS1053B lässt sich dann nach Bedarf entweder an den Kopfhöreranschluss oder einen Lautsprecher senden.
Abbildung 2: Der 1381 VS1053B Codec + MicroSD-Breakout-Karte von Adafruit enthält die notwendige Hardware, sodass er sich zum Abspielen von Klang leicht mit einem Mikrocontroller verbinden lässt. Die Breakout-Karte besitzt einen Slot für eine MicroSD-Karte, die der Mikrocontroller über SPI auslesen und die Datei dann zum Decodieren an den VS1053B übertragen kann. (Bildquelle: Adafruit)
Softwarebasierte MP3-Decodierung
Eine etwas kompliziertere Lösung, die jedoch in Anbetracht der Stückliste meistens kostengünstiger ist, besteht darin, die MP3-Datei auf dem Mikrocontroller zu decodieren und die decodierte Datei an einen Audio-Codec zu senden, der den Klang erzeugt. Um eine wirkungsvolle, softwarebasierte Lösung zu erhalten, muss der Entwickler mehrere entscheidende Komponenten implementieren, insbesondere:
- eine MP3-Decoder-Bibliothek
- einen Speichertreiber
- einen Dateisystemstack
- einen Treiber für den Speicherdirektzugriff (DMA)
- einen I2S-Treiber
- einen I2C-Treiber
- einen Audio-Codec-Treiber
Auf den ersten Blick sieht es so aus, als gäbe es hier viel Arbeit für den Softwareentwickler und zahlreiche potenziell schwierige Softwarekomponenten, die integriert werden müssen, um die MP3-Datei zu decodieren und in Klang umzuwandeln. Die beste Möglichkeit zur Implementierung einer MP3-Decodierlösung ist, eine Mikrocontroller-Plattform zu nutzen, die das Codieren, Decodieren und die allgemeine Verarbeitung von Audio-Dateien unterstützt.
Neben den zahlreichen Open-Source-Lösungen, die im Internet zu finden sind, können die Entwickler sich auch für eine bewährte professionelle Lösung entscheiden: die STM32-Toolchain. Die Mikrocontroller-Familie STM32 bietet ein Entwicklungstool mit dem Namen STM32CubeMx, das in die STM32CubeIDE integriert ist und Audio-Beispiele sowie Entwicklungsbibliotheken enthält. Die Beispiele und Tools sind Bestandteil eines zusätzlichen Plugins für das STEM32CubeMX mit dem Namen X-CUBE-AUDIO. Das Plugin verfügt über die Audiobibliotheken zur MP3-Decodierung für jeden STM32-Prozessor, der zur Mikrocontroller-Klasse Arm Cortex-M4 gehört.
Insbesondere gibt es Projektbeispiele für Code zur Erstellung eines MP3-Players, der auf einem STM32F469IGH6TR Mikrocontroller läuft. Der STM32F469IGH6TR ist ein äußerst leistungsfähiger Mikrocontroller, der 1 Megabyte (MB) Flash, 384 Kilobyte (KB) RAM bietet und mit 180 Megahertz (MHz) läuft. Der Mikrocontroller besitzt ein UBGA-Gehäuse mit 176 Pins, das zahlreiche GPIO und Peripheriefunktionen für nahezu jede Anwendung bietet.
Abbildung 3: Der STM32F469IGH6TR ist ein Arm-Cortex-M4-Prozessor mit 180 MHz, 1 MB Flash und 384 KB RAM. Das UBGA-Gehäuse mit 176 Pins bietet zahlreiche GPIO für nahezu jede eingebettete Anwendung. (Bildquelle: STMicroelectronics)
Das Codebeispiel für den MP3-Player läuft auf dem STM32F469I-DISCO Discovery-Kit (Abbildung 4). Das STM32F469I-DISCO enthält alles, was zum Decodieren und Abspielen von MP3s nötig ist. Das Board besitzt ein 4-Zoll-LCD mit 800 x 480 Pixeln, das dazu dient, den Entwickler über den aktuellen MP3-Demostatus zu informieren, sowie Steuerfunktionen für den Player wie Play, Stop, Next und Previous. Außerdem enthält das Discovery-Board einen Kopfhöreranschluss, auf dem der entstandene Klang in Stereo wiedergegeben wird. Das einzige Problem mit dem Beispielcode ist, dass die MP3-Dateien von einer externen Quelle bereitgestellt werden müssen, und zwar von einem USB-Massenspeicher, der über einen Mikro-USB-Steckverbinder angeschlossen wird.
Abbildung 4: Das Discovery-Kit STM32F469I-DISCO hat ein 4-Inch-LCD, worüber die MP3-Player-Demo betrieben wird. Die Audiodateien werden von einem externen USB-Massenspeicher über den Mikro-USB-Steckverbinder auf der Platte bereitgestellt. Damit bietet es ein funktionierendes Beispiel für die Decodierung einer MP3-Datei. (Bildquelle: STMicroelectronics)
Die MP3-Decodierbibliotheken erfordern einen Prozessor, der mindestens zur Mikroprozessor-Familie Arm-Cortex-M4 gehört. Lässt man den Demo-Code jedoch auf dem Entwicklungsboard laufen, erhält man nicht nur eine hervorragende Möglichkeit, um ein funktionierendes Beispiel zu erleben und damit zu experimentieren, sondern man kann auch die Leistung der Anwendung überprüfen. Mithilfe der Serial Wire Debug (SWD)-Schnittstelle und der Instrumentation Trace Macrocell (ITM)-Funktionalitäten des ARM-Kerns ist es möglich, auf dem Programmzähler eine statistische Analyse durchzuführen, um zu erfahren, wie viel Prozessorleistung ungefähr benötigt wurde, um die MP3-Dateien zu decodieren und abzuspielen. Es hat sich gezeigt, dass unter Umständen knapp 50 % der CPU-Zeit für die Aktualisierung des LCD-Displays benötigt wurden, während höchstens 10 % für die MP3-Decodierung erforderlich waren. Die Audiobibliotheken von STMicroelectronics sind sehr leistungsfähig, und sie nutzen DMA, um die decodierten Frames über I2S an ein Audio-Codec weiterzuleiten.
Bei einer Anwendung, die kein LCD erfordert, sondern die Audiodateien lediglich bei anderen Systemereignissen abspielen muss, kann auch ein Prozessor mit weniger Funktionalitäten verwendet werden. So könnte ein Entwickler beispielsweise den STM32F469VGT6 in Betracht ziehen. Der STM32F469VGT6 ist mit 1 MB Flash und 384 KB RAM in einem LQFP-Gehäuse mit 100 Pins immer noch leistungsfähig. Dieses Bauteil benötigt nicht so viel Platz wie ein BGA, das auf Entwickler und Hersteller manchmal abschreckend wirkt.
Abbildung 5: Der STM32F469VGT6 ist ein 180-MHz-Prozessor mit 1 MB Flash und 384 KB RAM. Das Bauteil basiert auf der Mikroprozessorfamilie Arm-Cortex-M4, die von den Audiobibliotheken von STMicroelectronics unterstützt wird. Wie im Bild zu sehen, ist der Prozessor in einem LQFP-Gehäuse mit 100 Pins erhältlich, das auf Entwickler und Hersteller nicht so riesig wirkt. (Bildquelle: STMicroelectronics)
Wenn der Entwickler eine Lösung ausprobiert und ausgewählt hat, die seiner Ansicht nach am besten zu der Anwendung passt, muss er entscheiden, wie die decodierte MP3-Datei von digitalen Signalen in analogen Klang umgewandelt werden soll.
Umwandlung des Audiostreams in Klang mit einem Codec
Die meisten hardwarebasierten Decodierlösungen enthalten auch einen Digital/Analog-Wandler (DAC), mit dessen Hilfe das erhaltene digitale Dateiformat in analogen Klang umgewandelt werden kann. Allerdings enthalten diese Chips oft auch einen I2S-Ausgang, an den der Entwickler seinen eigenen Audio-Codec anschließen kann. Bei softwarebasierten Lösungen ist unbedingt ein Codec erforderlich, um den decodierten digitalen Datenstrom in Klang umzuwandeln. Dafür gibt es zwei Möglichkeiten.
Erstens lässt sich der Klang mit dem digitalen Audiostream und der DAC-Peripheriefunktion auf dem Mikrocontroller erzeugen. Dies ist meistens nicht die beste Möglichkeit, um Klang zu erzeugen, da zusätzliche diskrete Komponenten und ein sorgfältiges Design und Layout des analogen Schaltkreises erforderlich sind, um einen hochwertigen Klang zu erhalten. Außerdem ist mehr Aufbau auf dem Mikrocontroller notwendig, um den DAC zum Laufen zu bringen, und dann wird meistens zusätzliche Prozessorleistung benötigt, um den DAC richtig anzusteuern.
Die zweite Methode, die in den meisten Fällen empfehlenswert ist, besteht darin, einen integrierten Audio-Codec zu verwenden. Audio-Codecs sind zunächst einmal integrierte Schaltungen, die über alle Schaltkreise für die Erzeugung des Analogklangs verfügen, wie einen DAC und Klasse-D-Verstärker. Der Vorteil des Audio-Codec gegenüber einer diskreten Lösung ist, dass nur sehr wenig Platinenfläche benötigt wird und außerdem digitale Schaltungen zur Steuerung des Audio-Datenstroms integriert sein können.
So bietet der DAC CS43L22-CNZ von Cirrus Logic den Entwicklern zahlreiche Funktionalitäten, insbesondere:
- DAC-Steuerung über den I2C-Anschluss
- mehrere Ausgänge, beispielsweise Kopfhörer und Lautsprecher
- keine externen Ausgangsfilter erforderlich
- einen digitalen Signalprozessor zur Steuerung von Lautstärke, Bässen und Höhen
- Unterdrückung von Knackgeräuschen
Der CS43L22-CNZ erhält vom Mikrocontroller einen PCM-codierten Datenstrom über eine I2S-Schnittstelle, die er dann mit seinem internen DAC umwandelt (Abbildung 6). Der DAC CS43L22-CNZ kann mehrere Ausgänge wie beispielsweise einen Lautsprecher oder Kopfhörer ansteuern. Wenn im Mono-Modus nur ein Kanal verwendet wird, kann der CS43L22-CNZ einen Lautsprecher mit einer Leistung von 2 Watt ansteuern, im Stereo-Modus bietet er eine Leistung von 1 Watt pro Kanal.
Abbildung 6: Der CS43L22-CNZ DAC ist ein Audio-DAC, der eine Leistung von 2 Watt über einen Mono-Ausgang bzw. eine Leistung von 1 Watt pro Kanal für Stereo-Klang ausgeben kann. Der DAC besitzt einen Prozessor für die digitale Signalverarbeitung, der eine einfache Steuerung von Lautstärke, Bässen und Höhen ermöglicht. (Bildquelle: Cirrus Logic)
Manche Entwickler benötigen nicht alle Funktionalitäten des CS43L22-CNZ und können an den Stückkosten sparen, in dem sie eine minimalistischere Lösung wählen.
Das ist natürlich von den Anforderungen der Anwendung abhängig, doch ein gutes Beispiel ist der Audio-Codec AK4637EN von AKM (Abbildung 7). Dabei handelt es sich um einen 24-Bit-Monokanal-Codec, der nur einen Ausgangs-DAC für einen Lautsprecher hat. Gleichzeitig enthält dieser Codec einen Mikrofonverstärker, sodass er auch für Audioaufnahmen genutzt werden kann, wenn die Anwendung dies erfordert.
Abbildung 7: Der AK4637EN ist ein Audio-DAC in einem kleinen QFN-Gehäuse mit 20 Pins, der einen einzelnen Mono-Audiokanal mit bis zu 1 Watt ausgibt. Der Codec lässt sich digital über den I2C-Anschluss steuern, um die Ausgabelautstärke und die automatische Ausgaberegelung zu verwalten. (Bildquelle: AKM Semiconductor)
Wie die meisten Audio-Codecs hat auch der AK4637EN eine I2S-Schnittstelle, um das digitale Audiosignal vom Mikrocontroller aufzunehmen. Der Chip enthält ebenfalls eine I2C-Schnittstelle, die zur Steuerung der digitalen Funktionen auf der Platte wie Lautstärkeregelung genutzt wird.
Wie bei sämtlichen Produktmerkmalen müssen Entwickler sich die Zeit nehmen und gründlich prüfen, welche Anforderungen an ihr System gestellt werden, um die Funktionen und Kosten des Codec gegenüber den zulässigen Stückkosten abzuwägen.
Tipps und Tricks für die Implementierung einer MP3-Lösung
Nachstehend finden Sie einige „Tipps und Tricks“, die Entwicklern bei der Auswahl der angemessenen Lösung für ihre Anwendung helfen:
- Erstellen Sie eine Kostenanalyse für die Stückliste bei den erwarteten Absatzmengen und vergleichen Sie dabei einen externen MP3-Decoder mit einem leistungsfähigeren Mikrocontroller, der selbst einen MP3-Decoder betreiben kann. Achten Sie darauf, eine pessimistische, eine realistische und eine optimistische Schätzung der Absatzzahlen aufzustellen, um einen Spielraum für die Entscheidungsfindung zu erhalten.
- Verwenden Sie einen Audio-Codec, der I2S nutzen kann, um den Klang zu erzeugen. Diskrete Lösungen sind unter Umständen zeitaufwendiger bei der Einstellung, während die Bauteilkosten möglicherweise ebenso hoch ausfallen.
- Führen Sie mithilfe eines Entwicklungsboards eine Leistungsanalyse an den MP3-Softwarebibliotheken durch, damit Sie wissen, welche Eigenschaften der Mikrocontroller mindestens aufweisen muss, damit er für die Lösung genutzt werden kann.
- Nutzen Sie DMA-Kanäle zur Übertragung decodierter MP3-Frames an den Audio-Codec über eine I2S-Schnittstelle. Dann können Sie einen kostengünstigeren Prozessor verwenden.
- Prüfen Sie sorgfältig die Lizenzen für die MP3-Softwarebibliotheken, um sicherzustellen, dass sie für ein gewerbliches Produkt genutzt werden dürfen. In den meisten Open-Source-Bibliotheken fällt eine Lizenzgebühr für gewerbliche Produkte an, sofern sie nicht vom Chiphersteller bereitgestellt werden.
Wenn Entwickler diese Tipps beherzigen, sollte gewährleistet sein, dass sie die richtige Audio-Lösung für ihre Embedded-Anwendung finden.
Fazit
Ein Embedded-System mit Audiofunktionen auszustatten, war früher vielleicht eine schwierige Aufgabe, doch heute steht Entwicklern, wie oben gezeigt, eine breite Palette an Lösungen zur Auswahl. Diese reichen von speziellen externen Codecs bis zu integrierten Softwarebibliotheken. Dennoch müssen Entwickler sorgfältig abwägen, welche Anforderungen an ihre Anwendung gestellt werden, um die sinnvollste Lösung auszuwählen.
Zu den entscheidenden Faktoren zählen die Stückkosten, die Komplexität der Lösung, der Aufwand für Entwicklung und Integration sowie die Skalierbarkeit der Lösung. Sobald Sie diese Faktoren den Absatzmengen, dem Kostenrahmen und dem Entwicklungszeitplan gegenüberstellen, erkennen Sie, welche Lösung sich am besten eignet.
Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.




