Cómo decodificar y reproducir archivos de audio en sistemas integrados con eficacia

Por Jacob Beningo

Colaboración de Editores de DigiKey de América del Norte

Los diseños integrados exigen cada vez más interfaces de audio. Al mismo tiempo, los usuarios de sistemas integrados esperan una calidad de audio cada vez mayor. Para los desarrolladores esto presenta un desafío: cómo ejecutar MP3 u otros archivos de audio en un sistema basado en microcontrolador. Estos sistemas no solo cuentan con recursos limitados, sino que carecen de las interfaces de audio fáciles de usar que los desarrolladores pueden aprovechar en un sistema basado en Linux. Esto hace que sea más difícil decodificar archivos de audio y convertir el contenido a sonido analógico con eficiencia.

Los desarrolladores también deben elegir con atención entre una solución de hardware o software y decidir qué componentes usar. El costo, el espacio y el tiempo de desarrollo son consideraciones importantes.

Este artículo proporciona una introducción a varias soluciones de hardware y software de AKM Semiconductor, Adafruit, STMicroelectronicsy Cirrus Logic Inc. que los desarrolladores pueden usar para agregar archivos de audio a dispositivos integrados con eficiencia. También incluye algunos "consejos y trucos" para ayudar a garantizar una implementación exitosa.

Selección de un formato de audio integrado

Antes de ahondar en los detalles de cómo incorporar la funcionalidad de audio en un dispositivo integrado, resulta útil pensar el motivo por el que, en general, se prefiere el formato de audio MP3. Para un sistema integrado, existen en realidad tres posibles formatos de audio que los desarrolladores podrían utilizar: PCM (modulación de código de pulso), WAV y MP3.

PCM es un formato de audio no comprimido y sin pérdidas que a menudo utiliza los códecs de audio para convertir la representación digital de la transmisión de audio en sonido analógico que el usuario escucha. Es un formato estándar con buena compatibilidad que se remonta a los CD. PCM podría usarse en un sistema integrado, pero el problema es que los archivos PCM suelen ser mucho más grandes que los archivos WAV o MP3. En un dispositivo con recursos limitados, donde cada níquel cuenta, un producto puede requerir un dispositivo de memoria externa más grande o un microcontrolador con más memoria para admitirlo. Por esta razón, por lo general se evita PCM a menos que el producto tenga poco volumen, tenga un solo archivo de audio o no tenga restricciones de costos.

WAV también es un formato no comprimido sin pérdidas, lo que lo asemeja a PCM. Si bien a menudo son más populares que los archivos PCM para aplicaciones integradas, los archivos WAV pueden ocupar un espacio considerable. Podrían ser adecuados si el sistema integrado ya tiene una tarjeta SD u otro dispositivo con una amplia capacidad de memoria.

Para la mayoría de los sistemas, MP3 es el formato de audio de preferencia. Los archivos MP3 tienen pérdidas, por lo que se puede perder algo de fidelidad de audio cuando se codifican. Sin embargo, son mucho más pequeños que los archivos PCM o WAV, por lo que requieren menos tiempo de transferencia y almacenamiento al colocar los archivos de audio en el dispositivo, así requisitos de memoria más pequeña.

Una vez que se haya decidido que MP3 es la opción que se elegirá, los desarrolladores pueden optar por hacerlo en hardware o software.

Decodificación de MP3 basada en hardware

A menudo, la solución más rápida y fácil es usar un decodificador de MP3 de hardware como el 1681 VS1053B de Adafruit (Figura 1). El VS1053B puede aceptar directamente un formato de archivo MP3, WAV, OGG o MIDI a través de una transmisión en serie y decodificarlo con poco o ningún esfuerzo por parte del desarrollador. Después de decodificar la transmisión, el VS1053B la convierte a audio usando un convertidor DAC (digital a analógico) de 18 bits.

