如何在嵌入式系统中高效解码并播放音频文件

作者:Jacob Beningo

投稿人:DigiKey 北美编辑

音频接口日益成为嵌入式设计的期望特性。与此同时,嵌入式系统的用户对音频质量的要求越来越高。对开发人员来说,这带来了如下挑战:如何在基于微控制器的系统中运行 MP3 或其他音频文件。这些系统不仅受资源限制,而且缺少便于开发人员在 Linux 系统上使用的音频接口。因此,解码音频文件并高效地将内容转换为模拟声音,就变得更加困难。

开发人员还必须在硬件或软件解决方案之间谨慎选择,并决定使用哪些元器件,这是因为成本、空间和开发时间都是重要考虑因素。

本文介绍了 AKM SemiconductorAdafruitSTMicroelectronicsCirrus Logic Inc. 提供的几种硬件和软件解决方案,开发人员可以使用它们来高效地将音频文件添加到其嵌入式设备中。此外,本文还说明了一些“小技巧”,以帮助确保解决方案成功实施。

选择嵌入式音频格式

在深入探讨如何将音频功能集成到嵌入式设备之前,有必要仔细思考为何通常首选 MP3 音频格式。对于嵌入式系统,实际上有三种潜在音频格式可供开发人员使用:脉冲编码调制 (PCM)、WAV 和 MP3。

PCM 是一种未经压缩的无损音频格式,常由音频编解码器用来将音频流的数字表示转换为用户听到的模拟声音。这是一种广受支持的标准格式,可以追溯到 CD 年代。PCM 可以在嵌入式系统中使用,但问题是 PCM 文件通常比 WAV 或 MP3 文件大得多。在资源受限且锱铢必较的设备中,若要支持这种格式,产品可能需要更大的外部存储设备或具有更大存储器的微控制器。因此,除非产品容量低、只有一个音频文件或成本不受限制,否则通常会避免使用 PCM。

WAV 文件也是未经压缩且无损的,这方面与 PCM 非常相似。WAV 文件在嵌入式应用中往往比 PCM 文件更受欢迎,但它同样会占用大量空间。如果嵌入式系统已经有 SD 卡或其他大容量存储设备,那么 WAV 文件可能非常适合。

对于大多数系统,MP3 文件是首选音频格式。MP3 文件是有损的,因此在对音频进行编码时,可能会损失一些音频保真度。但是,MP3 远小于 PCM 或 WAV,因此将音频文件放到设备上的传输和存储时间更短,并且其对存储器的要求也更小。

一旦决定要使用 MP3,开发人员便可选择使用硬件或软件来实现。

基于硬件的 MP3 解码

最快速、最简单的解决方案通常是使用硬件 MP3 解码器,例如 Adafruit 的 1681 VS1053B(图 1)。VS1053B 可以通过串行流直接接受 MP3、WAV、OGG 或 MIDI 文件格式并进行解码,开发人员几乎不需要花什么精力。对流进行解码后,VS1053B 利用 18 位数模转换器 (DAC) 将其转换为音频。

Adafruit 基于硬件的 VS1053B MP3 解码器芯片示意图图 1:Adafruit 的 VS1053B 是基于硬件的 MP3 解码器芯片,可接收音频流并将其解码为代表性的模拟音频信号。此解决方案所需的软件最少,并且不需要开发人员了解如何解码或转换 MP3 文件。(图片来源:Adafruit)

VS1053B 真正有意思的地方是,与许多其他使用 I2C 的解码器相比,它还能通过简单的 UART 进行调试和控制。此外,它有八个通用输入/输出引脚,可用于读取位、设置开关或状态 LED 之类的应用功能。

对于希望尝试基于硬件的解决方案的开发人员,不必为 VS1053B 定制分线板。Adafruit 提供 1381 VS1053B 编解码器 + MicroSD 分线板。除 VS1053B 外,该板还有一个 MicroSD 卡插槽,可用于存储音频文件以进行解码(图 2)。分线板可连接到微控制器,后者通过 SPI 或 SDIO 端口连接到 SD 卡以读出音频文件。音频文件流随后传送到 VS1053B 进行解码。然后,可以根据需要将 VL1053B 的输出导向耳机插孔或扬声器等。

Adafruit 的 1381 VS1053B 编解码器 + MicroSD 分线板的图片图 2:Adafruit 的 1381 VS1053B 编解码器 + MicroSD 分线板包含必要的硬件,可轻松连接微控制器以播放音频。分线板上有一个板载 MicroSD 卡插槽,微控制器可以通过 SPI 读取卡内容,然后将文件传输到 VS1053B 进行解码。(图片来源:Adafruit)

基于软件的 MP3 解码

