[原创]桓泽学音频编解码(15):AC3 最终章 多声道处理模块算法分析
[原创]桓泽学音频编解码(1):MPEG1 MP3 系统算法分析
[原创]桓泽学音频编解码(2):AC3/Dolby Digital 系统算法分析
[原创]桓泽学音频编解码(4):MP3 和 AAC 中反量化原理,优化设计与参考代码中实现
[原创]桓泽学音频编解码(5):MP3 和 AAC 中IMDCT算法的原理,优化设计与参考代码中实现
[原创]桓泽学音频编解码(6):MP3 无损解码模块算法分析
[原创]桓泽学音频编解码(7):MP3 和 AAC 中huffman解码原理,优化设计与参考代码中实现
[原创]桓泽学音频编解码(8):关于MP3和AAC量化器设计的研究
[原创]桓泽学音频编解码(9):MP3 多相滤波器组算法分析
[原创]桓泽学音频编解码(12):AC3 Mantissa(小数部分)模块算法分析
1 算法概述
AC-3 里的stereo process指的就是coupling algorithm 和rematrix algorithm。Coupling algorithm 是根据听觉特性来消除两声道间不需要的信息,而rematrix algorithm 则是以stereo的特性来消除两声道间冗余的信息。
2 coupling 算法
2.1 编码概述
Coupling框图
人类对高频的 stereo 信号较不敏感,所以对高频的 stereo 信号使用coupling策略会有相当显著的效果。Coupling声到的产生方式是结合两个声道变成一个声道。适用的频率范围从3.14KHz 到21.75KHz。 coupling algorithm 主要的组件有coupling band structure,coupling
channel,coordinate,以及phase modifier。如图所示。 coupling band structure是将高频的频率成分切割成一些具有不同性质且不能再分割的部分。coupling channel 是由 joint 算法产生出来的 spectral envelope。Coordinate是把 coupling channel 重建回 stereo信号的scale factor。Phase modifier是把第二个欲重建的声道的相位转180度。
编码器为了平衡在耦合通道的频率系数使用couple算法.被耦合的通道有唯一的耦合坐标集合由于保留原始通道中高频系数的包络.在编码器中将包括在耦合声道中的各个声道的变换系数在各声道之间取平均,来实现声道耦合。
AC3将变换系数从第37个系数到第252个系数分成18个子带,每个子带有12个系数。参数cplbegf指示的频率以下的声道全部使用独立编码,在cplbegf以上的频率系数,在chincpl[ch]=1的前提下。
2.2 解码概述
解码器通过将该声道该子带的频域系数和耦合坐标相乘实现解耦合,若是2/0模式还有加上一个附加步骤,如果phsflginu标志为1或者前一个块的有相等的状态并且共享到当前块的话,该被耦合(耦合结果)的子带内全部右声道系数取反,这在耦合坐标修改之后逆变换之间进行。
Decoupling 框图
解码器通过被耦合的通道的变换系数与耦合坐标相乘实现耦合通道到独立通道的解码.对于2/0模式压缩,有一个附加的步骤,如phsflginu=’1’,则在进行去耦合的频带内要对右通道的数据要进行相位反转.
耦合在解码端的处理方式: 变换系数与耦合坐标相乘.
注意:
1. 在耦合通道内,也不是所有的频率系数都需要进行解耦合操作.
2. ac3算法中把一个通道内可能耦合的数据分成若干个sub-band,如表7.24,每个sub-band有连续的频率系数,起始的频率是low tc,截至的频率是high tc.
3. 一个或若干个sub-band组成一个coupling band.每个coupling band有一个coupling corrdinate(耦合坐标).coupling band的结构由cplbndstrc[sbnd]指明.每个cplbndstrc[]数组的一个位表示当前sub-band是否与前一sub-band在一个coupling band内(这个解分组方式与aac中的解windows分组方式一致).
4. 每个通道的每个coupling band的耦合坐标是否存在通过chincp[ch]指明,如chincp[ch]=’1’表示耦合坐标存在,且它以一个浮点格式传送.exponent限制用4bit传输(cplcoexp[ch][bnd]).mantissa也是使用4位传输(cplcomant[ch][bnd]).
5. 当exponent = 15 时,mantissa的值在0.5到1.0之间
当exponent < 15 时, mantissa值的最高位一定为1
2.3 解码步骤
解码中使用的码流有
/* 这个域是耦合方案码流信息*/ |
|
|
cplstre |
1 |
1:耦合信息存在 0:耦合信息与前一块共享 (块0不应该为0) |
if(cplstre) |
|
|
{ |
|
|
cplinu |
1 |
1:使用耦合算法 0:未使用耦合,全为独立通道 |
if(cplinu) |
|
|
{ |
|
|
for(ch = 0; ch < nfchans; ch++) {chincpl[ch]} |
1 |
|
if(acmod == 0x2) {phsflginu} /* 只在2/0模式有效 */ |
1 |
1:phsflg在耦合坐标信息码流内 |
cplbegf |
4 |
见“解码概述” |
cplendf |
4 |
|
/* ncplsubnd = 3 + cplendf - cplbegf */ |
|
|
for(bnd = 1; bnd < ncplsubnd; bnd++) {cplbndstrc[bnd]} |
1 |
见“解码概述” |
} |
|
|
} |
|
耦合方案信息
/*耦合坐标,相位标志码流 */ |
|
|
if(cplinu) { |
|
|
for(ch = 0; ch < nfchans; ch++){ |
|
|
if(chincpl[ch]) |
|
|
{ |
|
|
cplcoe[ch] |
1 |
1:耦合坐标存在标志 |
if(cplcoe[ch]) |
|
|
{ |
|
|
mstrcplco[ch] |
2 |
见解码步骤 |
/* ncplbnd derived from ncplsubnd, and cplbndstrc */ |
|
|
for(bnd = 0; bnd < ncplbnd; bnd++) |
|
|
{ |
|
|
cplcoexp[ch][bnd] |
4 |
耦合坐标的指数信息 |
cplcomant[ch][bnd] |
4 |
耦合坐标的尾数信息 |
}}}} |
|
|
if((acmod == 0x2) && phsflginu && (cplcoe[0] || cplcoe[1])) |
|
|
{ |
|
|
for(bnd = 0; bnd < ncplbnd; bnd++) {phsflg[bnd]} |
1 |
在2/0模式下且phsflginu=1且phsflg[bnd]=1时,右通道的数据要相位反转(即坐标乘-1) |
} |
|
|
} |
|
耦合坐标,相位标志信息
输入:
Audioblock码流信息 |
如图 |
|
Bsi码流信息acmod |
2位二值 |
|
耦合通道频率系数 |
32位浮点 |
|
输出:
解耦合后通道频率系数 |
32位浮点 |
|
Step1:获取码流信息
除了依据码流语法获取码流数据以外还要注意区分以下几点
cplstre:1:耦合信息存在。0:耦合信息与前一块共享。(块0不应该为0)
cplinu: 1:使用耦合算法。0:未使用耦合,全为独立通道
Step2:确定耦合带宽,获取频率系数
Step3:获取耦合坐标
Step4:解耦合操作
2.4 参考代码
来自对libac3dec的分析
算法流程图
3 rematrixing 算法
3.1 编码概述
Rematrix是一种声道组合技术。将钙塑相关的声道之和与差进行编码。不是将原理的声道本身编码。也就是说。不是在两声道编码器中将左和右编码和打包。而是建立
Left=0.5*(left+right)
Right=0.5*(left-right)
3.2 解码步骤:
输入:
remastr |
1bit |
1:在码流存在rematflg标志. 0:在码流中不存在rematflg标志,使用前一个块的rematflg.block 0的这个位不应该设置为0; |
rematflg[rbnd] |
1bit |
指明在rematring带rbnd内的系数是否使用rematrixed. 注:子带rbnd使用rematrixed,不意味着子带内的所有谱线都使用rematrixed. |
输出:频域数据
32bit浮点
Step1:计算使用rematrix的带宽
i.如果没用coupling算法,
num_bands=4;
ii.使用coupling算法, cplbegf > 2
num_bands=4;
iii.使用coupling算法, 0<cplbegf≤ 2.
num_bands=3;
iv.使用coupling算法, cplbegf =0.
num_bands=2;
Step2:在各自带宽内查表计算起始频率和终止频率
bands |
rematrix_band[bands].start |
rematrix_band[bands].end |
|
0 |
13 |
24 |
|
1 |
25 |
36 |
|
2 |
37 |
60 |
|
3 |
61 |
未使用耦合 |
使用耦合 |
252 |
36+cplbegf*12 |
start = rematrix_band[bands].start;
end = (cplinu ? min32(rematrix_band[i].end ,12 * cplbegf + 36) : rematrix_band[ i ].end);
bands=0,1,2,num_bands-1
Step3:还原左右声道数据
left(band n) = received left(band n) + received right(band n) ;
right(band n) = received left(band n) – received right(band n) ;
注:
只在2/0 mode下有效
注意由于可能由coupling操作,所以左右带宽可能并不一样宽,rematrix只应用在2个通道较低的频带上.不管实际的带宽如何,所有四个rematrixing标志一定要在码流中传输.
3.3参考代码
实现算法的函数rematri x(audblk_t *audblk, stream_samples_t samples)
rematrix函数流程图