Diagrama del chip decodificador de MP3 basado en hardware del VS1053B de AdafruitFigura 1: El VS1053B de Adafruit es un chip decodificador de MP3 basado en hardware que toma una transmisión de audio y la decodifica en la señal de audio analógica representativa. Esta solución requiere un software mínimo y no es necesario que un desarrollador entienda cómo decodificar o convertir un archivo MP3. (Fuente de la imagen: Adafruit)

Lo que es realmente interesante sobre el VS1053B es que también se puede depurar y controlar usando un UART (transmisor receptor asíncrono universal) simple, en comparación con muchos otros decodificadores que usan I2C. También cuenta con ocho pines de entrada/salida de propósito general que se pueden usar para características de aplicaciones, como leer bits o configurar interruptores o leds indicadores de estado.

Los desarrolladores que buscan probar una solución basada en hardware no tienen la necesidad de crear una placa de conexión propia para el VS1053B. Adafruit proporciona el códec 1381 VS1053B + placa de conexión MicroSD. Junto con el VS1053B, la placa tiene una ranura para tarjeta MicroSD que se puede usar para almacenar archivos de audio para la decodificación (Figura 2). La placa de conexión se diseñó para conectarse a un microcontrolador que se conectaría a la tarjeta SD a través de un puerto de SPI (interfaz periférica serial) o SDIO (entrada/salida de Secure Digital) para leer el archivo de audio. La transmisión del archivo de audio se envía al VS1053B para la decodificación. La salida del VL1053B se puede dirigir según sea necesario, por ejemplo, a un conector para auriculares o a un altavoz.

Imagen del códec 1381 VS1053B + placa de conexión MicroSD de AdafruitFigura 2: El códec 1381 VS1053B + placa de conexión MicroSD de Adafruit contiene el hardware necesario para conectar con facilidad un microcontrolador para reproducir audio. La placa de conexión tiene una ranura integrada para tarjeta MicroSD que el microcontrolador puede leer por SPI y luego transferir ese archivo al VS1053B para la decodificación. (Fuente de la imagen: Adafruit)

Decodificación de MP3 basada en software

Una solución un poco más compleja, pero que a menudo es menos costosa desde el punto de vista de la BOM (lista de materiales), es decodificar el archivo MP3 en el microcontrolador y luego transmitir el archivo decodificado a un códec de audio que genera el audio. Para implementar una solución eficiente basada en software, un desarrollador deberá incorporar varios componentes críticos, como por ejemplo:

  • Una biblioteca decodificadora de MP3
  • Un controlador de almacenamiento de memoria
  • Una pila de sistema de archivos
  • Un controlador de DMA (acceso directo a memoria)
  • Un controlador I2S
  • Un controlador I2C
  • Un controlador de códec de audio

A primera vista, esto parece implicar mucho trabajo para el desarrollador de software y la integración de muchos componentes de software muy complejos para decodificar el MP3 y convertirlo en audio. La mejor manera de implementar una solución de decodificación de MP3 es usar una plataforma de microcontrolador que admita codificación, decodificación y procesamiento general de audio.

Si bien hay muchas soluciones de código abierto que se pueden encontrar en Internet, una solución profesional y comprobada que los desarrolladores pueden aprovechar es la cadena de herramientas STM32. La familia de microcontroladores STM32 tiene una herramienta de desarrollo llamada STM32CubeMx que se integra con la STM32CubeIDE que incluye ejemplos de audio y bibliotecas de desarrollo. Los ejemplos y las herramientas son parte de un complemento adicional STM32CubeMX llamado X-CUBE-AUDIO. El complemento proporciona las bibliotecas de audio para la decodificación de MP3 para cualquier procesador STM32 que se encuentre en la clase de microcontroladores Arm Cortex-M4.

