Så gör du för att avkoda och spela upp ljudfiler i inbäddade system

Av Jacob Beningo

Bidraget med av DigiKeys nordamerikanska redaktörer

Ljudgränssnitt blir i allt högre grad en standardfunktion i inbäddade system. Användare av inbäddade system förväntar sig dessutom allt högre ljudkvalitet. För utvecklarna innebär detta en utmaning: Hur kör man MP3-filer eller andra ljudfiler på microcontroller-baserade system? Sådana system är resursbegränsade, men saknar också lättanvända ljudgränssnitt av den typ som kan användas på Linux-baserade system. Därmed är det svårare att avkoda ljudfiler och att omvandla innehållet till analogt ljud på ett effektivt sätt.

Utvecklarna måste även göra ett väl avvägt val mellan en maskinvarulösning eller en programvarulösning, samt bestämma vilka komponenter som ska användas, eftersom kostnad, utrymme och utvecklingstid sätter vissa begränsningar.

I den här artikeln presenteras ett antal maskinvarulösningar och programvarulösningar från AKM Semiconductor, Adafruit, STMicroelectronics och Cirrus Logic Inc. Lösningarna kan användas för att lägga till ljudfiler i inbäddade enheter på ett effektivt sätt. I artikeln ger vi också tips för att lyckas med implementeringen av systemet.

Välja ett inbäddat ljudformat

Innan vi går in på detaljerna kring hur man integrerar ljudfunktioner i inbäddade enheter, är det bra att fundera på varför ljudformatet MP3 är så vanligt. För ett inbäddat system har utvecklarna tre möjliga ljudformat att välja bland: pulskodsmodulering (PCM), WAV och MP3.

PCM är ett okomprimerat, förlustfritt ljudformat som ofta används i ljudomkodare (codecs), för att omvandla den digitala representationen av ljudet till det analoga ljud som användaren hör. Det är ett väl etablerat standardformat som har funnits alltsedan CD:n gjorde sitt intåg på marknaden. PCM skulle kunna användas i inbäddade system, men problemet är att PCM-filer vanligen är mycket större än WAV- eller MP3-filer. För att stödja PCM-filer kanske det krävs mer externt minne eller en microcontroller med mer minne – och det i en resursbegränsad enhet där varje krona räknas. Därför brukar utvecklarna undvika PCM-filer, om inte produkten tillverkas i små volymer, endast har en enda ljudfil eller inte begränsas av kostnadsaspekten.

Även WAV är ett okomprimerat och förlustfritt format – WAV-filer har stora likheter med PCM-filer. För inbäddade tillämpningar är WAV-filer ett mer populärt alternativ än PCM-filer, trots att även WAV-filerna tar mycket utrymme i anspråk. De kan vara ett bra alternativ om det inbäddade systemet redan har ett SD-kort eller någon annan stor minnesenhet.

MP3-filer är det främsta och vanligaste ljudformatet i de flesta system. MP3 är dock inte helt förlustfritt, så vissa detaljer i ljudet kan gå förlorade vid kodningen. Däremot är MP3-filer mycket mindre än PCM- eller WAV-filer, vilket innebär att det går fortare att överföra och lagra dem på enheten, och minnet behöver heller inte vara särskilt stort.

Om utvecklaren väl har bestämt sig för att MP3 är rätt alternativ, kan kodningen göras i maskinvaran eller programvaran.

Maskinvarubaserad MP3-avkodning

Den snabbaste och enklaste lösningen är vanligen att använda en maskinvarubaserad MP3-avkodare, såsom Adafruits 1681 VS1053B (figur 1). VS1053B tar emot MP3-, WAV-, OGG- eller MIDI-filer i en seriell dataström och avkodar strömmen i stort sett utan någon åtgärd från utvecklaren. När strömmen har avkodats omvandlas den till ljud med hjälp av en 18-bitars DAC-enhet (digital-till-analog-omvandlare).

Diagram för den maskinvarubaserade MP3-avkodaren VS1053B från AdafruitFigur 1: VS1053B från Adafruit är en maskinvarubaserad MP3-avkodare som tar emot ljudströmmar och avkodar dem till motsvarande analoga ljudsignaler. För lösningen krävs knappt någon programvara, och utvecklaren behöver inte ha kunskaper om hur MP3-filer avkodas och omvandlas. (Bildkälla: Adafruit)

Extra intressant med VS1053B är att den också kan felsökas och styras via ett enkelt UART-gränssnitt. För många andra avkodare används I2C i stället. VS1053B har också åtta IO-stift som kan användas för att exempelvis läsa bitar, ställa switchar eller för status-lysdioder.

