Décoder et lire efficacement des fichiers audio dans des systèmes embarqués

Par Jacob Beningo

Avec la contribution de Rédacteurs nord-américains de DigiKey

Les interfaces audio constituent une fonctionnalité de plus en plus attendue dans les conceptions embarquées. En même temps, les utilisateurs de systèmes embarqués veulent une qualité audio toujours meilleure. Pour les développeurs, cela représente un défi : comment exécuter des fichiers MP3 ou d'autres fichiers audio sur un système basé sur un microcontrôleur ? Ces systèmes sont non seulement limités en matière de ressources, mais manquent aussi d'interfaces audio faciles à utiliser que les développeurs peuvent exploiter sur un système Linux. Cela complique le décodage des fichiers audio et la conversion efficace de leur contenu en son analogique.

Les développeurs doivent également choisir minutieusement entre une solution matérielle ou logicielle et sélectionner les composants à utiliser en réfléchissant sérieusement au coût, à l'espace et aux délais de développement.

Cet article présente plusieurs solutions matérielles et logicielles d'AKM Semiconductor, d'Adafruit, de STMicroelectronics et de Cirrus Logic Inc. que les développeurs peuvent utiliser pour ajouter efficacement des fichiers audio à leurs dispositifs embarqués. Il inclut également quelques « conseils et astuces » pour garantir une implémentation réussie.

Choisir un format audio embarqué

Avant de plonger dans les détails de l'intégration d'une fonctionnalité audio dans un dispositif embarqué, il est utile de s'intéresser aux raisons pour lesquelles le format audio MP3 est généralement le format privilégié. Il existe en fait trois formats audio potentiels que les développeurs peuvent utiliser avec un système embarqué : PCM (modulation par impulsions et codage), WAV et MP3.

Le format PCM est un format audio non compressé et sans perte, souvent utilisé par les codecs audio pour convertir la représentation numérique d'un flux audio en un son analogique audible par l'utilisateur. Il s'agit d'un format standard bien pris en charge qui date de l'époque des CD. Le format PCM peut être utilisé dans un système embarqué, mais le problème est que les fichiers PCM sont généralement beaucoup plus volumineux que les fichiers WAV ou MP3. Dans un dispositif limité en matière de ressources où chaque détail compte, un produit peut nécessiter une mémoire externe plus importante ou un microcontrôleur intégrant davantage de mémoire pour prendre en charge ce format. C'est la raison pour laquelle le format PCM est généralement écarté, sauf si le produit présente un volume faible, ne contient qu'un seul fichier audio ou ne présente pas de contraintes financières.

Les fichiers WAV sont également des fichiers non compressés et sans perte, ce qui les rend très similaires aux fichiers PCM. Même si les fichiers WAV sont plus populaires que les fichiers PCM pour les applications embarquées, ils peuvent également occuper une quantité d'espace considérable. Ils peuvent tout à fait convenir si le système embarqué est déjà équipé d'une carte SD ou d'un autre dispositif offrant une mémoire importante.

Pour la plupart des systèmes, le format MP3 est le format audio privilégié. Les fichiers MP3 présentent des pertes, ce qui signifie que la fidélité audio peut être affectée lors du codage. Cependant, ils sont beaucoup moins volumineux que les fichiers PCM ou WAV, ce qui signifie que la durée de leur transfert et de leur stockage sur le dispositif est plus courte, et qu'ils nécessitent moins de mémoire.

Une fois que les développeurs ont opté pour le format MP3, ils peuvent choisir entre une solution matérielle ou logicielle.

Décodage MP3 basé sur une solution matérielle

La solution la plus rapide et la plus simple consiste souvent à utiliser un décodeur MP3 matériel comme le décodeur VS1053B 1681 d'Adafruit (Figure 1). Le décodeur VS1053B peut directement prendre en charge un format de fichier MP3, WAV, OGG ou MIDI sur un flux série et le décoder avec très peu d'efforts requis de la part du développeur (voire aucun effort du tout). Après le décodage du flux, le décodeur VS1053B le convertit en audio à l'aide d'un convertisseur numérique-analogique (CNA) de 18 bits.