En particular, existen ejemplos de proyectos de código para crear un reproductor de MP3 que se ejecutará en un microcontrolador STM32F469IGH6TR. El STM32F469IGH6TR es un microcontrolador muy capaz que incluye 1 Mbyte (megabyte) de flash, 384 Kbytes (kilobytes) de RAM y funciona a 180 MHz (megahercios). El microcontrolador está disponible en un paquete UBGA de 176 pines que proporciona muchas características periféricas y de entrada y salida de uso general (GPIO) para adaptarse a casi cualquier aplicación.

Diagrama de STMicroelectronics STM32F469IGH6TR es un procesador Arm-Cortex-M4 de 180 MHzFigura 3: El STM32F469IGH6TR es un procesador Arm Cortex-M4 de 180 MHz con 1 Mbyte de flash y 384 Kbytes de RAM. El paquete UBGA de 176 pines proporciona una gran cantidad de GPIO (entrada/salida de propósito general) para casi cualquier aplicación integrada. (Fuente de la imagen: STMicroelectronics)

El ejemplo del código del reproductor de MP3 se ejecuta en el kit de descubrimiento STM32F469I-DISCO (Figura 4). El STM32F469I-DISCO contiene todo lo necesario para decodificar y reproducir MP3. La placa tiene una pantalla LCD de 4 pulgadas y 800 x 480 píxeles que se utiliza para actualizar un desarrollador en el estado de demostración de MP3, junto con controles del reproductor como reproducir, detener, siguiente y anterior. La placa de descubrimiento también contiene un conector para auriculares donde el audio resultante se reproduce en estéreo. La única advertencia con el código de ejemplo es que requiere que los archivos MP3 provengan de una fuente externa, en particular, de un dispositivo de almacenamiento masivo USB que esté conectado a través de un conector micro USB.

Imagen del kit de descubrimiento STMicroelectronics STM32F469I-DISCOFigura 4: El kit de descubrimiento STM32F469I-DISCO tiene una pantalla LCD de 4 pulgadas que se utiliza para operar la demostración del reproductor de MP3. Los archivos de audio provienen de un dispositivo de almacenamiento masivo USB externo a través del conector micro USB incorporado. Proporciona un ejemplo práctico sobre cómo decodificar un archivo MP3. (Fuente de la imagen: STMicroelectronics)

Las bibliotecas de decodificación de MP3 requieren un procesador Arm Cortex-M4 o mejor, pero, parece ser que ejecutar el código de demostración en la placa de desarrollo es una excelente manera no solo de ver y experimentar con un ejemplo práctico, sino también de verificar el rendimiento de la aplicación. La interfaz de SWD (depuración de cable serie) y las capacidades de ITM (macrocelda de seguimiento de instrumentación) del núcleo Arm le permiten realizar un análisis estadístico en el contador del programa para determinar aproximadamente la potencia de procesamiento que se utilizó para decodificar los archivos MP3 y reproducirlos. Resulta que casi el 50% del tiempo de CPU se puede dedicar a actualizar la pantalla LCD, mientras que el 10% o menos se dedicó a la decodificación de MP3. Las bibliotecas de audio STMicroelectronics son muy eficientes y utilizan el DMA para impulsar los cuadros decodificados en I2S a un códec de audio.

En el caso de una aplicación que no requiere una pantalla LCD, sino que solo necesita reproducir audio en función de otros eventos del sistema, se puede utilizar un procesador con menos funciones. Por ejemplo, un desarrollador podría mirar el STM32F469VGT6. El STM32F469VGT6 todavía tiene bastantes capacidades, con 1 Mbyte de flash y 384 Kbytes de RAM, todo en un LQFP (encapsulado cuadrado plano de perfil bajo) de 100 pines. Esta parte no usa una huella BGA (matriz de rejilla de bolas), que a veces puede ser intimidante tanto para desarrolladores como para fabricantes.

