Audiobestanden in embedded systemen efficiënt decoderen en afspelen
Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey
2019-11-05
Gebruikers verwachten steeds vaker dat embedded systemen audio-interfaces hebben. Tegelijkertijd verwachten gebruikers van embedded systemen een steeds hogere geluidskwaliteit. Dit is een uitdaging voor ontwerpers: hoe kunnen MP3- of andere audiobestanden worden afgespeeld op een systeem op basis van microcontrollers. Deze systemen hebben niet alleen beperkte middelen, ze missen ook eenvoudig te gebruiken audio-interfaces waar ontwikkelaars op een Linux-systeem wel gebruik van kunnen maken. Hierdoor wordt het extra lastig audiobestanden te decoderen en eenvoudig in analoge audio om te zetten.
Ontwikkelaars moeten zorgvuldig de afweging tussen hardware- en software-oplossingen maken en beslissen welke componenten te gebruiken waarbij kosten, ruimte en ontwikkelingstijd allemaal een belangrijke rol spelen.
Dit artikel bevat een inleiding tot verschillende hardware- en software-oplossingen van AKM Semiconductor, Adafruit, STMicroelectronics en Cirrus Logic Inc. waarmee ontwikkelaars efficiënt en effectief audiobestanden aan hun embedded systemen kunnen toevoegen. Het bevat tevens enkele 'tips en trucs' om voor een geslaagde implementatie te zorgen.
Een embedded audioformaat kiezen
Voordat we in detail gaan bespreken hoe de audiofunctionaliteit in een embedded systeem kan worden geïntegreerd, moeten we bedenken waarom het MP3-audioformaat meestal de voorkeur verdient. Voor embedded systemen zijn er in feite drie mogelijke audioformaten die ontwikkelaars kunnen gebruiken: pulscodemodulatie (PCM), WAV en MP3.
PCM is een ongecomprimeerd, verliesvrij audioformaat dat vaak door audiocodecs wordt gebruikt om een digitale representatie van de audiostream analoog te maken zodat een gebruiker ernaar kan luisteren. Het is een breed ondersteund audioformaat dat zijn oorsprong heeft in cd's. PCM zou in embedded systemen kunnen worden gebruikt, maar het probleem is dat PCM-bestanden meestal veel groter zijn dan WAV- of MP3-bestanden. In een apparaat met beperkte middelen en waar elk dubbeltje moet worden omgekeerd, kan een apparaat een groter extern geheugen of een microcontroller met meer geheugen nodig hebben om PCM te ondersteunen. Daarom wordt PCM meestal vermeden tenzij het product klein is, met niet meer dan één audiobestand werkt of waarbij geld geen rol speelt.
WAV-bestanden zijn ook ongecomprimeerd en verliesvrij en lijken daarom erg op PCM. Hoewel WAV-bestanden in embedded toepassingen veel populairder lijken te zijn dan PCM-bestanden, kunnen ze ook een flinke hoeveelheid ruimte innemen. Ze kunnen prima geschikt zijn als het embedded systeem al een SD-kaart of ander groot opslagmedium heeft.
In de meeste systeem hebben MP3-bestanden de voorkeur. MP3-bestanden hebben wat verlies, zodat het geluid wat aan zuiverheid kan inboeten wanneer het gecodeerd is. Maar ze zijn aanzienlijk kleiner dan PCM of WAV, waardoor overdragen naar en van het apparaat en opslaan op het apparaat sneller gaan en ze minder geheugen nodig hebben.
Als eenmaal de beslissing is genomen MP3 te gebruiken, dan kunnen ontwerpers dat in hardware of in software implementeren.
MP3 decoderen via hardware
Vaak is de snelste en eenvoudigste oplossing een hardware MP3-decoder te gebruiken, bijvoorbeeld de Adafruit 1681 VS1053B (Afbeelding 1). De VS1053B kan direct overweg met de audioformaten MP3, WAV, OGG en MIDI via een seriële stream en deze met weinig of geen inspanning van de ontwerper decoderen. Nadat de stream gedecodeerd is, converteert de VS1053B deze door middel van een 18-bits digitaal-analoogconverter (DAC) naar een audiosignaal.
Afbeelding 1: De VS1053B van Adafruit is een hardware MP3-decoder die een audiostream naar het overeenkomstige analoge audiosignaal converteert. Voor deze oplossing is een minimale hoeveelheid software nodig en de ontwerper hoeft niet te weten hoe een MP3-bestand moet worden gedecodeerd of geconverteerd. (Afbeelding: Adafruit)
Maar wat echt interessant is aan de VS1053B is dat hij ook via een eenvoudige UART kan worden gedebugd en aangestuurd, waar veel andere decoders I2C gebruiken. Verder beschikt hij over acht ingangs-/uitgangspins voor algemeen gebruik die voor features in de toepassing kunnen worden gebruikt zoals het lezen van bits of het instellen van schakelaars of status-leds.
Als ontwikkelaars een hardware-oplossing willen uittesten, dan hoeven ze bij gebruik van de VS1053B geen eigen breakout-board te maken. Adafruit levert de 1381 VS1053B codec + MicroSD breakout-board. De board heeft naast de VS1053B een slot voor een MicroSD-kaart die kan worden gebruikt om de te decoderen audiobestanden op te slaan (Afbeelding 2). De breakout-board is bedoeld om aan een microcontroller te worden gehangen die een SPI- of SDIO-poort gebruikt om het audiobestand op de SD-kaart te lezen. De audiostream wordt vervolgens voor het decoderen naar de VS1053B gestuurd. Het uitgangssignaal van de VS1053B kan dan naar wens worden verzonden, bijvoorbeeld naar een hoofdtelefoonaansluiting of een luidspreker.
Afbeelding 2: De 1381 VS1053B Codec + MicroSD breakout-board van Adafruit bevat de benodigde hardware voor eenvoudig aansluiten op een microcontroller om audio af te spelen. De breakout-board beschikt over een eigen slot voor een MicroSD-kaart, die de microcontroller via SPI kan uitlezen en het bestand vervolgens voor het decoderen naar de VS1053B kan sturen. (Afbeelding: Adafruit)
MP3 decoderen via software
Een iets complexere oplossing, maar een die vaak goedkoper is voor wat betreft de gebruikte onderdelen, is het MP3-bestand op de microcontroller te decoderen en het gedecodeerde bestand naar een audiocodec te sturen die de audio genereert. Een ontwikkelaar moet, om een efficiënte software-oplossing te implementeren, enkele essentiële componenten implementeren, zoals:
- een MP3 decoderbibliotheek
- een geheugendriver
- een bestandssysteem
- een direct memory access (DMA)-driver
- een I2S-driver
- een I2C-driver
- een driver voor de audiocodec
Op het eerste gezicht lijkt dit een hoop werk voor de softwareontwikkelaar en een hoop mogelijk uitdagende softwarecomponenten die moeten worden geïntegreerd om het MP3-bestand te decoderen en in audio om te zetten. De beste manier om een MP3-decodeeroplossing te implementeren is een microcontrollerplatform gebruiken dat coderen, decoderen en algemene verwerking van audio ondersteunt.
Hoewel er op het internet veel open source oplossingen te vinden zijn, is de STM32 set een professionele, in de praktijk bewezen oplossing die ontwerpers kunnen gebruiken. De STM32 familie van microcontrollers heeft een ontwikkeltool geheten STM32CubeMx die geïntegreerd is met de bijbehorende STM32CubeIDE compleet met audiovoorbeelden en ontwikkelbibliotheken. De voorbeelden en tools maken deel uit van een extra STM32CubeMX plug-in met de naam X-CUBE-AUDIO. De plug-in bevat de audiobibliotheken voor het decoderen van MP3 voor elke STM32 processor uit de klasse Arm Cortex-M4 microcontrollers.
In het bijzonder bevat hij projectvoorbeelden voor het maken van een MP3-player die op een STM32F469IGH6TR microcontroller kan draaien. De STM32F469IGH6TR is een bijzonder krachtige microcontroller die over 1 megabyte (MB) flash-geheugen en 384 kilobyte (kB) RAM-geheugen beschikt en op 180 megahertz (MHz) draait. De microcontroller zit in een 176-pins UBGA-behuizing met een veelheid aan GPIO- en randapparaatfuncties voor vrijwel elke toepassing.
Afbeelding 3: De STM32F469IGH6TR is een 180 MHz Arm Cortex-M4 processor met 1 MB flash en 384 kB RAM. De 176-pins UBGA-behuizing heeft voldoende GPIO voor vrijwel elke embedded toepassing. (Afbeelding: STMicroelectronics)
De voorbeeldcode voor de MP3-speler draait op de STM32F469I-DISCO Discovery-kit (Afbeelding 4). De STM32F469I-DISCO bevat alles wat nodig is om MP3-bestanden te decoderen en af te spelen. De board heeft een 4-inch lcd-scherm met 800 x 480 pixels dat wordt gebruikt om een ontwikkelaar op de hoogte te houden van de status van de MP3-demonstratie, plus bedieningstoetsen voor afspelen stoppen, volgende en vorige. De Discovery board bevat ook een hoofdtelefoonaansluiting om de resulterende audio in stereo af te spelen. Het enige probleem met de voorbeeldcode is dat de MP3-bestanden door een externe bron moeten worden aangeleverd, namelijk een op een micro USB-poort aangesloten USB-geheugen.
Afbeelding 4: De STM32F469I-DISCO Discovery kit beschikt over een 4-inch lcd-scherm om de demonstratie-MP3-speler te bedienen. De audiobestanden worden door een op een micro USB-poort op de board aangesloten USB-geheugen aangeleverd. De kit bevat een voorbeeld hoe een MP3-bestand kan worden gedecodeerd. (Afbeelding: STMicroelectronics)
Voor de MP3-decodeerbiobliotheken is een Arm Cortex-M4 of hogere processor nodig, maar het blijkt dat het uitvoeren van de demonstratiecode op het ontwikkelingsbord een geweldige manier om niet alleen een werkend voorbeeld te zien en ermee te experimenteren, maar ook om de prestaties van de toepassing te verifiëren. Door de serial wire debug (SWD)-interface en de instrumentation trace macrocell (ITM)-mogelijkheden van de Arm core te gebruiken, kan de programmateller statistisch worden geanalyseerd om bij benadering te bepalen hoeveel processing power is gebruikt om de MP3-bestanden te decoderen en af te spelen. Het blijkt dat bijna 50% van de CPU-tijd wordt besteed aan het bijwerken van het lcd-scherm en nog geen 10% aan het decoderen van het MP3-bestand. De audiobibliotheken van STMicroelectronics zijn uiterst efficiënt en ze versturen de gedecodeerde frames via DMA en I2S naar een audiocodec.
Als een toepassing geen lcd-scherm nodig heeft, maar alleen audio moet afspelen op basis van andere gebeurtenissen in het systeem, dan kan een processor met minder features worden gebruikt. Een ontwikkelaar kan bijvoorbeeld naar de STM32F469VGT6 kijken. De STM32F469VGT6 heeft nog altijd goede prestaties met 1 MB flash-geheugen en 384 kB RAM-geheugen, in een 100-pins LQFP-behuizing. Hij heeft minder ruimte nodig dan een BGA-behuizing, die zowel voor ontwikkelaars als fabrikanten wel eens intimiderend kan zijn.
Afbeelding 5: De STM32F469VGT6 is een 180 MHz processor met 1 MB flash-geheugen en 384 kB RAM-geheugen. Deze is op de Arm Cortex-M4-familie gebaseerd, die door de STMicroelectronics audiobibliotheken wordt ondersteund. Zoals te zien is, heeft hij een 100-pins LQFP-behuizing, die voor ontwikkelaars en fabrikanten minder intimiderend is. (Afbeelding: STMicroelectronics)
Als een ontwikkelaar eenmaal een oplossing heeft gekozen die volgens hem of haar het beste bij de toepassing past en daarmee heeft geëxperimenteerd, dan moet nog besloten worden hoe het gedecodeerde MP3-bestand van digitaal signaal naar analoog geluid moet worden omgezet.
De audiostream met een codec naar geluid omzetten
De meeste hardware-oplossingen voor decoderen bevatten tevens een digitaal-analoogconverter (DAC) die kan worden gebruikt om het digitale bestandformaat naar analoog geluid om te zetten. Maar deze chips bevatten ook vaak een I2S-uitgangspoort waarmee ontwerpers een eigen audiocodec kan toevoegen. Software-oplossingen hebben in ieder geval een codec nodig om het digitale signaal in geluid om te zetten. Dit kan op twee manieren worden bereikt.
Allereerst kunnen het digitale audiosignaal en de DAC op de microcontroller board worden gebruikt om het geluidssignaal te genereren. Over het algemeen is dit niet de beste manier om audio te genereren, omdat er extra discrete componenten voor nodig zijn en de analoge schakeling en de lay-out zorgvuldig moeten worden ontworpen om een kwalitatief goed uitgangssignaal te krijgen. Bovendien zijn er extra instellingen van de microcontroller nodig om de DAC aan de praat te krijgen en is er meer processorcapaciteit nodig om de DAC goed aan te sturen.
De tweede methode, die meestal wordt aangeraden, is het gebruik van een geïntegreerde audiocodec. Audiocodecs zijn in principe ic's die alle schakelingen bevatten om een analoge uitvoer te genereren, zoals een DAC en klasse D versterkers. Een audiocodec heeft als voordeel boven een oplossing met discrete componenten dat hij heel weinig ruimte inneemt en bovendien digitale schakelingen kan bevatten om de audio-uitvoer te regelen.
De CS43L22-CNZ DAC van Cirrus Logic heeft bijvoorbeeld allerlei extra features zoals:
- DAC-regeling via de I2C-bus
- meerdere uitgangen, bijvoorbeeld voor hoofdtelefoon of luidspreker
- geen behoefte aan externe uitgangsfilters
- een digitale signaalverwerker voor volume en lage en hoge tonen
- onderdrukken van stoorsignalen
De CS43L22-CNZ krijgt een via PCM gecodeerd audiosignaal via een I2S-interface van de microcontroller, dat hij met zijn interne DAC converteert (Afbeelding 6). De CS43L22-CNZ DAC kan meerdere uitgangen aansturen zoals een luidspreker en een hoofdtelefoon. Bij een monokanaal kan de CS43L22-CNZ een luidspreker met een vermogen van 2 watt aansturen of, bij stereokanalen, maximaal 1 watt per kanaal.
Afbeelding 6: De CS43L22-CNZ DAC is kan in audiotoepassingen een monokanaal met maximaal 2 watt aansturen, of 1 watt per kanaal bij stereokanalen. De DAC heeft een digitale signaalverwerker voor het regelen van volume en lage en hoge tonen. (Afbeelding: Cirrus Logic)
Niet elke ontwerper heeft alle features van de CS43L22-CNZ nodig en in zo'n geval kan een minimalistische oplossingen met minder componenten voldoen.
Dit hangt natuurlijk van de eisen van de toepassing af, maar een schoolvoorbeeld van zo'n aanpak is de AK4637EN audiocodec van AKM (Afbeelding 7). Dit is een 24-bits monokanaal codec voor één luidspreker. Deze codec bevat tevens een microfoonversterker en kan dus worden gebruikt om audio op te nemen als de toepassing dat nodig heeft.
Afbeelding 7: De AK4637EN is een audio-DAC in een kleine 20-pins QFN-behuizing en kan een monokanaal tot maximaal 1 watt aansturen. De codec kan digitaal worden bestuurd via de I2C-bus om het uitgangsvolume en de automatische uitgangsregeling te bedienen. (Afbeelding: AKM Semiconductor)
Net als de meeste audiocodecs heeft de AK4637EN tevens een I2S-interface om het digitale audiosignaal van de microcontroller te ontvangen. De chip bevat ook een I2C-interface om de ingebouwde digitale functies zoals volumeregeling aan te sturen.
Net als bij alle producten moeten ontwerpers de tijd nemen om de eisen voor hun systeem zorgvuldig te analyseren en de functies en kosten van de codec tegen de geplande componentenkosten af te wegen.
Tips en trucs voor het implementeren van een MP3-toepassing
Hier volgen een paar tips waar ontwikkelaars rekening mee moeten houden bij het kiezen van de juiste oplossing voor een toepassing:
- Analyseer de componentenkosten bij de verwachte productieaantallen tussen een externe MP3-decoder en een krachtigere microcontroller die zelfstandig een MP3-decoder kan draaien. Doe dit voor pessimistische, realistische en optimistische aantallen om op basis van voldoende gegevens de beste keuze te kunnen maken.
- Gebruik een audiocodec die I2S gebruikt om het audio uitgangssignaal te genereren. Bij oplossingen met discrete componenten kan voor afstemmen meer tijd nodig zijn met navenant hogere kosten.
- Analyseer de prestaties met MP3-softwarebibliotheken en een ontwikkelingsboard om de minimale eisen aan de microcontroller te bepalen die voor de toepassing nodig zijn.
- Maak optimaal gebruik van de DMA-kanalen om de gecodeerde MP3-frames via een I2S-interface naar de audiocodec over te brengen. Dit kan een goedkopere processor opleveren.
- Controleer zorgvuldig of de MP3-softwarebibliotheken volgens de licentievoorwaarden in een commercieel product mogen worden gebruikt. De meeste open source bibliotheken mogen alleen met een betaalde licentie in commerciële producten worden gebruikt, tenzij ze van de leverancier van de chip afkomstig zijn.
Door deze tips op te volgen kunnen ontwikkelaars de juiste audio-oplossing voor hun embedded toepassing kiezen.
Conclusie
Audio aan embedded systemen toevoegen was ooit een complexe onderneming, maar zoals we hebben aangetoond, hebben ontwerpers tegenwoordig allerlei oplossingen waar ze uit kunnen kiezen. Die variëren van speciale externe codecs tot geïntegreerde softwarebibliotheken. Ontwikkelaars moeten nog steeds de eisen van hun toepassing zorgvuldig analyseren en bepalen welke oplossingsmethode de beste is.
In ogenschouw te nemen factoren zijn de componentenkosten, de complexiteit van de oplossing, ontwikkel- en integratietijd en -kosten en de schaalbaarheid van de toepassing. Als deze factoren eenmaal tegen de productie-aantallen, beoogde kostprijs en ontwikkeltijd zijn afgewogen, dan rolt de beste oplossing er vanzelf uit.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