Schéma de la puce de décodage MP3 basée sur une solution matérielle VS1053B d'AdafruitFigure 1 : Le décodeur VS1053B d'Adafruit est une puce de décodage MP3 basée sur une solution matérielle qui capte un flux audio et le décode en le transformant en un signal audio analogique représentatif. Cette solution nécessite peu d'outils logiciels et le développeur n'a pas besoin de savoir décoder ni convertir un fichier MP3. (Source de l'image : Adafruit)

Ce qui est vraiment intéressant au sujet du décodeur VS1053B, c'est qu'il peut également être débogué et contrôlé à l'aide d'un simple UART, contrairement à de nombreux autres décodeurs utilisant I2C. Il est également doté de huit broches E/S à usage général (GPIO) qui peuvent être utilisées pour les fonctionnalités de l'application, comme la lecture de bits ou la configuration de commutateurs ou de LED d'état.

Les développeurs qui cherchent à tester une solution matérielle n'ont pas nécessairement besoin de créer leur propre carte Breakout pour le décodeur VS1053B. Adafruit fournit la carte Breakout MicroSD + codec pour le décodeur VS1053B 1381. En plus du décodeur VS1053B, la carte est dotée d'un logement pour carte MicroSD pouvant être utilisé pour stocker les fichiers audio à décoder (Figure 2). La carte Breakout est conçue pour être connectée à un microcontrôleur lui-même connecté à la carte SD via un port SPI ou SDIO pour lire le fichier audio. Le flux du fichier audio est ensuite envoyé au décodeur VS1053B pour être décodé. La sortie du décodeur VL1053B peut ensuite être redirigée au besoin, vers un jack de casque ou un haut-parleur par exemple.

Image de la carte Breakout MicroSD + codec pour le décodeur VS1053B 1381 d'AdafruitFigure 2 : La carte Breakout MicroSD + codec pour le décodeur VS1053B 1381 d'Adafruit contient le matériel nécessaire pour connecter facilement un microcontrôleur afin de lire du contenu audio. La carte Breakout est dotée d'un logement de carte MicroSD intégré. Le microcontrôleur peut alors lire les données de cette carte via une interface SPI, puis transférer le fichier vers le décodeur VS1053B pour le décoder. (Source de l'image : Adafruit)

Décodage MP3 basé sur une solution logicielle

Une solution légèrement plus complexe, mais souvent moins coûteuse du point de vue de la nomenclature, consiste à décoder le fichier MP3 sur le microcontrôleur, puis à transmettre le fichier décodé vers un codec audio qui génère le son. Pour implémenter une solution logicielle efficace, un développeur doit implémenter plusieurs composants essentiels :

  • Une bibliothèque de décodeurs MP3
  • Un pilote de stockage mémoire
  • Une pile de systèmes de fichiers
  • Un pilote d'accès direct à la mémoire (DMA)
  • Un pilote I2S
  • Un pilote I2C
  • Un pilote de codec audio

Au premier abord, il semble que tout cela représente une charge de travail importante pour le développeur logiciel et de nombreux composants logiciels potentiellement complexes à intégrer pour décoder le fichier MP3 et le transformer en son. Le meilleur moyen d'implémenter une solution de décodage MP3 consiste à utiliser une plateforme de microcontrôleur qui prend en charge le codage, le décodage et le traitement général d'un fichier audio.

Même s'il existe beaucoup de solutions open-source sur Internet, la chaîne d'outils STM32 est une solution professionnelle testée et approuvée que les développeurs peuvent exploiter. La gamme de microcontrôleurs STM32 dispose d'un outil de développement appelé STM32CubeMX intégré à la plateforme STM32CubeIDE qui inclut des exemples audio et des bibliothèques de développement. Les exemples et les outils font partie d'un plug-in additionnel STM32CubeMX appelé X-CUBE-AUDIO. Le plug-in fournit des bibliothèques audio de décodage MP3 pour n'importe quel processeur STM32 faisant partie des microcontrôleurs de classe Arm Cortex-M4.

