两种情况一定需要音频数据后处理。首先,要求提供丰富的聆听体验。例如,可使用立体声加宽等空间定位器(Spatializer)来消除长时间使用耳机的听觉疲劳。即使是基本的音频播放,也需要后处理。例如,音乐播放器的DAC如果仅支持有限系列采样率的情况下,可能需要对音频数据进行重新采样。
图3:均衡器框图。
我们以均衡器为例,探讨后处理器中用到的典型模块。均衡器一般是为了满足聆听者的偏好,同时也可用于校正耳机或扬声器的频响。图3所示为基本参数均衡器的高层模块分解。下列模块用于仅修改一小段音频频谱,具体做法是利用增益值、带宽和中心/截止频率的可控参数提供增益或衰减。要获得所需频响,可将多个此类二阶IIR滤波器级联。
低频(LF)斜率滤波器:一种用于修改音频频谱低音部分的滤波器
峰化滤波器:一种用于修改音频频谱中频范围的滤波器
高频(HF)斜率滤波器:一种用于修改音频频谱高音部分的滤波器
音频处理模块类别
根据特性,音频处理模块广义上分为三类。我们将详细讨论每种模块及其特性,然后进一步分析高效实现这些模块对处理器的要求。表1概述了本节所述音频处理的处理器要求。
表1:音频处理模块及其处理器要求。
MAC密集模块
这些模块属于计算密集型,主要执行乘加(MAC)运算,通常有一个预定的代码流。滤波(FIR、IIR滤波器)、窗口化、相关性及卷积等信号处理运算属于此类别的典型例子。此类模块的处理器要求稍后论述。
高精度MAC:这些模块正常工作需要高精度乘加法。例如,IIR滤波器的稳定性要求高精度运算。输出的保真度和精度直接取决于MAC指令的精度。尽管可使用低精度指令来某些仿真高精度MAC指令(例如32位乘以32位,在64位结果内累加),但最好是使用高精度MAC指令来获得高效实现。
SIMD能力:这些模块内的运算往往是少量指令的反复执行,从而产生精简循环内核。单指令多数据(SIMD)能力对于此类模块的高效执行最为理想。内置此功能的处理器更有利于处理此类模块。
饱和算法:某些运算需要使用饱和算法。例如,当在运行时产生窗口系数或在产生PCM输出数据到所需位宽时。针对饱和算术的需求可以减少,但无法完全避免,因为中间结果的位宽更高。因此,支持饱和算法的指令是高效实现的理想之选。
分支推测:这些模块有一个预定的代码流。由于这些模块需要对指令反复执行运算,简单的分支推测有利于减少因流水线清空所产生的开销。
MAC和控制代码混合模块
这些模块同样是计算密集型,但在MAC密集运算中还涉及控制代码运算。快速傅里叶变换(FFT)、滤波器组等变换运算是这一类型的典型例子。此类模块的处理器要求为:
DSP指令:由于上述两类模块(MAC密集模块和MAC和控制代码混合模块)主要涉及MAC运算,因此,如果只有MAC和MLS(乘法和减法)指令而无运算累加的开销,一定能提高效率。
混合位宽运算:运算对象的最小位宽取决于各种因素。例如,在滤波运算中,输出精度和滤波器稳定性决定滤波器系数的位宽。所以高效实现离不开能够处理混合位宽运算对象的指令。
压缩数据处理:FFT等这类模块的运算一般使用称为旋转因子的16位系数。FFT基数越高,所涉及的旋转因子越多,但相对复杂度越低。这些旋转因子可通过打包成32位数据来降低内核循环中的任何寄存器不足。或者可通过将旋转因子载入到内核循环以外的寄存器来避免重复负载的可能开销。因此,能够运算压缩数据的指令是提高效率的理想之选。
位反转:能够执行位反转的指令有利于需要位反转寻址的FFT等关键模块。
控制代码模块
这些模块主要涉及控制代码且代码流为数据依赖型。位流解复用器和熵解码运算就属于此类。例如,MP3解码器采用霍夫曼解码,而WMA解码器采用游程解码。接下来讨论此类模块的处理器要求。
无符和按位运算:这些模块需要处理打包的数据流,而这需要数据提取。因此,能够执行按位运算、提取、打包、解包的指令和能够处理无符运算对象的指令都是高效实现所需要的。
精简数据,减少占位:这些模块中的代码流主要为数据依赖型,因此不是预定的。所以,精简数据大小有助于减少缓存清空所引起的任何开销。