4.2 内联函数和内嵌汇编
MP3解码算法中定点化乘法都是通过函数调用来实现,每次调用需要开销23~28个时钟周期,其中超过15个周期用于函数调用时PC指针以及寄存器压栈保护上。采用内联函数方式(使用关键字_inline声明)或宏指令,在编译阶段代码段将被直接展开。另外armcc编译器允许在C源程序中使用内嵌汇编(但代码可移植性差),使用包括汇编的内嵌函数,可以使编译器支持通常不能有效使用的ARM指令和优化方法,例如C编译器不支持的ARM v5E扩展指令。使用内联函数结合内嵌汇编实现移位乘法,可使平均时钟周期缩短为6~8个。
4.3 ARM DSP扩展指令的运用
ARM946E处理器支持ARMDSP扩展指令,主要包括3个类型:
(1)单周期的16×16和32×16 MAC操作;
(2)对原有的算术运算指令增加了饱和处理扩展;
(3)前导零(CLZ)运算指令,提高归一化、浮点运算以及除法操作的性能。
ARM处理器不支持浮点运算,经过测试及分析,定点运算中数值的截断误差选择为28 b,其可以达到较好的解码音质,不会因为爆音过多而影响播放效果。
完成类似的乘法功能,ARM的SMULL(32×32)指令需要3个周期,而ARMDSP扩展指令SMULWT(32×16)只需要1个周期。从数据的准确性上分析,由于乘数的精度为16 b,最终结果有些差异,但由于MP3解码运算都是基于28 b的定点数值的,所以通常的运算都是一个运算结果跟某一个固定定点表中的数据相乘的。若选择固定定点表中数据的高16 b数据进行运算,运算的结果误差在1 b以内。
为了验证使用ARMDSP扩展指令的优化效果,在系统120 MHz主频下,以128 Kb/s的压缩速率进行编码测试,采用的测试文件如表4所示。
上述3个MP3测试文件的比特率均为128 Kb/s,使用这三首MP3歌曲进行解码分析结果如图3所示。
实验表明,使用ARMDSP扩展指令比使用ARM一般指令解码性能平均提高17.5%,主观听觉上音质效果无差异。
5 结 语
这里充分利用ARM946E处理器的DSP扩展指令特点提高程序代码的执行效率,对3个关键模块:Huff-man解码,IMDCT运算,合成子带滤波进行算法优化及简化处理,减少了各模块的运算量,同时从C语言和ARM汇编层次来优化代码,取得了较好的实时MP3解码效果。