Utvecklare som vill prova en maskinvarubaserad lösning behöver inte nödvändigtvis skapa ett eget breakout-kort för VS1053B. Adafruit erbjuder breakout-kortet 1381 VS1053B codec + MicroSD. Utöver VS1053B-codecen har kortet en MicroSD-plats som kan användas för att lagra ljudfiler som ska avkodas (figur 2). Breakout-kortet är utformat för att anslutas till en microcontroller som läser av SD-kortets ljuddata via en SPI- eller SDIO-port. Därefter skickas ljudströmmen till VS1053B för avkodning. Avkodade utdata från VL1053B kan sedan skickas vidare till valfria enheter, exempelvis hörlursuttag eller högtalare.

Bild av breakout-kortet 1381 VS1053B Codec + MicroSD från AdafruitFigur 2: Breakout-kortet 1381 VS1053B Codec + MicroSD från Adafruit innehåller all maskinvara som behövs för att ansluta en microcontroller för uppspelning av ljud. Breakout-kortet innehåller en MicroSD-kortplats. Microcontrollern avläser kortplatsen via SPI och skickar sedan filen vidare till VS1053B för avkodning. (Bildkälla: Adafruit)

Programvarubaserad MP3-avkodning

En något mer avancerad lösning, som dock i materialhänseende brukar bli något billigare, är att avkoda MP3-filen på microcontrollern och sedan strömma den avkodade filen till en ljudcodec som genererar ljudet. För att få en effektiv programvarubaserad lösning måste utvecklaren implementera ett antal kritiska komponenter, exempelvis:

  • Ett MP3-avkodarbibliotek
  • En drivrutin för minneslagring
  • En filsystemstack
  • En DMS-drivrutin (direkt memory access)
  • En I2S-drivrutin
  • En I2C-drivrutin
  • En ljudcodec-drivrutin

Vid första anblicken kan det se ut som om det krävs en hel del arbete och ganska många krångliga programkomponenter att integrera för att få MP3-filen avkodad och omvandlad till ljud. Det bästa sättet att implementera en MP3-avkodningslösning är att använda en microcontroller-plattform som har stöd för kodning, avkodning och generell processning av ljud.

Många öppenkodsbaserade lösningar är tillgängliga på internet, men en professionell och väl beprövad lösning som utvecklarna kan lita på är STM32-verktygskedjan. Microcontroller-familjen STM32 innehåller utvecklingsverktyget STM32CubeMx, som är integrerat med ett STM32CubeIDE innehållande ljudexempel och utvecklingsbibliotek. Exemplen och verktygen är en del av en STM32CubeMX-plugin som heter X-CUBE-AUDIO. Pluginen erbjuder ljudbibliotek för MP3-avkodning för alla STM32-processorer som ingår i Arm Cortex-M4-klassen av microcontrollers.

Specifikt finns det kodprojektexempel för att skapa en MP3-spelare som körs på en STM32F469IGH6TR-microcontroller. STM32F469IGH6TR är en mycket kompetent microcontroller, med 1 Mbyte flashminne, 384 kbyte RAM och den körs med 180 MHz. Microcontrollern ingår i en 176-stifts UBGA-kapsel med gott om GPIO och extra funktioner för i stort sett alla typer av tillämpningar.

STMicroelectronics STM32F469IGH6TR är en 180 MHz Arm Cortex-M4-processorFigur 3: STM32F469IGH6TR är en 180 MHz Arm Cortex-M4-processor med 1 Mbyte flash och 384 kbyte RAM. En 176-stifts UBGA-kapsel ger gott om GPIO för i stort sett alla sorters inbäddade tillämpningar. (Bildkälla: STMicroelectronics)

MP3-spelarens exempelkod körs på STM32F469I-DISCO Discovery Kit (figur 4). STM32F469I-DISCO innehåller allt som behövs för att avkoda och spela upp MP3-filer. Kortet har en 4-tums, 800 x 480 pixels LCD-display för att informera utvecklaren om MP3-spelarens status. Vidare finns kontroller för att spela, stoppa och hoppa till nästa eller föregående. Discovery-kortet innehåller också ett hörlursuttag där det avkodade ljudet spelas upp i stereo. Det enda förbehållet gällande exempelkoden är att MP3-filerna måste komma från en extern källa – närmare bestämt en USB-lagringsenhet ansluten via en micro-USB-kontakt.

