Come decodificare e riprodurre in modo efficiente i file audio nei sistemi embedded
Contributo di Editori nordamericani di DigiKey
2019-11-05
Le interfacce audio sono sempre più una caratteristica imprescindibile nei progetti embedded. Gli utenti di sistemi embedded si aspettano però anche una qualità audio sempre migliore. Gli sviluppatori devono così confrontarsi con la sfida di come eseguire file MP3 o altri file audio su un sistema basato su microcontroller. Questi sistemi non solo hanno vincoli di risorse, ma mancano anche delle interfacce audio intuitive che gli sviluppatori possono sfruttare su un sistema basato su Linux. È di conseguenza più difficile decodificare i file audio e convertire in modo efficiente il loro contenuto in suono analogico.
Data l'importanza di costi, spazio e tempi di sviluppo, gli sviluppatori devono inoltre scegliere attentamente tra una soluzione hardware o software e decidere quali componenti utilizzare.
Questo articolo presenta diverse soluzioni hardware e software di AKM Semiconductor, Adafruit, STMicroelectronics e Cirrus Logic Inc. che gli sviluppatori possono utilizzare per aggiungere in modo efficiente ed efficace file audio ai dispositivi embedded. Offre inoltre alcuni suggerimenti e consigli per facilitare l'implementazione.
Come scegliere un formato audio embedded
Prima di entrare nel merito di come integrare funzionalità audio in un dispositivo embedded, è utile riflettere sul motivo per cui di solito il formato audio MP3 è quello preferito. Per un sistema embedded, in realtà tre sono i potenziali formati audio a disposizione degli sviluppatori: PCM (modulazione a codice di impulsi), WAV e MP3.
PCM è un formato audio non compresso e senza perdite che viene spesso utilizzato dai codec audio per convertire la rappresentazione digitale del flusso audio in un suono analogico fruibile dall'utente. È un formato standard ben supportato che risale ai CD. Potrebbe essere utilizzato in un sistema embedded, ma i file PCM sono in genere molto più grandi dei file WAV o MP3, il che costituisce un problema. In un dispositivo con risorse limitate dove ogni bit conta, un dato prodotto potrebbe richiedere un dispositivo di memoria esterna più grande o un microcontroller con più memoria. È per questo che di solito si evita di adottare il formato PCM, a meno che il prodotto non sia a produzione limitata, non abbia un solo file audio o vincoli di costi.
Anche i file WAV sono non compressi e senza perdite, quindi molto simili ai PCM. I file WAV tendono a essere più popolari dei file PCM per le applicazioni embedded, ma possono occupare una notevole quantità di spazio. Potrebbero essere perfettamente idonei se il sistema embedded ha già una scheda SD o un altro dispositivo di memoria di grandi dimensioni.
Per la maggior parte dei sistemi, i file MP3 sono il formato audio preferito. I file MP3 sono basati su un algoritmo di compressione con perdita, per cui la codifica dell'audio potrebbe determinare una certa perdita di fedeltà. Sono però molto più piccoli dei file PCM o WAV, quindi hanno tempi di trasferimento e di memorizzazione più brevi per mettere i file audio sul dispositivo, e anche minori esigenze di memoria.
Una volta deciso per l'MP3, gli sviluppatori possono scegliere se usare l'hardware o il software.
Decodifica MP3 basata su hardware
Spesso la soluzione più rapida e semplice è l'uso di un decoder MP3 hardware come VS1053B 1681 di Adafruit (Figura 1). VS1053B può accettare direttamente un formato file MP3, WAV, OGG o MIDI su un flusso seriale e decodificarlo senza alcuno sforzo da parte dello sviluppatore. Dopo aver decodificato lo stream, VS1053B lo converte in audio utilizzando un convertitore digitale/analogico (DAC) a 18 bit.
Figura 1: VS1053B di Adafruit è un chip decoder MP3 basato su hardware che prende un flusso audio e lo decodifica nel segnale audio analogico rappresentativo. Questa soluzione richiede pochissimo software e non è necessario che lo sviluppatore capisca come decodificare o convertire un file MP3. (Immagine per gentile concessione di Adafruit)
La particolarità veramente interessante di VS1053B è che, rispetto a molti altri decoder che usano I2C, lo si può anche controllare e sottoporre a debug usando un semplice UART. Dispone inoltre di otto pin di ingresso/uscita per uso generale che possono essere utilizzati per funzioni applicative come la lettura di bit o l'impostazione di interruttori o LED di stato.
Gli sviluppatori che desiderano provare una soluzione basata su hardware non devono necessariamente creare una scheda di breakout per VS1053B. Adafruit offre il codec VS1053B 1381 + la scheda di breakout MicroSD. Oltre a VS1053B, la scheda ha uno slot per schede MicroSD che può essere utilizzato per memorizzare i file audio per la decodifica (Figura 2). La scheda di breakout è progettata per essere collegata a un microcontroller che si collega alla scheda SD tramite una porta SPI o SDIO per leggere il file audio. Lo stream del file audio viene quindi inviato a VS1053B per la decodifica. L'uscita di VL1053B può essere poi indirizzata in base alle esigenze, ad esempio verso una presa per cuffie o un altoparlante.
Figura 2: La scheda di breakout per codec VS1053B 1381 + MicroSD di Adafruit contiene l'hardware necessario per collegare facilmente un microcontroller per riprodurre l'audio. La scheda di breakout ha uno slot integrato per schede MicroSD che il microcontroller può leggere tramite SPI e poi trasferire quel file a VS1053B per la decodifica. (Immagine per gentile concessione di Adafruit)
Decodifica MP3 basata su software
Una soluzione leggermente più complessa, ma spesso meno costosa dal punto di vista della distinta base, consiste nel decodificare il file MP3 sul microcontroller e quindi trasmettere il file decodificato a un codec audio che genera l'audio. Per implementare una soluzione efficiente basata su software, uno sviluppatore dovrà inserire diversi componenti cruciali come:
- Una libreria di decoder MP3
- Un driver di memoria
- Uno stack di file system
- Un driver di accesso diretto alla memoria (DMA)
- Un driver I2S
- Un driver I2C
- Un driver codec audio
A prima vista, sembra che lo sviluppatore software debba faticare per integrare numerosi componenti software potenzialmente complessi, al fine di decodificare l'MP3 e trasformarlo in audio. Il modo migliore per implementare una soluzione di decodifica MP3 è sfruttare una piattaforma a microcontroller che supporti la codifica audio, la decodifica e l'elaborazione generale.
Anche se su Internet è possibile trovare molte soluzioni open-source, gli sviluppatori possono sfruttare la toolchain STM32, una soluzione professionale e sperimentata. Della famiglia di microcontroller STM32 fa parte uno strumento di sviluppo chiamato STM32CubeMx, integrato con STM32CubeIDE, che include esempi audio e librerie di sviluppo. Esempi e strumenti appartengono a un plugin add-on STM32CubeMX chiamato X-CUBE-AUDIO. Il plugin fornisce le librerie audio per la decodifica MP3 per qualsiasi processore STM32 della classe di microcontroller Arm Cortex-M4.
In particolare, ci sono esempi di progetti di codice per realizzare un lettore MP3 da eseguire su un microcontroller STM32F469IGH6TR. STM32F469IGH6TR è un microcontroller molto capace, dotato di 1 MB di flash, 384 kB di RAM e che funziona a 180 MHz. Il microcontroller si trova in un contenitore UBGA a 176 pin che offre numerose funzioni GPIO e periferiche per rispondere a quasi tutte le applicazioni.
Figura 3: STM32F469IGH6TR è un processore Arm Cortex-M4 a 180 MHz con 1 MB di flash e 384 kB di RAM. Il contenitore UBGA a 176 pin offre moltissime GPIO per quasi tutte le applicazioni embedded. (Immagine per gentile concessione di STMicroelectronics)
Esempio di codice del lettore MP3 in esecuzione sul kit Discovery STM32F469I-DISCO (Figura 4). STM32F469I-DISCO contiene tutto ciò che serve per decodificare e riprodurre MP3. La scheda ha un LCD da 4 pollici, 800x480 pixel, che viene utilizzato per aggiornare uno sviluppatore sullo stato di dimostrazione di MP3, e comandi del lettore come play, stop, avanti e indietro. La scheda Discovery contiene anche una presa per cuffie che fornisce l'audio risultante in stereo. L'unica riserva, riguardo il codice di esempio, è che i file MP3 devono essere forniti da una fonte esterna, nello specifico da un dispositivo di archiviazione come un'unità USB collegata tramite un connettore Micro-USB.
Figura 4: Il kit Discovery STM32F469I-DISCO ha un LCD da 4 pollici usato per la dimostrazione del lettore MP3. I file audio sono forniti da un dispositivo di archiviazione di massa USB esterno tramite il connettore Micro-USB integrato. Offre un esempio pratico di come decodificare un file MP3. (Immagine per gentile concessione di STMicroelectronics)
Le librerie di decodifica MP3 richiedono un processore Arm Cortex-M4 o migliore ma l'esecuzione del codice dimostrativo sulla scheda di sviluppo è un ottimo modo non solo per vedere e fare esperimenti con un esempio pratico, ma anche per verificare le prestazioni dell'applicazione. Utilizzando l'interfaccia SWD (Serial Wire Debug) e le funzionalità ITM (Instrumentation Trace Macrocell) del core Arm, è possibile eseguire un'analisi statistica sul contatore del programma per determinare approssimativamente la potenza di calcolo utilizzata per decodificare i file MP3 e riprodurli. Si scopre che la CPU potrebbe passare quasi il 50% del tempo ad aggiornare il display LCD e il 10% o meno a decodificare MP3. Le librerie audio STMicroelectronics sono molto efficienti e utilizzano il DMA per inviare a un codec audio i frame decodificati su I2S.
Nel caso di un'applicazione che non richiede un LCD ma che ha solo bisogno di riprodurre l'audio basato su altri eventi di sistema, è possibile utilizzare un processore con meno funzioni. Ad esempio, si potrebbe prendere in considerazione STM32F469VGT6. STM32F469VGT6 è abbastanza potente, con 1 MB di flash e 384 kB di RAM, racchiusi tutti in un LQFP a 100 pin. Questo componente non utilizza un footprint BGA, il che a volte può spaventare sia gli sviluppatori che i produttori.
Figura 5: STM32F469VGT6 è un processore a 180 MHz con 1 MB di flash e 384 kB di RAM. Il componente è basato sulla famiglia Arm Cortex-M4, supportata dalle librerie audio di STMicroelectronics. Come è stato dimostrato, è disponibile in un LQFP a 100 pin, il che lo rende meno "restrittivo" sia per gli sviluppatori che per i produttori. (Immagine per gentile concessione di STMicroelectronics)
Dopo aver selezionato e sperimentato la soluzione che ritiene più idonea per la propria applicazione, lo sviluppatore deve decidere come convertire il file MP3 decodificato dalle forme d'onda digitali in suono analogico.
Convertire il flusso audio in suono con un codec
La maggior parte delle soluzioni di decodifica basate su hardware includerà anche un convertitore digitale/analogico (DAC) che può essere utilizzato per convertire in suono analogico il formato file digitale ricevuto. Questi chip spesso includono anche una porta di uscita I2S che permette a uno sviluppatore di aggiungere il proprio codec audio. Le soluzioni basate su software avranno sicuramente bisogno di un codec per convertire in audio il flusso digitale decodificato. Esistono due scelte.
In primo luogo, è possibile prendere l'audio digitale e la periferica DAC integrata del microcontroller e generare l'uscita audio. In linea di massima, questo non è il modo migliore per generare audio perché, per ottenere un'uscita di qualità, servono componenti discreti supplementari e un'attenta progettazione e disposizione dei circuiti analogici. Richiede anche un po' più di configurazione sul microcontroller per rendere funzionale il DAC. Quindi, per assicurare che il DAC sia "alimentato" correttamente, in genere è richiesto un processore più potente.
Il secondo metodo, che è poi quello normalmente consigliato, è utilizzare un codec audio integrato. I codec audio sono fondamentalmente degli integrati con tutti i circuiti necessari per generare l'uscita analogica, come un DAC e amplificatori di Classe D. Un codec audio ha un vantaggio rispetto a una soluzione discreta, in quanto occupa pochissimo spazio su scheda e può anche avere circuiti digitali integrati per controllare il flusso di uscita audio.
Ad esempio, il DAC CS43L22-CNZ di Cirrus Logic fornisce agli sviluppatori un'ampia gamma di funzionalità come:
- Controllo DAC tramite il bus I2C
- Uscite multiple come cuffie e altoparlante
- Nessuna necessità di filtraggio esterno dell'uscita
- Un motore dell'unità di elaborazione del segnale digitale per il controllo di volume, bassi e alti
- Soppressione di crepitio e clic
CS43L22-CNZ riceve un flusso di dati codificato PCM su un'interfaccia I2S dal microcontroller, che poi converte utilizzando il DAC interno (Figura 6). Il DAC CS43L22-CNZ può pilotare più uscite come un altoparlante o una cuffia. Se si utilizza un singolo canale mono, CS43L22-CNZ può erogare 2 W di potenza a un altoparlante o, se si utilizzano canali stereo, fino a 1 W per canale.
Figura 6: CS43L22-CNZ è un DAC audio in grado di erogare fino a 2 W attraverso un'uscita mono o 1 W per canale per l'audio stereo. Il DAC ha un motore di elaborazione dei segnali digitali che permette di controllare facilmente volume, bassi e alti. (Immagine per gentile concessione di Cirrus Logic)
Alcuni sviluppatori potrebbero non aver bisogno di tutte le caratteristiche di CS43L22-CNZ e potrebbero riuscire a risparmiare sulla distinta base scegliendo un approccio più minimalista.
Questo dipende ovviamente dai requisiti dell'applicazione, ma un buon esempio è il codec audio AK4637EN di AKM (Figura 7). Si tratta di un codec a un canale a 24 bit con un DAC di uscita solo per un altoparlante. Include anche un amplificatore per microfono, per cui può essere utilizzato anche per registrare audio, se l'applicazione lo richiede.
Figura 7: AK4637EN è un DAC audio in un piccolo contenitore QFN a 20 pin che eroga 1 W al massimo su un singolo canale audio mono. Il codec può essere controllato digitalmente attraverso il bus I2C per gestire il volume in uscita e per il controllo automatico dell'uscita. (Immagine per gentile concessione di AKM Semiconductor)
Come per la maggior parte dei codec audio, AK4637EN è dotato anche di un'interfaccia I2S per ricevere il segnale audio digitale dal microcontroller. Il chip contiene inoltre un'interfaccia I2C usata per controllare funzioni digitali integrate come il volume.
Come per qualsiasi caratteristica dei prodotti, gli sviluppatori devono esaminare attentamente i requisiti da soddisfare per il loro sistema e bilanciare le caratteristiche e i costi del codec con i costi della distinta base da rispettare.
Suggerimenti e consigli per implementare una soluzione MP3
Ecco una serie di suggerimenti e consigli che gli sviluppatori possono sfruttare per scegliere la soluzione appropriata per un'applicazione:
- Eseguire un'analisi dei costi della distinta base in funzione dei volumi previsti, valutando l'opzione di un decoder MP3 esterno e quella con un microcontroller più potente che sia in grado di eseguire da solo un decoder MP3. Utilizzare cifre di volume pessimistiche, raggiungibili e ottimistiche per delimitare una forchetta che faciliti il processo decisionale.
- Utilizzare un codec audio che accetti I2S per generare l'audio in uscita. La messa a punto di soluzioni discrete potrebbe richiedere più tempo e i costi dei componenti potrebbero essere equivalenti.
- Eseguire un'analisi delle prestazioni su librerie di software MP3 utilizzando una scheda di sviluppo per comprendere le caratteristiche minime del microcontroller richieste per eseguire la soluzione.
- Sfruttare i canali DMA per trasferire i frame MP3 decodificati al codec audio su un'interfaccia I2S. Ciò consentirà di utilizzare un processore meno costoso.
- Esaminare attentamente le licenze delle librerie di software MP3 per assicurarsi di poterle utilizzare con un prodotto commerciale. La maggior parte delle librerie open-source richiedono una licenza a pagamento per i prodotti commerciali, a meno che non vengano fornite dal venditore del chip.
Gli sviluppatori che seguono questi suggerimenti avranno meno difficoltà a scegliere la soluzione audio giusta per la loro applicazione embedded.
Conclusione
L'aggiunta di audio a un sistema embedded un tempo poteva essere un'impresa ma, come è stato dimostrato, oggi gli sviluppatori hanno molte soluzioni tra cui scegliere. Si va da codec esterni dedicati a librerie software integrate. Ciononostante, gli sviluppatori devono valutare attentamente le esigenze della propria applicazione e stabilire quale sia il percorso più ragionevole da seguire.
Fra i fattori da considerare vi sono la distinta base, la complessità della soluzione, i tempi e i costi di sviluppo e integrazione, oltre alla scalabilità della soluzione. Una volta soppesati questi fattori rispetto ai volumi del prodotto, ai costi desiderati e ai tempi di sviluppo, sarà chiaro qual è la soluzione più idonea.
Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.