Imagen del procesador STMicroelectronics STM32F469VGT6 de 180 MHz con 1 Mbyte de FlashFigura 5: El STM32F469VGT6 es un procesador de 180 MHz con 1 Mbyte de flash y 384 Kbytes de RAM. La parte está basada en la familia Arm Cortex-M4, que es compatible con las bibliotecas de audio STMicroelectronics. Tal como se muestra, viene en un LQFP de 100 pines, lo que lo hace menos imponente tanto para desarrolladores como para fabricantes. (Fuente de la imagen: STMicroelectronics)

Una vez que el desarrollador ha seleccionado y experimentado con la solución que cree que se adaptará mejor a la aplicación, debe decidir cómo convertirá el archivo MP3 decodificado de formas de onda digitales a sonido analógico.

Convertir la transmisión de audio a sonido con un códec

La mayoría de las soluciones de decodificación basadas en hardware también incluirán un convertidor DAC que se puede utilizar para convertir el formato de archivo digital recibido en sonido analógico. Sin embargo, estos chips a menudo incluirán un puerto de salida I2S que permite al desarrollador agregar un códec de audio propio. Las soluciones basadas en software, sin duda, necesitarán un códec para convertir la transmisión digital decodificada en audio. Hay dos formas de hacer esto.

Primero, es posible tomar el audio digital y el periférico DAC integrado del microcontrolador y generar la salida de audio. En general, esta no es la mejor manera de producir audio porque requiere componentes discretos adicionales y un diseño y disposición de circuito analógico cuidadoso para lograr una salida de calidad. También requiere un poco más de configuración en el microcontrolador para hacer funcionar el DAC, y luego se requiere una potencia de procesador adicional para garantizar que el DAC se alimente correctamente.

El segundo método, y el que por lo general se recomienda, es usar un códec de audio integrado. Los códecs de audio son básicamente circuitos integrados que tienen todos los circuitos para generar la salida analógica, como un DAC y amplificadores de clase D. Un códec de audio tiene una ventaja sobre una solución discreta, ya que ocupa muy poco espacio en la placa y también puede tener circuitos digitales integrados para controlar la transmisión de salida de audio.

El CS43L22-CNZ DAC de Cirrus Logic proporciona a los desarrolladores una amplia gama de características como por ejemplo:

  • Control DAC a través del bus I2C.
  • Múltiples salidas, como auriculares y altavoz.
  • No se requiere el filtrado de salida externa.
  • Un motor de procesador de señal digital para control de volumen, graves y agudos.
  • Supresión de estallido y clics.

El CS43L22-CNZ recibe una transmisión de datos codificado PCM (modulación por impulsos codificados) a través de una interfaz I2S desde el microcontrolador, que luego convierte utilizando el DAC interno (Figura 6). El CS43L22-CNZ DAC puede controlar múltiples salidas, como un altavoz o un auricular. Si se usa un solo canal mono, el CS43L22-CNZ puede emitir 2 vatios de potencia a un altavoz, o si se usan canales estéreo, hasta 1 vatio por canal.

Diagrama del DAC de audio Cirrus Logic CS43L22-CNZ DACFigura 6: El DAC CS43L22-CNZ es un DAC de audio que puede generar hasta 2 vatios a través de una salida mono o 1 vatio por canal para audio estéreo. El DAC tiene un motor de procesamiento de señal digital que proporciona un control fácil de volumen, graves y agudos. (Fuente de la imagen: Cirrus Logic)

Es posible que algunos desarrolladores no necesiten todas las características del CS43L22-CNZ y puedan ahorrar algunos costos de BOM al ser más minimalistas.

Esto, por supuesto, depende de los requisitos de la aplicación, pero un buen ejemplo de este enfoque es el códec de audio AK4637EN de AKM (Figura 7). Este es un códec de canal mono de 24 bits que tiene un DAC de salida solo para un altavoz. Este códec también incluye un amplificador de micrófono, por lo que también se puede usar para grabar audio si la aplicación lo requiere.