一种稍微复杂一点但从物料 (BOM) 角度看成本常常更低的解决方案,是在微控制器上解码 MP3 文件,然后将解码后的文件流式传输到音频编解码器以生成音频。为了实施基于软件的高效解决方案,开发人员需要实现若干关键组件,例如:

  • MP3 解码器库
  • 存储驱动程序
  • 文件系统堆栈
  • 直接存储器访问 (DMA) 驱动程序
  • I2S 驱动程序
  • I2C 驱动程序
  • 音频编解码器驱动程序

乍看之下,软件开发人员似乎有大量工作要做,需要集成许多具有挑战性的软件组件以将 MP3 解码并转换为音频。实现 MP3 解码解决方案的最佳办法是利用一个支持音频编码、解码和常规处理的微控制器平台。

尽管可以在互联网上找到许多开源解决方案,但 STM32 工具链是开发人员可以利用的专业可靠、久经考验的解决方案。STM32 微控制器系列有一个称为 STM32CubeMx 的开发工具,其与 STM32CubeIDE 集成在一起,后者包含音频示例和开发库。这些示例和工具是 STM32CubeMX 附加插件(称为 X-CUBE-AUDIO)的一部分。该插件为 Arm Cortex-M4 类微控制器中的所有 STM32 处理器提供了用于 MP3 解码的音频库。

具体来说,它有一些代码项目示例可用于创建能在 STM32F469IGH6TR 微控制器上运行的 MP3 播放器。STM32F469IGH6TR 是一款功能强大的微控制器,具有 1 兆字节 (MB) 的闪存和 384 KB 的 RAM,运行速率为 180 兆赫兹 (MHz)。该微控制器采用 176 引脚 UBGA 封装,提供了大量 GPIO 和外设特性,支持几乎所有应用。

STMicroelectronics 的 STM32F469IGH6TR 是一款 180 MHz Arm Cortex-M4 处理器的示意图图 3:STM32F469IGH6TR 是一款 180 MHz Arm Cortex-M4 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。176 引脚 UBGA 封装提供了大量 GPIO,支持几乎所有嵌入式应用。(图片来源:STMicroelectronics)

MP3 播放器代码示例运行在 STM32F469I-DISCO Discovery 套件上(图 4)。STM32F469I-DISCO 包含 MP3 解码和播放所需的一切功能。该板有一块 4 英寸 800 x 480 像素 LCD,用于将当前 MP3 演示状态告知开发人员,另外还提供了播放、停止、下一首、上一首等播放器控件。此外,Discovery 板还含有耳机插孔,能以立体声方式播放所产生的音频。关于示例代码,唯一需要注意的是 MP3 文件须由外部提供,具体来说是由 USB 驱动大容量存储设备提供,其通过 micro USB 连接器连接。

STMicroelectronics 的 STM32F469I-DISCO Discovery 套件图片图 4:STM32F469I-DISCO Discovery 套件有一个 4 英寸 LCD,用于操作 MP3 播放器演示。音频文件由外部 USB 大容量存储设备通过板载 Micro USB 连接器提供。它提供了一个解码 MP3 文件的实际范例。(图片来源:STMicroelectronics)

虽然 MP3 解码库确实需要 Arm Cortex-M4 或更好的处理器,但事实证明,在开发板上运行演示代码是一种很好的方式,不仅可以查看和试验实际范例,而且还能验证应用性能。使用串行线调试 (SWD) 接口和 Arm 内核的仪器跟踪宏单元 (ITM) 功能,可以对程序计数器执行统计分析,确定大约需要多大处理能力来解码并播放 MP3 文件。结果是,将近 50% 的 CPU 时间用于更新 LCD 显示,而 10% 或更少的时间用于 MP3 解码。STMicroelectronics 的音频库非常有效,其使用 DMA 将 I2S 上的解码帧推送到音频编解码器。

如果应用不需要 LCD,仅需要基于其他系统事件来播放音频,那么可以使用功能较少的处理器。例如,开发人员可以看看 STM32F469VGT6。STM32F469VGT6 仍然非常强大,具有 1 MB 的闪存和 384 KB 的 RAM,全部位于 100 引脚 LQFP 中。该器件没有使用 BGA 封装,该封装有时可能会让开发人员和制造商望而却步。

STMicroelectronics 的 STM32F469VGT6 180 MHz 处理器(带 1 MB 闪存)的图片图 5:STM32F469VGT6 是一款 180 MHz 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。该器件基于 Arm Cortex-M4 系列,由 STMicroelectronics 音频库支持。如图所示,它采用 100 引脚 LQFP 封装,这会让开发人员和制造商没那么望而却步。(图片来源:STMicroelectronics)

开发人员选定并试用了他们认为最适合其应用的解决方案之后,就需要决定如何将解码的 MP3 文件从数字波形转换为模拟声音。

利用编解码器将音频流转换为声音

大多数基于硬件的解码解决方案还会包括一个数模转换器 (DAC),用于将接收到的数字文件格式转换为模拟声音。但是,这些芯片通常包含 I2S 输出端口,允许开发人员添加自己的音频编解码器。基于软件的解决方案肯定需要编解码器,才能将解码的数字流转换为音频。有两种方法可以完成此任务。