Bild av STMicroelectronics STM32F469I-DISCO Discovery KitFigur 4: STM32F469I-DISCO Discovery Kit har en 4-tums LCD-display för att informera om MP3-spelarens status. Ljudfilerna lagras på en extern USB-minnesenhet och levereras via en inbyggd micro-USB-kontakt. Det här är ett bra exempel på väl fungerande avkodning av MP3-filer. (Bildkälla: STMicroelectronics)

För MP3-avkodningsbiblioteken krävs som minst en Arm Cortex-M4-processor, men att köra demokoden på utvecklingskortet är – visar det sig – ett perfekt sätt att undersöka och experimentera med ett fungerande exempel, och även att verifiera tillämpningens prestanda. Arm-kärnan SWD-gränssnitt (serial wire debug) och ITM-funktioner (instrumentation trace macrocell) gör det möjligt att utföra en statistisk analys av programräknaren, för att bestämma ungefär hur mycket processorkraft som användes för att avkoda och spela upp MP3-filerna. Det visar sig att nästan 50 % av processortiden ägnas åt att uppdatera LCD-displayen, medan högst 10 % ägnas åt MP3-avkodningen. STMicroelectronics ljudbibliotek är mycket effektiva och använder DMA för att, via I2S, trycka fram den avkodade informationen till en ljudcodec.

I tillämpningar där det inte krävs någon LCD-display (utan där ljud endast spelas upp beroende på olika systemhändelser) kan en enklare processor användas. I en sådan situation kan utvecklaren välja exempelvis STM32F469VGT6. STM32F469VGT6 har ändå bra kapacitet, med 1 Mbyte flashminne och 384 kbyte RAM, allt i en 100-stifts LQFP-kapsel. Delen finns inte med BGA-kapsel, som kan vara avskräckande för både utvecklare och tillverkare.

Bild av STMicroelectronics 180 MHz-processor STM32F469VGT6 med 1 Mbyte flashFigur 5: STM32F469VGT6 är en 180 MHz-processor med 1 Mbyte flash och 384 kbyte RAM. Delen baseras på Arm Cortex-M4-familjen, som stöds av STMicroelectronics ljudbibliotek. Som synes har den en 100-stifts LQFP-kapsel, vilket kanske tilltalar både utvecklare och tillverkare. (Bildkälla: STMicroelectronics)

När utvecklaren har valt och experimenterat med den lösning som är bäst lämpad för tillämpningen i fråga, återstår att bestämma hur den avkodade MP3-filen ska omvandlas från digitala vågformer till analogt ljud.

Använda en codec för att omvandla ljudströmmen till ljud

De flesta maskinvarubaserade lösningar innefattar även en DAC-enhet (digital-till-analog-omvandlare) som kan användas för att omvandla det mottagna digitala filformatet till analogt ljud. Vanligtvis ingår det dock en I2S-utgångsport i sådana kretsar, vilket gör det möjligt för utvecklaren att lägga till en egen ljudcodec. För programvarubaserade lösningar behövs det definitivt en codec för att omvandla den avkodade digitalströmmen till ljud. Det kan göras på två sätt.

Det första sättet är att ta det digitala ljudet och använda microcontrollerns DAC-enhet för att generera utljudet. Det är i allmänhet inte det bästa sättet, eftersom det krävs ytterligare diskreta komponenter och en analog krets och layout med omsorgsfullt utförd design. I annat fall kan ljudets kvalitet bli lidande. Det krävs också mer omfattande konfigurering av microcontrollern för att få igång DAC-enheten, plus ytterligare processorkraft för att säkerställa fullgod matning till DAC-enheten.

Det andra sättet – och den metod som i allmänhet rekommenderas – är att använda en integrerad ljudcodec. En ljud-codec är i stort sett en integrerad krets, innefattande alla kretsar (exempelvis en DAC och en klass D-förstärkare) som behövs för att generera det analoga utflödet. En ljudcodec har en fördel som diskreta lösningar saknar: Den upptar ytterst lite utrymme på kortet och kan även ha inbyggda digitala kretsar för att styra det utgående ljudet.

Till exempel finns DAC-enheten CS43L22-CNZ från Cirrus Logic. Denna erbjuder en rad funktioner och egenskaper:

  • DAC-styrning via I2C-bussen
  • Flera utgångar, för till exempel hörlurar och högtalare
  • Ingen extern utgångsfiltrering krävs
  • En digital signalbehandlingsmotor för kontroll av volym, bas och diskant
  • ”Pop-and-click”-undertryckning

