基于晶心科技 Andes 平台的 MP3 移植

Facebook
Twitter
LinkedIn

晶心科技 (Andes)作为亚洲首家原创性 32 位微处理器 IP 与系统芯片开发平台的设计公司,面向 32 位市场推出了 Andes Core N9,N10,N12 三个系列低功耗高性价比的 32 位处 理器软硬核 IP。基于各系列处理器,晶心科技针对不同音频应用提供了多种解决方案。其中包括将多种音频格式的编、解码器(开源),例如 MP3、AAC、WMA、G729 等移植到 Andes 平台上。并且利用 nds32(基于 Andes Core)架构的优势和针对音频效能的扩展指令集,以及算法上的改进,对这些编解码器做了进一步的优化,使其不仅占用的空间较小而且具备了较高的运行性能。本文以 MP3 解码器为例,介绍如何将 madplay 移植到 Andes 平台,以及晶心科技基于 N903A 处理器提供的 MP3 解决方案。

1. MP3 简介
MPEG-1 Audio Layer3(简称 MP3)是一种有损音频编码方式,它利用掩蔽效应(一 种心理声学模型),将脉冲编码调制(Pulse Code Modulation)音频数据中人耳听觉系统无法察觉的那部分数据去掉,使得 MP3 能够在音质丢失很小的情况下把音乐文件压缩到很小的程度(1:10 甚至 1:12 的压缩率)。因为其体积小、音质高的特点,MP3 已经成为当今最为流行的音频格式。madplay 是目前使用较为广泛的一种 MP3 的解码器,下面将详细介绍如何使用 Andes 提供的 AndeSight 集成开发工具将 madplay 移植到 Andes 平台。

2. 环境及软件介绍
2.1 系统环境:
Linux:Fedora8

2.2 开发环境:
AndeSight1.4
AndeSight 是晶心科技提供的一种基于 nds32 架构开发嵌入式工程的图形化的集成开发环境。主要由 AndeSight IDE, AndESLive 和 nds32 工具集 3 个部分组成。
AndeSight IDE 为工程师提供了各种友好的界面,包括对嵌入式工程做编辑,编译,运行,调试或者评测等等操作。
AndESLive 提供了基于 nds32 架构的仿真器和一种图形化的虚拟 SoC 构建模型,它与 AndeSight IDE 相结合为用户提供了一个虚拟的硬件平台。这个虚拟评估平台提供 Andes 自行定义 ISA 的多组系列 32 位 CPU IP 以及各种外围设备 IP,并且支持用户自定义 IP 模型。
AndESLive 配合 AndeSight IDE 不仅使得 SoC 设计者能在计划初期就开始软件设计、侦错、最优化等工作,并对系统架构及功能进行检验,而且使硬件工程师和软件工程师具有一样的能力去制作和修改他们各自的系统模型,可以有效的控制 NRE(NonRecurring Engineering)成本,让软件工程师在拿到硬件原型之前,即可以进行软件的开发和优化。
nds32 工具集提供了一套在 Andes 平台上开发嵌入式应用程序所需要的标准工具,例如编译器、调试器、链接器等等。

2.3 交叉编译器:
nds32le‐linux‐gcc。
nds32 工具集中对应不同的 Andes Core 型号,不同的系统函数库以及大小端形式等条件,提供了各种对应的交叉编译器。这里我们选用 nds32le-linux-gcc。

2.4 软件包:
除了源码外,madplay 还需要 MP3 的解码库 libmad,以及 zlib 和libid3tag 来正确的读取 MP3 头段信息。这四个软件包都可以在开源网站上获得。其中,madplay‐0.15‐1b.tar.gz、libmad‐0.15.1b.tar.gz、libid3tag‐0.15.1b.tar.gz 可以在http://sourceforge.net/project/showfiles.php?group_id=12349 獲取,zlib‐1.2.4.tar.gz 可以在http://zlib.net/獲取。

3. Madplay 的移植
3.1 编译函数库
3.1.1 编译 libmad庫
进入 libmad 目录,首先将如下 nds32 架构和目标平台运行环境的信息加入到配置文件config.sub 中(可加到第 675 行):
nds32*)
                basic_machine=nds32‐linux os=‐
                linux
                ;;
然后依次执行:
#CC=nds32le‐linux‐gcc ./configure ‐‐prefix=$PREFIX/MP3_Decoder ‐‐host=nds32‐linux
‐‐disable‐debugging ‐‐disable‐shared
#make
#make check
#make install
编译成功后,可以在$PREFIX/MP3_Decoder($PREFIX 是用户设定的路径)目录下的included 和lib 目录里找到相应的.h 文件和.a 文件。