Il s'agit notamment d'exemples de projets de codage permettant de créer un lecteur MP3 fonctionnant avec un microcontrôleur STM32F469IGH6TR. Le microcontrôleur STM32F469IGH6TR est un microcontrôleur très efficace fourni avec 1 mégaoctet (Mo) de mémoire Flash, 384 kilo-octets (Ko) de RAM et qui fonctionne à 180 mégahertz (MHz). Le microcontrôleur est fourni dans un boîtier UBGA à 176 broches et offre de nombreuses fonctionnalités GPIO et périphériques pour accepter pratiquement toutes les applications.

Schéma du microcontrôleur STM32F469IGH6TR de STMicroelectronics, un processeur Arm Cortex-M4 de 180 MHzFigure 3 : Le STM32F469IGH6TR est un processeur Arm Cortex-M4 de 180 MHz avec 1 Mo de mémoire Flash et 384 Ko de RAM. Le boîtier UBGA à 176 broches offre de nombreuses GPIO pour pratiquement toutes les applications embarquées. (Source de l'image : STMicroelectronics)

L'exemple de code du lecteur MP3 s'exécute avec le kit de découverte STM32F469I-DISCO (Figure 4). Le kit STM32F469I-DISCO contient tous les éléments nécessaires pour décoder et lire des fichiers MP3. La carte intègre un écran LCD de 4 pouces et de 800 x 480 pixels utilisé pour montrer au développeur le mode de fonctionnement du lecteur MP3, ainsi que des commandes de lecture, d'arrêt et de sélection de piste suivante et de piste précédente. La carte de découverte contient également un jack de casque permettant une lecture audio en stéréo. Seule mise en garde concernant le code d'exemple : les fichiers MP3 doivent être fournis par une source externe, et plus précisément par un dispositif de stockage de masse USB connecté via un connecteur micro USB.

Image du kit de découverte STM32F469I-DISCO de STMicroelectronicsFigure 4 : Le kit de découverte STM32F469I-DISCO intègre un écran LCD de 4 pouces utilisé pour faire fonctionner le lecteur MP3. Les fichiers audio sont fournis par un dispositif de stockage de masse USB externe via un connecteur micro USB embarqué. Il fournit un exemple pratique de décodage d'un fichier MP3. (Source de l'image : STMicroelectronics)

Les bibliothèques de décodage MP3 nécessitent un processeur Arm Cortex-M4 ou un processeur plus performant, mais l'exécution du code de démonstration sur la carte de développement est un excellent moyen de voir et de tester un exemple pratique, et de vérifier les performances de l'application. En utilisant l'interface SWD (Serial Wire Debug) et les capacités ITM (Instrumentation Trace Macrocell) du cœur Arm, il est possible d'effectuer une analyse statistique sur le compteur de programme pour déterminer approximativement la quantité de puissance de traitement utilisée pour décoder et lire les fichiers MP3. Il s'avère que près de 50 % de la durée de fonctionnement du processeur sont consacrés à mettre à jour l'écran LCD, tandis que 10 % ou moins sont consacrés au décodage du fichier MP3. Les bibliothèques audio de STMicroelectronics sont très efficaces et utilisent un accès direct à la mémoire pour envoyer les séquences décodées vers un codec audio via I2S.

Dans le cas d'une application qui ne nécessite pas d'écran LCD, mais qui doit seulement lire du son en fonction d'autres événements système, il est possible d'utiliser un processeur présentant moins de fonctionnalités. Par exemple, un développeur peut envisager le microcontrôleur STM32F469VGT6. Le STM32F469VGT6 reste assez performant, avec un 1 Mo de mémoire Flash et 384 Ko de RAM, et ce dans un boîtier LQFP à 100 broches. L'empreinte de ce composant est différente de celle d'un boîtier BGA, qui impressionne parfois les développeurs et les fabricants.

