MS_STEREO因公式单一,较易理解,故流程图略去。
8、重排序
重排序的目的在于把哈夫曼解码之后的短块的每个尺度因子带3个窗,每个窗sfbwidth(尺度因子带宽度)个采样的顺序整理成为每个子带三个窗,每个窗六个采样xr[sb][window][freq_line]的顺序。 8.1 处理流程
重排序处理流程图
混淆缩减
对于长块,在进入IMDCT之前应当先进行混淆缩减。其算法思想是用蝶形算法进行相邻块相邻频率线的调整。如图:
混淆缩减算法图
其计算公式如下:
其中ci可由ISO 1172.3 table B.9查得 计算流程如下(pascal 描述): For sb = 1 to 32 do For i = 0 to 7 do
Xar[18sb- i -1] = xr[18sb – i - 1]cs[i] – xr[18sb + i]ca[i] Xar[18sb+i] = xr[18sb +i]cs[i] + xr[18sb -i- 1]ca[i] End for End for
10、IMDCT覆盖叠加
MDCT的目的在于进行时域到频域的转换,减少信号的相关性,使得信号的压缩可以更加高效地完成,而它的反变换IMDCT的目的在于将信号还原为没有变换之前的数值,使频域值向时域值过渡。 其公式如下:
在进行了IMDCT变换之后,需对频率信号进行加窗、覆盖、叠加。 10.1 加窗:
长块:
开始块:
结束块:
短块的每个窗口分别计算:
10.2 叠加:
将每一块变换出来的值的前半部分与前一块的后半部分相加,并把后半部分保留来和下一块的前半部分相加。如下公式: resulti = zi + si for i = 0 to 17 si = zi+18 for i = 0 to 17 10.3 Szu-Wei Lee的快速算法
Szu-Wei Lee的IMDCT快速算法是针对非2的n次幂个点的IMDCT快速算法。他的主要步骤如下:
1. 将N点MDCT化为N/2点DCT-IV
2. 将N/2点DCT-IV化为N/2点SDCT-II
3. 将N/2点SDCT-II化为2个相同的N/4点SDCT-II 4. 计算SDCT-II(9点)
在本程序中,因为对短块使用这个快速算法并没有带来较大的速度改善,故只对长块使用此快速算法,相较于直接运算的648次乘和612次加来,它只用43次乘和115次加。
11、频率反转
在IMDCT之后,进入合成多相滤波之前必须进行频率反转补偿以校正多相滤波器组的频率反转。方法是将奇数号子带的奇数个采样值乘以-1.
12、合成多相滤波
合成多相滤波的目的是将频域信号转化为时域信号。其原理流程如下:
合成多相滤波算法图
上图流程可简述如下:
1. 将从32个子带抽来的32个sample值通过一个矩阵运算算出64个中间值
2. 将这64个中间值放入一个长度为1024的FIFO缓冲区(这个缓冲区初始化为0)。
3. 从这个缓冲区中每连续的128个值中取头尾各32个值,合为64个值。完成后组成512值的向量U
4. 加窗,即将Ui与窗口系数Di相乘,得到另一512值向量W 5. 最后将这512值向量W每连续的32个值中顺次取一个值,一次共取得512/32 = 16个值相加。完成后一共取得32个最终的时域信号值。
Byeong Gi Lee的dct快速算法
Byeong Gi Lee的DCT快速算法是用于2的n次幂个点的dct快速算法。它用于N点的DCT时仅需(N/2) * log2N次乘法和小于3·*(N/2)*log2 N ) 次加法。 其基本思想是,将N个点的DCT转化为两个N/2个点的DCT的和。进一步分解,即重复这个过程,减少乘法数量。
由于向量Vi的运算是一个类似于DCT的变换,故使用了此快速算法。32点运算共使用了80次乘法和80次加法119次减法。
术语说明
MPEG:Motion Picture Expert Group IMDCT:反离散余弦变换 gr:granule粒度组 ch:channel 通道
参考文献
1. ISO/IEC 11172_3
2. 赖鸿志:MPEG-1 LAYER 3 音訊解碼器於DSP晶片之即時軟體實現 3. An Introduction to Digital Audio John Watkinson 4. Madlib源程序 5. Szu-Wei Lee : Improved Algorithm for Efficient Computation fo the Forward and Backward MDCT in MPEG Audio Coder
6. BYEONG GI LEE :A New Algorithm to Compute the Discrete Cosine Transform