Diagrama del DAC de audio AKM Semiconductor AK4637EN en un pequeño paquete QFN (paquete sin cables planos) de 20 pines (haga clic para ampliar).Figura 7: El AK4637EN es un DAC de audio en un pequeño paquete QFN de 20 pines que emite un solo canal de audio mono de hasta 1 vatio. El códec se puede controlar de forma digital a través del bus I2C para administrar el volumen de salida y el control de salida automático. (Fuente de la imagen: AKM Semiconductor)

Al igual que la mayoría de los códecs de audio, el AK4637EN también tiene una interfaz I2S para recibir la señal de audio digital del microcontrolador. El chip también contiene una interfaz I2C que se utiliza para controlar las funciones digitales integradas, como el control de volumen.

Al igual que con cualquier característica del producto, los desarrolladores deben tomarse el tiempo de revisar con atención los requisitos que tienen para el sistema y equilibrar las características y los costos del códec con los costos de la BOM objetivo.

Consejos y trucos para implementar una solución MP3

A continuación, se brinda una serie de “consejos y trucos” que los desarrolladores pueden usar al elegir la solución adecuada para una aplicación:

  • Realice un análisis de costos de la BOM a los volúmenes esperados entre un decodificador de MP3 externo frente a un microcontrolador más potente que pueda ejecutar un decodificador de MP3 por sí mismo. Asegúrese de utilizar cifras de volumen pesimistas, alcanzables y optimistas para establecer un rango para una mejor toma de decisiones.
  • Use un códec de audio que acepte I2S para generar el audio de salida. Las soluciones discretas pueden llevar más tiempo de sintonización y los costos de los componentes pueden ser equivalentes.
  • Realice un análisis de rendimiento en bibliotecas de software MP3 con una placa de desarrollo para comprender las características mínimas de microcontrolador necesarias para ejecutar la solución.
  • Aproveche los canales DMA para transferir cuadros decodificados de MP3 al códec de audio a través de una interfaz I2S. Esto permitirá utilizar un procesador menos costoso.
  • Revise con atención cualquier licencia de biblioteca de software de MP3 para asegurarse de que pueda usarse con un producto comercial. La mayoría de las bibliotecas de código abierto requieren una licencia paga para productos comerciales a menos que sean provistas por el proveedor del chip.

Estos consejos ayudarán a los desarrolladores a seleccionar la solución de audio adecuada para la aplicación integrada.

Conclusión

Agregar audio a un sistema integrado puede haber sido una tarea compleja, pero como se muestra, hoy en día, los desarrolladores tienen una amplia gama de soluciones entre las que elegir. Estas van desde códecs externos dedicados hasta bibliotecas de software integradas. Incluso así, los desarrolladores deben evaluar con atención las necesidades de la aplicación y determinar la vía de la solución que resulte más eficaz.

Los factores para considerar incluyen la BOM, complejidad de la solución, tiempo y costo de desarrollo e integración, junto con la escalabilidad de la solución. Una vez que estos factores se comparen con los volúmenes de productos, el costo objetivo y el cronograma de desarrollo, la solución que mejor se adapte será evidente.

DigiKey logo

Descargo de responsabilidad: Las opiniones, creencias y puntos de vista expresados por los autores o participantes del foro de este sitio web no reflejan necesariamente las opiniones, las creencias y los puntos de vista de DigiKey o de las políticas oficiales de DigiKey.

Acerca de este autor

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo es un consultor de software integrado que actualmente trabaja con clientes en más de una docena de países para transformar drásticamente sus negocios mejorando la calidad del producto, el costo y el tiempo de comercialización. Ha publicado más de 200 artículos sobre técnicas de desarrollo de software embebido, es un conferenciante y entrenador técnico muy solicitado y tiene tres títulos que incluyen una Maestría en Ingeniería de la Universidad de Michigan. No dude en ponerse en contacto con él en jacob@beningo.com, en su sitio web www.beningo.com, y suscríbase a su boletín mensual Embedded Bytes Newsletter.

Acerca de este editor

Editores de DigiKey de América del Norte