Image du processeur de 180 MHz STM32F469VGT6 de STMicroelectronics avec 1 Mo de mémoire FlashFigure 5 : Le STM32F469VGT6 est un processeur de 180 MHz avec 1 Mo de mémoire Flash et 384 Ko de RAM. Ce composant s'appuie sur la gamme Arm Cortex-M4, ce qui signifie qu'il est pris en charge par les bibliothèques audio de STMicroelectronics. Comme illustré, il est fourni dans un boîtier LQFP à 100 broches, ce qui le rend moins impressionnant aux yeux des développeurs et des fabricants. (Source de l'image : STMicroelectronics)

Une fois qu'un développeur a sélectionné et testé la solution qu'il juge la mieux adaptée à son application, il doit choisir le moyen permettant de convertir les formes d'ondes numériques de son fichier MP3 décodé en un son analogique.

Convertir le flux audio en son grâce à un codec

La plupart des solutions de décodage matérielles incluent également un convertisseur numérique-analogique (CNA) qui peut être utilisé pour convertir le format de fichier numérique reçu en un son analogique. Cependant, ces puces incluent souvent un port de sortie I2S qui permet au développeur d'ajouter son propre codec audio. Les solutions logicielles ont absolument besoin d'un codec pour convertir le flux numérique décodé en son. Cette conversion peut être réalisée de deux façons différentes.

Tout d'abord, il est possible d'utiliser le périphérique CNA intégré au microcontrôleur pour générer une sortie audio à partir de l'audio numérique. En général, ce n'est pas la meilleure façon de générer une sortie audio, car elle nécessite des composants discrets supplémentaires ainsi qu'une conception et une configuration de circuit analogique minutieuses pour obtenir une sortie de qualité. Cette technique nécessite également une configuration plus poussée du microcontrôleur pour pouvoir utiliser le CNA. De plus, davantage de puissance est généralement requise au niveau du processeur pour garantir le bon fonctionnement du CNA.

La deuxième méthode, généralement recommandée, consiste à utiliser un codec audio intégré. Les codecs audio sont en fait des circuits intégrés dotés de l'ensemble des circuits permettant de générer une sortie analogique, comme un CNA ou des amplificateurs de classe D. Un codec audio est plus avantageux qu'une solution discrète, car il occupe très peu d'espace carte et peut également être doté de circuits numériques intégrés permettant de contrôler le flux de sortie audio.

Par exemple, le CNA CS43L22-CNZ de Cirrus Logic offre aux développeurs une vaste gamme de fonctionnalités :

  • Un contrôle du CNA via le bus I2C
  • Plusieurs sorties, pour un casque et un haut-parleur par exemple
  • Aucun filtre de sortie externe requis
  • Un moteur de processeur de signaux numériques pour contrôler le volume, les graves et les aigus
  • La suppression des clics et craquements

Le CS43L22-CNZ reçoit de la part du microcontrôleur un flux de données codées PCM via une interface I2S, puis le convertit grâce à son CNA interne (Figure 6). Le CNA CS43L22-CNZ peut commander plusieurs sorties, pour un haut-parleur ou un casque par exemple. Si un seul canal mono est utilisé, le CS43L22-CNZ peut générer une puissance de 2 W vers un haut-parleur. Si des canaux stéréo sont utilisés, il peut générer jusqu'à 1 W par canal.

Schéma du CNA audio CS43L22-CNZ de Cirrus LogicFigure 6 : Le CNA CS43L22-CNZ est un CNA audio pouvant générer jusqu'à 2 W via une sortie mono ou jusqu'à 1 W par canal pour un son stéréo. Le CNA intègre un moteur de traitement numérique des signaux qui permet de contrôler facilement le volume, les graves et les aigus. (Source de l'image : Cirrus Logic)

Certains développeurs peuvent ne pas avoir besoin de toutes les fonctionnalités du CS43L22-CNZ et peuvent alors réduire les coûts de nomenclature en adoptant une approche plus minimaliste.

Cela dépend, bien évidemment, des exigences de l'application, mais le codec audio AK4637EN d'AKM (Figure 7) est un bon exemple de cette approche. Il s'agit d'un codec monocanal de 24 bits doté d'un CNA de sortie pour un haut-parleur uniquement. Ce codec inclut également un amplificateur de microphone, ce qui signifie qu'il peut aussi être utilisé pour enregistrer du son si l'application le demande.

Schéma du CNA audio AK4637EN d'AKM Semiconductor en boîtier QFN compact à 20 broches (cliquez pour agrandir)Figure 7 : L'AK4637EN est un CNA audio en boîtier QFN compact à 20 broches qui génère un seul canal audio mono jusqu'à 1 W. Le codec peut être contrôlé numériquement à l'aide du bus I2C pour gérer le volume de sortie et le contrôle de la sortie automatique. (Source de l'image : AKM Semiconductor)

Tout comme la plupart des codecs audio, l'AK4637EN est également doté d'une interface I2S pour recevoir le signal audio numérique du microcontrôleur. La puce est aussi dotée d'une interface I2C utilisée pour contrôler les fonctionnalités numériques intégrées comme le contrôle du volume.

Tout comme avec n'importe quelles fonctionnalités de produit, les développeurs doivent prendre le temps d'examiner avec attention les exigences de leur système et de trouver le bon équilibre entre les fonctionnalités et les coûts du codec par rapport aux coûts de nomenclature cibles.

Conseils et astuces pour implémenter une solution MP3

Voici quelques « conseils et astuces » que les développeurs peuvent appliquer lorsqu'ils choisissent la solution adéquate pour leur application :

  • Comparez les coûts de nomenclature pour les volumes attendus entre un décodeur MP3 externe et un microcontrôleur plus performant capable d'exécuter lui-même un décodeur MP3. Assurez-vous d'utiliser des chiffres pessimistes, atteignables et optimistes concernant les volumes pour établir une fourchette permettant de prendre de bonnes décisions.
  • Utilisez un codec audio compatible avec l'interface I2S pour générer l'audio de sortie. Les solutions discrètes peuvent prendre plus de temps au niveau des réglages, mais les coûts associés aux composants peuvent être équivalents.
  • Analysez les performances des bibliothèques logicielles MP3 à l'aide d'une carte de développement pour comprendre les caractéristiques minimales du microcontrôleur nécessaires à l'exécution de la solution.
  • Exploitez les canaux d'accès direct à la mémoire pour transférer les séquences MP3 décodées vers le codec audio via une interface I2S. Cela permet d'utiliser un processeur moins coûteux.
  • Examinez attentivement toutes les licences de bibliothèques logicielles MP3 pour vous assurer qu'elles peuvent être utilisées avec un produit commercial. La plupart des bibliothèques open-source nécessitent une licence payante pour être utilisées avec des produits commerciaux, sauf si elles sont fournies par le fournisseur de la puce.

En suivant ces conseils, les développeurs pourront choisir la bonne solution audio pour leur application embarquée.

Conclusion

Ajouter du son à un système embarqué pouvait s'avérer complexe il y a quelque temps, mais comme illustré, les développeurs peuvent désormais choisir parmi une vaste gamme de solutions. Ces solutions s'étendent des codecs externes dédiés aux bibliothèques logicielles intégrées. Toutefois, les développeurs doivent évaluer avec soin les besoins de leur application et déterminer quelle solution est la plus judicieuse.

Les facteurs à prendre en compte incluent la nomenclature, la complexité de la solution, les délais et les coûts de développement et d'intégration, ainsi que l'évolutivité de la solution. Une fois que ces facteurs ont été évalués par rapport aux volumes des produits, au coût cible et au calendrier de développement, la solution la plus adaptée devient évidente.

DigiKey logo

Avertissement : les opinions, convictions et points de vue exprimés par les divers auteurs et/ou participants au forum sur ce site Web ne reflètent pas nécessairement ceux de DigiKey ni les politiques officielles de la société.

À propos de l'auteur

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo est un consultant en logiciels embarqués, et il travaille actuellement avec des clients dans plus d'une douzaine de pays pour transformer radicalement leurs activités en améliorant la qualité, les coûts et les délais de commercialisation des produits. Il a publié plus de 200 articles sur les techniques de développement de logiciels embarqués. Jacob Beningo est un conférencier et un formateur technique recherché, et il est titulaire de trois diplômes, dont un master en ingénierie de l'Université du Michigan. N'hésitez pas à le contacter à l'adresse jacob@beningo.com et sur son site Web www.beningo.com, et abonnez-vous à sa newsletter mensuelle Embedded Bytes.

À propos de l'éditeur

Rédacteurs nord-américains de DigiKey