3.1.2 编译 zlib 和 libid3tag
需要先编译 zlib。进入 zlib 目录后,依次执行:
#CC=nds32le‐linux‐gcc ./configure ‐‐prefix=$PREFIX/MP3_Decoder
#make
#make install
然后编译 libid3tag。先将 nds32 架构信息加入到文件 config.sub 中(方法同 libmad),然后执行如下命令,编译 libid3tag 时需要用到编译 zlib 生成的头文件和库文件:
#CC=nds32le‐linux‐gcc ./configure ‐‐prefix=$PREFIX/MP3_Decoder ‐‐disable‐debugging
‐‐disable‐shared CPPFLAGS=”‐I/tmp/MP3_Decoder/include” LDFLAGS=”‐L/tmp/MP3_Decoder/lib”
‐‐host=nds32‐linux
#make
#make install
同样,在编译成功后 libid3tag 的相关文件也保存在$PREFIX/MP3_Decoder 目录下面。

3.2 在 AndeSight 中生成 madplay
在进入 AndeSight 图形化集成开发环境之前,需要先对 madplay 源码中的 makefile 进行配置。首先同样需要将 nds32 架构信息加入到 config.sub 文件中,然后执行如下配置:
#CC=nds32le‐linux‐gcc ./configure ‐‐disable‐debugging ‐‐disable‐shared ‐‐host=nds32‐linux CPPFLAGS=”‐I$PREFIX/MP3_Decoder/include ‐lmad ‐lid3tag ‐lz” LDFLAGS=”‐L$PREFIX/MP3_Decoder/lib”
‐‐prefix=/Andestech/AndeSight14/ide/workspace/MP3decoder_madplay
接着打开 AndeSight v1.4,建立一个 STD C(标准 C)工程 mp3decoder,并将madplay目录下的所有文件导入工程中。选择 Project 菜单栏选择 Build Project 一项,成功进行编译和链接后,在指定的目录下就会生成 madplay 的可执行文件,如图 1 所示。这样 madlpay 就成功移植到 Andes 平台上了。

3.3 测试与验证
为了验证移植的正确性,这里我们采用在虚拟的 Andes 硬件平台上运行的方式,也就是在 AndeSight 中通过 AndESLive 提供的虚拟 SoC 平台进行仿真。这里选用 Andes_demo.vep这个虚拟开发平台,它与真实的 Andes demo 开发板是一样的。
选取一首 MP3 格式的歌曲“test.mp3"拷贝到工程 mp3decoder 的目录下,然后在运行视窗的 Arguments 选项中加入指定输入文件和输出的文件的格式:
‐‐output=wave:PATH1/test.wav PATH2/test.mp3(输出格式还可以为.pcm)。

图 2 在虚拟 SoC 平台上运行madplay

这里 madplay 运行在虚拟开发平台的 linux 环境下在虚拟开发平台上运行 madplay。运行结束后,在工程目录下会看到“test.wav"文件,如图 2 所示。这个文件可以在 Windows Media Player 进行播放,这样就验证了 madplay 移植到 Andes 平台上的正确性。如果希望 madplay 运行在无操作系统的环境中,只需对 madplay 的源代码做一些修改(处理与系统调用相关的函数),然后使用 nds32le-elf-gcc 这款交叉编译器进行编译即可。

4. 晶心科技在 MCU 层级的 mp3 解决方案
随着人们对于音频电子产品功能的需求越来越高,8 位及 16 位 MCU 逐渐向 32 位 MCU转型已经成为市场趋势。晶心科技基于 Andes Core N903A 处理器对 MCU 层级的音频应用提供了全方位的解决方案,包括硬件平台和软件包支持。图 3 展示了晶心科技提供的完整的音频开发平台。

图 3 晶心科技提供的音频开发平台

考虑到从 8 位 MCU 升级到 32 位带来的硬件成本的增加,晶心科技推出了 N903A 低功耗高性价比的 32 位处理器。N903A 提供了完全可配置的处理器 IP 核,包括可配置的 I/D cache 大小,I/D local memory 大小,GPR 数量,硬件乘法器等等。这样,客户可以根据自己产品的需求,以最小的硬件成本获得较 8 位系统更为优化的系统性能。在指令方面,N903A不仅包含了晶心科技自主知识产权的一套高效指令集,而且加入了为提高音频数据处理能力而特别设计的四十余条音频扩展指令。另外,针对现有及可预期未来的大多数软硬件应用特性,晶心科技还提供一种 16bit/32bit 混合指令集形式,在提供功能之余,缩小了程序所需的内存空间,从而进一步实现降低成本的效益。

软件方面,晶心科技同样提供了全方面的支持。包括操作系统、设备驱动、开发工具、中间件、函数库以及上层的各种应用程序。对于 MP3 的编解码器,晶心科技对其代码大小做了进一步的优化,并利用 nds32 架构的优势以及音频扩展指令集,使其在 Andes 平台上运行的性能达到很高的水平。以 48KHz/128Kbps 的 MP3 歌曲为例,晶心科技优化的 madplay解码器正朝着 10MHz 的工作频率迈进。表 1 为晶心科技优化的 MP3 编解码器在 N903A 处理器上运行的结果。