Via ett I2S-gränssnitt tar CS43L22-CNZ emot en PCM-kodad dataström från microcontrollern och omvandlar dataströmmen med hjälp av den interna DAC-enheten (figur 6). DAC-enheten kan driva flera utgångar, såsom högtalare eller hörlurar. Om en monokanal används kan CS43L22-CNZ mata ut effekt på 2 W till en högtalare. Används stereokanaler kan upp till 1 W per kanal matas ut.

Diagram för ljud-DAC:n CS43L22-CNZ från Cirrus LogicFigur 6: CS43L22-CNZ DAC är en ljud-DAC som kan mata ut upp till 2 W i en monoutgång och upp till 1 W per kanal för stereoljud. Omvandlaren har en digital signalbehandlingsmotor som ger enkel kontroll över volym, bas och diskant. (Bildkälla: Cirrus Logic)

Vissa utvecklare kanske inte behöver alla funktioner hos CS43L22-CNZ och kan då minska materialkostnaderna genom att välja ett mer slimmat alternativ.

Det beror självklart på tillämpningskraven, men ett bra exempel på ett sådant alternativ är ljudcodecen AK4637EN från AKM (figur 7). Det är en 24-bitars monokanal-codec som har en utgångs-DAC endast för en högtalare. Codecen har också en mikrofonförstärkare, så att den kan användas för att spela in ljud, om tillämpningen måste ha denna funktion.

AKM Semiconductors ljud-DAC AK4637EN i en liten 20-stifts QFN-kapsel (klicka för att förstora)Figur 7: AK4637EN är en ljud-DAC i en liten 20-stifts QFN-kapsel som matar ut upp till 1 W till en monokanal. Codecen kan styras digitalt via I2C-bussen, för att kontrollera utvolymen och hantera automatisk utmatningskontroll. (Bildkälla: AKM Semiconductor)

Som för de flesta ljud-codecs, har också AK4637EN ett I2S-gränssnitt för att ta emot den digitala ljudsignalen från microcontrollern. Kretsen innehåller även ett I2C-gränssnitt som används för att styra digitala funktioner på kortet, exempelvis volym.

Som med alla produktfunktioner måste utvecklaren se över systemkraven noggrant, för att väga de totala materialkostnaderna gentemot codecens funktioner och kostnader.

Tips för att implementera en MP3-lösning

Här följer några tips för att välja en lämplig lösning för en tillämpning:

  • Gör en materialkostnadsanalys för förväntade produktvolymer, för att jämföra materialkostnaderna för en extern MP3-avkodare respektive en mer kapabel microcontroller som kan köra en MP3-avkodare själv. Beräkna kostnaderna med lågt ställda förväntningar, högt ställda förväntningar och rimliga värden avseende volym, för att få en grund för bättre beslut.
  • Använd en ljudcodec som kan använda I2S för att generera utljudet. Diskreta lösningar kan ta längre tid att justera, men komponentkostnaderna kan vara likvärdiga.
  • Använd ett utvecklingskort för att göra en prestandaanalys på MP3-programbiblioteken, så att du förstår vad som krävs av den microcontroller som ska användas i lösningen.
  • Dra fördel av DMA-kanaler för att, via ett I2S-gränssnitt överföra avkodade MP3-data till ljudcodecen. På så sätt kan du använda en processor som har ett lägre pris.
  • Granska MP3-programbibliotekens licenser, för att säkerställa att biblioteken får användas med kommersiella produkter. För de flesta öppenkodsbaserade bibliotek måste man betala en licensavgift om man vill använda biblioteken i kommersiella produkter, vilket dock inte gäller om biblioteket levereras av kretsleverantören.

Ovanstående tips hjälper dig att välja rätt ljudlösning för inbäddade tillämpningar.

Slutsats

Att tillsätta ljud i inbäddade system var en gång i tiden en ganska avancerad uppgift, men som har beskrivits i den här artikeln finns det numera en rad olika lösningar att välja bland. Det finns allt från dedikerade externa codecs till integrerade programvarubibliotek. Men för att kunna välja en optimal lösning, är det viktigt att utvärdera behoven för tillämpningen i fråga.

Faktorer att överväga är materialkostnader, hur avancerad lösningen är, tid och kostnad för utveckling och integrering samt lösningens skalbarhet. När dessa faktorer har vägts gentemot produktvolymerna, målkostnaden och utvecklingstidplanen, blir det tydligt vilken lösning som bör väljas.

DigiKey logo

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.

Om skribenten

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo är konsult inom inbäddad programvara. Han har publicerat över 200 artiklar om utveckling av inbäddad programvara, och är en eftertraktad talare och teknisk utbildare med tre examina, däribland en master i teknik från University of Michigan.

Om utgivaren

DigiKeys nordamerikanska redaktörer