基于ARM处理器的AAC音频解码算法优化和仿真
2018-07-12林飞成都东软学院实验实训中心
林飞 成都东软学院实验实训中心
引言:2017年5月互联网上一则关于“MP3格式宣告死亡”的新闻[1]引起热议,当民众熟悉的MP3格式面临退出历史舞台之时,它的最有力继任者AAC音频格式逐步引发关注。其实,早在1999年MPEG组织便制定了ISO/IEC14496标准[2](俗称MPEG4标准)。MPEG4_AAC 作为ISO/IEC 14496 part 3中的一部分于2000年公布初版,最近一个版本更新到2009年。
对于MPEG的音视频标准,ISO/IEC都公开提供标准C语言的参考软件,另外,其他组织也有相应的开放源码项目。而对于嵌入式系统而言,当前主要是ARM处理器,和基于x86处理器的PC平台相比,在性能和各种硬件资源上非常受限。因此这些参考软件代码能够根据嵌入式ARM处理器做一定优化,比如通过利用ARM处理器新增的DSP扩展指令完成常规的数字信号处理运算,则可以大大节省常规指令的低效率调用时间。解码函数调用时间的缩短,有利于终端设备节省宝贵的电池资源,也有利于APP程序的用户流畅体验。
本文将以Audio Coding组织开发的FAAD工具包(Open Source项目)为基础来实现AAC音频解码算法优化,并在ARM公司官方的仿真工具上提供分析和结论。
1 AAC音频解码算法概述
AAC音频编解码系统算法借鉴了MP3感知编码的成功经验,也以心理声学模型运用为主,通过添加新的工具集,使得其具备了相当的灵活性。下图给出了典型的AAC音频解码流程图。
图1 AAC的解码流程图
其中,粗箭头部分代表音频码流,细箭头代表编码器控制信息。TNS即瞬时噪声成形,用于控制编码噪声的细微时间结构。滤波器组利用M=4的多相正交滤波器(PQF)划分为四个等宽的子带,完成对输入码流的IMDCT变换,从时域转为频域。M/S工具用于提高编码效率,在M/S判决信息控制下,把中/边(Mid/Side)声道的一对输出频谱转至左/右(L/R)声道。熵编码应用Huffman编码及其指定Huffman表。
从上述AAC的解码过程不难看出,解码算法工作量主要集中在滤波器组IMDCT变换数学运算部分,本文将阐述这个部分的算法优化思路,以及基于ARM处理器仿真工具的软件实现。
2 反滤波器组IMDCT运算优化
反滤波器组运算是由IMDCT(Inverse Modified Discrete Cosine Transform改进的离散余弦反变换)完成的,由ARMulator仿真数据可以看出它要占整个AAC解码过程中一半以上的运算量。因此很有必要对IMDCT做重点优化。近年来国内外对IMDCT的快速算法研究比较多,这些快速算法普遍利用了IMDCT和IDCT的密切关系,要么直接用快速DCT变换,要么利用FFT来计算,在窗函数处理上都是相似的,它们的运算复杂度也相差不大。由于在AAC标准中,窗长均是2的幂,且FFT算法相当成熟,比较适合ARM处理器上实现,故选择Duhamel & Mahieux[3]提出的快速MDCT/IMDCT算法作为本文研究对象。
为叙述方便,这里免去该算法的理论推导,直接给出该算法的简单计算步骤:
1.预运算
预运算的目的是对频域数据进行一定的处理,使之可以直接利用FFT运算;
2.IFFT
直接利用一般的IFFT运算,对于不同的处理器架构可以选择不同的实现方式;
3.后运算
后运算将IFFT后的数据再进行适当缩放,再将实部和虚部分开,得到对应的时域数据。
在MP3标准中,对MDCT规定了两种窗长,即长窗为36点,短窗为12点。由于这两种窗长都不是2的幂,故一般的快速MDCT算法都采用基3 FFT来计算。另外,MP3标准对窗函数只规定了正弦窗,使得这些算法采用了正弦窗函数的对称性来减少计算量。
在AAC标准中,MDCT还是两种窗长,不过长窗为2048点,短窗为256点。两种窗长都是2的幂,但不是4的幂,一般的快速算法采用基2 FFT[4]来计算。采用基2和基4的组合构成的分裂基计算可以获得更好的性能,但由于其特殊的结构不利于ARM汇编语言快速实现。因此可以对长窗仍采用基2 FFT(512点)运算,而对于短窗可以采用效率更高的基4 FFT(64点)运算。
值得说明的是在AAC标准[2]中也允许对小帧长的支持,这样长窗为1920点,短窗为240点,这些数值非2的幂不能套用上面的算法。此外这将会增加程序兼容性的负担。
ARM处理器在ARMv5TE架构开始就加入了DSP增强扩展指令,下面给出了ARMv5TE架构下利用汇编宏函数实现复数乘法的示例:
图2 32×16位单周期乘法指令应用示意
3 仿真结果和分析
仿真工具为ARM公司的开发工具ARMulator[5](指令集仿真器),包含于ADS(ARM Developer Suite)集成开发环境中。ARMulator不仅可以仿真ARM处理器的体系结构和指令集,还可以仿真Cache,MMU,存储器甚至某些外围设备,ADS软件包内提供了这些参考模块,另外开发者还可以通过规范编写用户模块。ARM公司当前流行的开发工具RealView包含一个类似的指令集仿真器(Instruction Set Simulator),两者提供的功能是相同的,因此不再赘述。本文用到的仿真结果包括统计(Statistics)信息和剖析(profiling)信息,前者用于数据流和功耗估计,后者用于算法和编程优化。
ARMulator比较可取的地方是能够完整执行整个解码软件程序,从测试文件输入到生成输出文件。测试文件为AAC文件,输出文件为WAV文件,便于音质(误差)的定量分析。
图2可以看到负荷最重的IMDCT模块在优化后占用时间由37.35%降到16.93%,而使得其他模块的占用时间相对上升(例如Huffman相对略有抬升),但绝对解码时间明显缩短了。
图3 算法优化剖析信息对比
通过上面的分析我们可以对IMDCT模块优化前后在ARMulator中获取更详细的Statistics信息。在测试例中分别对长窗(N=2048)和短窗(N=256)的FFT变换做比较。基4 FFT汇编优化方法得到的性能提升是显著的,在指令周期上节省了50%的运算量,而堆栈大小同时也缩小了,指令数减少使得间接提高了Cache命中率。Cache行填充次数的显著减少使得外部存储器访问频率大大降低,速度功耗比得到了显著增强。
4 结束语
随着消费类电子软硬件技术的飞速发展,更高品质的音频会带给用户更好的体验。而当前不断涌现更新的音频编解码算法,对于资源受限的嵌入式系统而言,需要更高效的软件算法和优化手段。本文对AAC音频解码运算中耗时最多的三个模块的快速算法实现和优化的问题。通过ARM软件系统的仿真,相比普通解码软件实现,本优化实例节省了20%左右的解码时间,对ARM处理器在嵌入式数字信号处理领用有一定借鉴意义。