第一种方法是可以获取数字音频,利用微控制器的板载 DAC 外设生成音频输出。一般而言,这不是生成音频的最佳方法,因为它需要额外的分立元器件以及精心的模拟电路设计和布局,才能获得高质量输出。此外,微控制器上也需要进行更多设置才能让 DAC 正常运行,而且一般还需要额外的处理器电源以确保 DAC 获得适当的供电。

第二种方法(一般推荐采用这种方法)是使用集成的音频编解码器。音频编解码器基本上是集成电路,具备所有用于生成模拟输出的电路,例如 DAC 和 D 类放大器。相比于分立解决方案,音频编解码器的优势在于占用的电路板空间非常小,而且还能内置数字电路来控制音频输出流。

举例来说,Cirrus Logic 的 CS43L22-CNZ DAC 为开发人员提供了广泛的功能,例如:

  • 通过 I2C 总线执行 DAC 控制
  • 多路输出,例如耳机和扬声器
  • 无需外部输出滤波
  • 数字信号处理器引擎,用于音量、低音和高音控制
  • 滴答和噼啪噪声抑制

CS43L22-CNZ 通过 I2S 接口从微控制器接收 PCM 编码的数据流,然后使用其内部 DAC 进行转换(图 6)。CS43L22-CNZ DAC 可以驱动多路输出,例如扬声器或耳机。如果使用单个单声道,CS43L22-CNZ 可以向扬声器输出 2 W 功率;如果使用立体声声道,则每个声道最多为 1 W。

Cirrus Logic 的 CS43L22-CNZ DAC 音频 DAC 示意图图 6:CS43L22-CNZ DAC 是一种音频 DAC,可通过单声道输出最高 2 W 的功率,或以立体声音频输出每通道 1 W 的功率。该 DAC 具有一个数字信号处理引擎,可轻松控制音量、低音和高音。(图片来源:Cirrus Logic)

一些开发人员可能不需要 CS43L22-CNZ 的全部功能,可以通过精简来节省一些 BOM 成本。

当然,这取决于应用的要求,但这种方法有一个很好的例子,那就是 AKM 的 AK4637EN 音频编解码器(图 7)。这是一款 24 位单声道编解码器,其输出 DAC 仅用于扬声器。该编解码器还有一个麦克风放大器,如果应用需要,它也可以用来录制音频。

AKM Semiconductor 采用 20 引脚 QFN 小型封装的 AK4637EN 音频 DAC 的示意图(点击放大)图 7:AK4637EN 是采用 20 引脚 QFN 小型封装的音频 DAC,可输出最高 1 W 的单声道音频。该编解码器可通过 I2C 总线以数字方式进行控制,以管理输出音量和自动输出控制。(图片来源:AKM Semiconductor)

同大多数音频编解码器一样,AK4637EN 也有 I2S 接口,用以接收来自微控制器的数字音频信号。此外,该芯片还有 I2C 接口,用于控制板载数字特性,例如音量控制。

与任何产品功能一样,开发人员需要花时间仔细检查其对系统的要求,并在编解码器特性和成本与目标 BOM 成本之间取得平衡。

实现 MP3 解决方案的技巧与诀窍

开发人员在为应用选择适当的解决方案时,可以使用以下“小技巧”:

  • 以预期的生产量执行 BOM 成本分析比较:一种情况是使用外部 MP3 解码器,另一种情况是使用功能更强大的、能够自行运行 MP3 解码器的微控制器。务必使用悲观、可达成和乐观三种生产量数字来确定更好的决策范围。
  • 利用支持 I2S 的音频编解码器生成输出音频。分立解决方案的调整可能更耗时,而元器件成本可能相当。
  • 使用开发板对 MP3 软件库进行性能分析,以了解解决方案运行所需的最低微控制器特性。
  • 利用 DMA 通道将解码的 MP3 帧通过 I2S 接口传输到音频编解码器。这将支持使用较为便宜的处理器。
  • 仔细检查 MP3 软件库许可,确保它们可与商业产品一起使用。除非是芯片供应商提供,否则大多数开源库用于商业产品时都需要付费许可证。

遵循以上提示将有助于确保开发人员为其嵌入式应用选择正确的音频解决方案。

总结

为嵌入式系统增加音频功能曾经是一项复杂的工作,但是如本文所示,如今的开发人员有大量解决方案可供选择:既有专用的外部编解码器,也有集成的软件库。尽管如此,开发人员仍需要仔细评估应用需求,确定哪种解决路径最合理。

需要考虑的因素包括:BOM,解决方案的复杂性,开发和集成的时间与成本,以及解决方案的可扩展性。一旦对照产品批量、目标成本和开发计划权衡上述因素,最合适的解决方案就会变得清晰起来。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