一种AAC或MP3解码器中的反量化方法
技术领域
本发明涉及音频压缩算法领域,特别是涉及一种AAC或MP3解码器中的反量化方法。
技术背景
AAC(Advanced Audio Coding)是ISO MPEG组织在MPEG-2压缩标准中制定的一项新的音频压缩算法,后来在MPEG-4标准对该算法进行了进一步的增强。AAC同MP3算法不是互相兼容的,同MP3算法相比,AAC采用了一些新的编码工具,因此在相同的压缩质量下,AAC比MP3的压缩比更高。当在硬件设备上实现AAC解码器时,由于功耗和成本的原因,通常设备只支持定点操作,不支持浮点操作。图1给出了AAC解码器的结构图,当在定点设备上实现解码器时,由于AAC解码器中的反量化公式中涉及非线性函数,定点设备并不支持这些非线性函数,因此需要寻找快速的定点实现。
通常,AAC解码器中的反量化采用一种非线性的浮点量化策略。其中,AAC解码器中的量化公式为:
Xquant(k)=sign(X(k)).int{(|X(k)·21/4·(scf-globalgain))3/4+MAGIC_NUMBER} (1)
其中xquant(k)表示量化后的谱系数;
x(k)表示量化前的谱系数;
scf和globalgain分别是尺度因子和全局增益因子;
MAGIC_NUMBER定义的是常数0.4054。
AAC解码器中的反量化公式为:
Xinquant(k)=sign(Xquant(k))·|Xquant(k)|4/3·21/4·(gloabalgain-scf) (2)
其中xinquant(k)表示重建的谱系数;
xinquant(k)同X(k)的差异称之为量化误差。
由反量化公式(2)可见,这里涉及两个非线性的幂操作。一个是|Xquant(k)|4/3,其中|Xquant|的范围0~8191;另一个是21/4·(globalgain-scf)。当需要在定点DSP上实现AAC解码器,由于定点设备并不支持这些非线性的浮点操作。我们通常需要采用以下几种方式对上述非线性的幂操作进行处理:
(1)查找表法(lookup table):用一张表保存着这些数学函数f(x)在各个离散点的函数值。此方法的缺点是,消耗太多的内存。优点是,节省计算量。这方法比较适合自变量动态范围不是很大的情况。
(2)查找表+插值法(interpolated LUT):相对于方法1,用一张小表保存少数离散点的函数值,如果函数自变量的值落在表中的两点之间,则采用插值的方法。此方法是在内存和计算量之间的折衷,缺点是插值精度较差。
(3)多项式近似(Polynomial approximation):使用x的幂级数近似非线性的函数。如:
f(x)=a0+a1·x+a2·x2+a3·x3+a4·x4+... (3)
多项式近似的优点在于:
(1)适合并行计算结构,特别适合支持SIMD(single instruction multiple data)或是MIMD(multiple instruction multiple data)
(2)很小的内存开销。只需保存多项式系数。
(3)具有理论基础的。Weierstrass近似理论:
如果f:[a,b]→R是定义在闭区间[a,b]的一个连续函数, 则存在一个多项式函数Pε(x),使得|f(x)-Pε(x)|<ε x∈[a,b]
多项式近似缺点在于:当多项式的阶数较高时,计算开销较大。
因此,亟待提出一种更优的计算反量化公式中的非线性函数的方法。
发明内容
有鉴于此,本发明的目的在于提出一种结合查找表法和多项式近似两种方法的AAC或MP3解码器中的反量化方法。
为了达到上述目的,本发明提供一种AAC或MP3解码器中的反量化方法,其包括:
步骤一,统计码流中,量化的谱系数的分布概率;
步骤二:在量化的谱系数出现概率相对集中的[0,B]范围内,对反量化中的非线性函数采用查表法来计算,其中B点的值可以根据用户的要求设定;
步骤三:在谱系数出现概率相对非集中的[B~8191]范围内的,对反量化中的非线性函数通过多项近似来计算。
优选的,所述非线性函数为P(x)=X4/3,其中X为量化的谱系数,且0≦X≦8191。
优选的,其特征为:所述反量化公式是AAC解码器中的反量化公式或是MP3压缩标准中使用的反量化公式。
进一步优选的,设定B点的值时需要考虑的因素包括幂函数值Y的精确度、需要储存的谱系数X的个数及出现在[0,B]范围内的谱系数X概率。
进一步优选的,B点的值的范围确定为[13,17]。
进一步优选的,B点的值为15。
进一步优选的,步骤三中对非线性函数通过多项式近似来计算具体包括:
a:根据对精度和计算量的要求,确定多项式及多项式的阶数和系数;
b:根据确定出来的多项式计算出非线性函数的值。
进一步优选的,步骤a中采用minimax polynomial法来获得多项式,。
进一步优选的,采用Remez算法来计算P(x)=x4/3函数的minimax多项式,当多项式的阶数为6时,X的区间选取为[0.5,1]时,多项式系数为a[7]={-0.014840828668,0.503176802784,0.879620120995,-0.649533912857,0.417397714480,-0.164851058049,0.029031186561}
对应的多项式为:
P(x)=a[0]+a[1]·x+a[2]·x2+a[3]·x3+a[4]·x4+a[5]·x5+a[6]·x6。
进一步优选的,步骤b可分为以下几步计算:
B1.将多项式的系数采用Q31的定点数来表示;
B2.将自变量X的范围由[16,8191]归一化到[0.5,1]区间,得到新变量X′;X′=X.2N
N为X中除了最高位的符号位外,剩余的符号位的个数。N值的计算可用定点DSP的专用指令完成。乘法可用移位操作完成。此时得到的X′为Q31的定点数;
B3.利用多项式P(x)来计算P(X′);
B4.由X′的幂值P(X′)来恢复X的幂值X4/3
本发明提出结合查找表法和多项式近似来计算AAC解码器的反量化中的非线性函数,可以在内存消耗很小的前提下,既保证很少的计算量,同时又能保证很高的精度。
附图说明
图1是现有技术中AAC解码器的结构图。
具体实施方式
由公式(2)可以知道,在AAC反量化公式中涉及两个非线性函数,一个是|Xquant(k)|4/3,其中|Xquant|的范围0~8191;另一个是21/4·(globalgain-scf)。其中21/4*x函数的计算比较简单,可采用下面方法计算:
Y=21/4*x
采用浮点量化的策略,将Y的结果表示成两部分:尾数部分Yfract(|Yfract|≤1,采用二进制的小数表示)和2的指数部分Yexp(采用二进制的整数表示),则
通常我们只需要将20/4,21/4,22/4,23/4这四个指数值保存到表中table[4](数组下标从0开始),当x采用二进制补码表示时,Yfract=table[x & 0x3],Yexp=x>>2.例如:
2^(4/4)=2^(1)*2^(0/4)
2^(5/4)=2^(1)*2^(1/4)
明显这种方法实现只需保存四个指数值,所涉及的计算量也很小,只有一个查表操作,一个“位与”操作和2个移位操作。
针对AAC反量化公式中非线性x4/3函数(x∈[0,8191]的整数)的计算,本发明提出结合查找表法和多项式近似来计算AAC解码器的反量化中的非线性函数,可以在内存消耗很小的前提下,既保证很少的计算量,同时又能保证很高的精度。此外,由于AAC和MP3采用类似的量化策略,本发明提出的方法也适用于MP3解码器的反量化中非线性函数的计算。
下面以AAC反量化公式中非线性x4/3函数为例,来说明本发明计算反量化公式中的非线性函数的方法,其包括如下步骤:
步骤一:统计AAC码流中,量化的谱系数X的分布概率以及采用32位定点数(1位符号位)来保存幂函数值Y时的精度,其中Y=X4/3。
下表中统计了AAC码流中,量化的谱系数X的分布概率以及采用32位定点数(1位符号位)来保存幂函数值Y时的精度。
X的范围 | Y的范围 | X值出现的概率 | 定点表示Y的小数点位数 | 定点表示Y的精度 | 保存定点数Y的存储量(Word) |
0~15 | 0~37 | 99.74% | 25 | 3 x 10<sup>-8</sup> | 16 |
0~31 | 0~98 | 99.88% | 24 | 6 x 10<sup>-8</sup> | 32 |
0~63 | 0~251 | 99.94% | 23 | 1 x 10<sup>-7</sup> | 64 |
0~127 | 0~639 | 99.96% | 21 | 5 x 10<sup>-7</sup> | 128 |
0~255 | 0~1618 | 99.98% | 20 | 1 x 10<sup>-6</sup> | 256 |
0~8191 | 0~165113 | 100% | 13 | 1 x 10<sup>-4</sup> | 8192 |
步骤二:在X出现概率相对集中的[0,B]范围内,对非线性x4/3函数采用查表法来计算,其中B点的值可以根据用户的要求设定。该步骤具体如下:
从表中谱系数X的分布可以看出,量化后的谱系数X大部分分布在[0~15]范围内,因此在谱系数X的[0~15]范围内即B为15时,对非线性x4/3函数采用查表法来计算。此时,只需在表中保存16个谱系数X的幂值Y,由于大部分的谱系数的幂值可以通过查表来获得,因此这种策略在大量节省内存的情况下,计算量也没有大的增加,同时有能保证很高的精度。需要注意的是,由于B值得选取可以影响幂函数值Y的精确度、需要储存的谱系数X的个数及出现在[0,B]范围内的谱系数X概率,所以,在其他的是实例中,一般可以根据用户对上述因素的要求在15附近选取B值,比如13、14、16、17等。
步骤三:在谱系数X出现概率相对非集中的[B~8191]范围内的,对非线性x4/3函数可以通过多项近似来计算。
下面介绍如何通过多项式近似来计算Y=X4/3,步骤一的特定实施例中B取值15,所以此步骤X属于[16,8191]区间上的整数。
步骤a:根据对精度和计算量的要求,确定多项式的阶数和系数。
从实现角度考虑,一方面我们希望多项式的阶数越小越好,这样既可以减少需要保存的多项式系数{ai},同时也可以节省计算量;但另一方面我们希望多项式近似的精度越高越好;因此我们需要寻找一组多项式系数{ai},希望在最小阶数下保持最大的精度。在实际应用中,我们通常寻找满足给定精度准则(accuracy criterion)下具有最小阶数的多项式。通常采用的几个精度准则有:
(1)最小化最大的绝对误差(Minimize maximum absolute error)
(2)最小化平均的绝对误差(Minimize mean absolute error)
(3)最小化均方误差(Minimize mean squared error)
在实际应用中,一般要考虑最坏情况下的近似误差,因此通常采用精度准则1,即最小化最大的绝对误差。通常把这种方法获得多项式近似称之为minimaxpolynomial法。
在一个特定的实施例中,采用Remez算法来计算P(x)=x4/3函数的minimax多项式。Remez递推算法的交错点初值选取的是切比雪夫多项式(Chebyshev)的交错点。当多项式的阶数为6时,X的区间选取为[0.5,1]时,最大绝对误差为2.6x10-8。此时的多项式系数为
a[7]={-0.014840828668,0.503176802784,0.879620120995,-0.649533912857,0.417397714480,-0.164851058049,0.029031186561}
对应的多项式为:
P(x)=a[0]+a[1]·x+a[2]·x2+a[3]·x3+a[4]·x4+a[5]·x5+a[6]·x6
步骤b:根据确定出来的多项式计算出非线性x4/3函数的值。
可分为以下几步计算((假设整数采用二进制补码表示,字长32位):
(1)6阶多项式的系数可采用Q31的定点数来表示;
(2)将自变量X的范围由[16,8191]归一化到[0.5,1]区间,得到新变量X′;
X′=X.2N
N为X中除了最高位的符号位外,剩余的符号位的个数。N值的计算可用定点DSP的专用指令完成。乘法可用移位操作完成。此时得到的X′为Q31的定点数。
(3)利用多项式P(x)来计算P(X′)。最快的实现需要6个乘法操作和6个加法操作。在实际应用中,根据计算精度和计算量考虑可以适当调整多项式的阶数。下表列出了多项式近似的计算量和存储量同多项式阶数的关系。
阶数 | 乘法次数 | 加法次数 | 存储量(word) | 精度 |
3 | 3 | 3 | 4 | 2.3 x 10<sup>-5</sup> |
4 | 4 | 4 | 5 | 2.1 x 10<sup>-6</sup> |
5 | 5 | 5 | 6 | 2.2 x 10<sup>-7</sup> |
6 | 6 | 6 | 7 | 2.6 x 10<sup>-8</sup> |
7 | 7 | 7 | 8 | 3.1 x 10<sup>-9</sup> |
(4)由X′的幂值P(X′)来恢复X的幂值X4/3
X4/3=(X.2N-31·231-N)4/3=(X·2N-31)4/3·2(31-N)·4/3
前一项对应的定点数就是P(X′),后一项计算可采用查表来获得。由于16≤X≤8191,18≤N≤26,因此只需保存table[i]=2(13-i)·4/3 0≤i=N-18≤8。具体实现时,为了保证精度,通常采用伪浮点来保存table[i]的值,table_frac[I]保存Q31格式尾数,table_exp[I]保存对应的指数(以2为底)。因此恢复X的幂值X4/3,只需要1个乘法和1个移位操作和两次查表操作。此外,需要额外的存储量18word来保存table_frac和table_exp。
由上述计算过程可见,本文提出的采用多项式近似计算x4/3方法,当多项式阶数为6时,在很小的内存消耗(25个word),既保持很高的精度(2.6x10-8),又只有很少的计算量(6个加法,7个乘法,2个移位,2个查表操作,1个DSP专用指令)。
由此可见,针对AAC反量化公式中非线性x4/3函数(x∈[0,8191]的整数)的计算,本发明提出结合查找表法和多项式近似来计算AAC解码器的反量化中的非线性函数,具体来说即在X出现概率相对集中的[0,B]范围内对非线性x4/3函数采用查表法来计算、在谱系数X出现概率相对非集中的[B~8191]范围内的,对非线性x4/3函数通过多项近似来计算,可以在内存消耗很小的前提下,既保证很少的计算量,同时又能保证很高的精度。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换等,均应包含在本发明的保护范围之内。