1 标准分析
1.1 通用部分..
1.1.1 码流结构..
1.1.2 码流解析..
1.2 层1和层2.
1.2.1层1和层2子码流结构..
1.2.2层1和层2码流解析..
1.2.2层1和层2算法分析..
1.2.2.1层1和层2反量化算法..
1.2.2.2层1和层2 其他算法..
1.3 层3.
1.3.1 层3子码流结构..
1.3.2 层3码流解析..
1.3.2.1 旁信息解码..
1.3.2.2 scalerfactor信息..
1.3.3 层3算法分析..
1.3.3.1 huffman解码..
1.3.3.2量化编码..
1.3.3.3 recoder处理..
1.3.3.4立体声处理..
1.3.3.5 imdct
1.3.3.6 alias处理..
1.3.3.7综合滤波器组..
2 相关参考C代码实现
2.1解码主循环..
2.2核心算法..
2.3解析maindata数据..
2.4 alias算法C代码..
3 推荐的参考文献
- 标准分析
11172-3编解码框图
1.1. 通用部分
1.1.1. 码流结构
11172-3码流以frame为单位,每个frame共分四个部分header, CRC, audio data和ancillary data如图。除了audio data以外的部分都是公共部分,每层都是一样的。
1.1.2码流解析
1172-3解码的第一步就是要同步文件头,解码文件头信息和进行错误检测。由文件头12个同步位订出数据的起始位置,在对文件头做解码动作,取得信息,当档头中有须要做CRC 时,可以取得文件头信息后的16位长度的CRC检查码,对文件头及旁信息进行CRC检查。1172-3的header结构信息如下。
Header (32bits) | CRC (0/16bits) | Side information (136/256bits) | Main Data | Ancillary Data |
Header的结构
| 位宽 | 作用 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
syncword | 12 | 同步字 固定值 1111 1111 1111 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ID | 1 | 1:mpeg-1 0:mpeg-2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
layer | 2 | 层指示标志位
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
protection_bit | 1 | CRC标志位,1:添加CRC,0:无CRC | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bitrate_index | 4 | 指示编码使用的比特率,单位为kbit/s
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sampling_frequency | 2 | 采样率
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
padding_bit | 1 | Buffer flag 1:frame 中包含附加slot调整平均比特率与采样频率一致,0:反之 注意:padding在44.1khz和自由格式中是必须的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private_bit | 1 | 保留位,将来的ISO也不用 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mode | 2 | 立体声标志位
注意:立体声与2通道无立体声的区别是前者声音相关是左右通道数据只是没有用算法压缩,而后者2个通道的数据根本无关系。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mode_extension | 2 | 立体声扩充标志位 层1,2中指明那些子带使用强度立体声
层3中此flag用于指明使用了那种具体的立体声算法
注意:有2种情况会导致使用stereo 1. Mode=00 2. Mode=01且mode_extension=00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
copyright | 1 | 0:无版权要求,1:有版权要求 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
original/copy | 1 | 0:复制比特流,1:原版比特流 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
emphasis | 2 | 指示使用哪种加重措施 emphasis: 在存储和传输以前对声音信号进行滤波以改善高频的SNR de-emphasis: 在存储和传输以后对声音信号进行滤波去除由于emphasis 处理带来的线性失真。
|
1.2.1层1和层2子码流结构
1.2.2层1和层2码流解析
层1和层2的audio_data部分码流传输信息如表.
| 传送信息 | |||
层1 | allocation | scalefactor |
| sample |
层2 | allocation | scalefactor | scfsi | sample |
每个部分信息的意义是
| 位宽属性 | 循环因子 | 层1中作用 | 层2中作用 |
allocation[ch][sb] | 4位定长码 | 通道号ch 子带号sb | 指明每个通道每个子带的量化频率谱线的编码位数,在使用intensity立体声编码时,左右通道的scalefactor是一样的,故只传送1个通道的allocation。 | 指明每个通道每个子带的量化频率谱线的编码位数,在使用intensity立体声编码时,左右通道的scalefactor是一样的,故只传送1个通道的allocation。 与层1不同的是层2中3个连续的量化频率谱线被编码成一个码字,详见标准附录B的表3-B.2. Layer II bit allocation tables |
scalefactor[ch][sb] | 6位定长码 | 通道号ch 子带号sb | 指明在每个通道每个子带反量化频率谱线时用于加权的因子,查表标准附录B Table3.1获得scalefactor值 | 同层1 |
sample[ch][sb][s] | 2-15位变长码 | 通道号ch 子带号sb 谱线索引s | 每个子带每个通道第s个量化频率谱线的码字 | 每个子带每个通道第s个量化频率谱线的码字 |
scfsi[ch][sb] | 2位定长码 | 通道号ch 子带号sb |
| 指明scalefactor在每个通道每个子带中的使用方法(如下表) |
scfsi[sb] |
|
'00' | 传输3个 scalefactors, 每个组一个scalerfactor |
'01' | 传输2个 scalefactors, 第一个对前两组有效,第二个对第三组有效 |
'10' | 传输1个scalefactor, 对全部3组数据有效 |
'11' | 传输2个 scalefactors, 第一个对第一组有效,第二个对后两组有效 |
注意:循环因子的优先级是sb优先级最高,其次是ch,即每个sb内有2个通道的数据。sample[ch][sb][s]循环的优先级是s在最外层,其次是sb,再次是ch。下面给出sample[ch][sb][s]排列方式。
1.2.2 层1和层2算法分析
层1和层2的主要区别是在于frame的分割上,在层1中,384个数据为一帧(frame),每个frame有32个子带(subband),每个子带12个数据(sample)。而层2中 1152个数据为一帧(frame), 每个frame有32个子带(subband,每个子带3个组(group),每个group有12个数据(sample)。
层1层2解码算法如图,首先解析码流数据,层1,层2的码流解析可以分为2个部分。定长码流信息解析和变长码流信息解析。其中定长部分包括解码信息side info和scalefactor。只要按照码流语法信息中规定的码流格式依次读取数据即可。变长码流信息结构由每个变长的量化频率系数组成,32个子带,每个子带12个sample(层1)或36个(层2)的变长量化频率系数的长度也通过side info中的allocation[ch][sb]信号指明。故在码流解析之后获得解码信息,scalefactor,量化谱线数据以后就可以通过反量化重建频率谱线。层1和层2的量化解码与层3不同,层1,2使用均匀量化器,层3使用非均匀量化器。
层1、层2解码框图
层1和层2的反量化公式如下。
层1和层2的rescaler公式如下。
S´´ 输入反量化数据
S´ 输出频率谱线数据
重建频率谱线后,若使用立体声编码要进行立体声解码处理,再通过综合滤波器组后还原为时域信号输出。层1和层2使用的算法中立体声处理和层3的算法类似,具体内容详见11172-3 stereo处理分析文档。层1和层2综合滤波器组的算法和层3中是完全一样的。唯一要注意的是层1,层2,层3的frame大小不同。故层1,2的分析综合滤波器组的算法不再给出。请详见层3的相关部分。
1.3 11172-3层3
1.3.1层3的码流格式
层3中 1152个数据为一帧(frame),每个frame有2个granules,每个granule有576个数据,32个子带,每个子带18个数据(sample)。
层3的audio data语法结构如图
层3的side infomation语法结构如图
层3的main data语法结构如图
1.3.2层3的码流解析
层3的码流解析也可以分为2个部分。定长码流信息解析和变长码流信息解析。定长码包括side information。变长码包括scalefactor和huffman code。
1.3.2.1旁信息解码(Side Information Decoding)
旁信息包含许多必要的参数,有逆量化的信息(global gain、scale factor compress、sub block gain、scale factor、pre flag)以及霍夫曼解码信息(part 2_3 length、big values、table select、region 0 count、region 1 count 、count 1 table select),window type(window switch flag、block type、mix block flag)和其他信息,这些信息都会被暂存起来以便稍后使用。而旁信息大小由声道决定,单声道 17字节,双声道 32位字节。
Main_data_begin:为9位的指针,指明main_data的起始位置。由于mp3中使用bit reservoir技术, 这个技术是指如果一个 frame可用的位在编码完后还有剩下时,这些剩下的位可以被之后的frame所用,所以一个frame中的main_data不一定紧跟在side information后面,而在bit流中增加信号main_data_begin,它在数据流中有pointer的作用,指向真正的main data的开始。
如果main_data_begin值为 0 则表示main_data是紧接在side_information之后。否则,它表示一个负偏移值,它来自于同步位的第一个字组,但是不包含旁信息和文件头的位数。因为位保留(bit reservoir)的原因使得主要数据不一定都紧附在旁信息后面,如图。frame 0 的main_data_begin值为 0 则表示main_data是紧接在side_information之后。frame 1 它的主要数据起始位置不为 0 且其main_data一部份是在旁信息的前面,一部份在后面。其余frame依此类推。
Scfsi(ScalFactor Selector Information): Scfsi是一个 scale factor 标准,不论为组别 0 或是组别 1 都可以共享它。当编码开始时全部576的频谱会被分成 4份的 scale factor 频带(band),所以在单声道模式时SCFSI 的大小为 4位,在双声道模式时为8位。当为1表示要读取granule0 and granule1当为0时只须读取granule0 . granule1的信息与granule0共享。
table_select: 此用于霍夫曼解码的big value区共有32个表可供选择。
Count1table_select:此用于霍夫曼解码的 count1区有2个表可以选择。
Big_values :指示主要数据(main data)中的big value区域包含多少笔压缩后的音频资料。
Scalefac_compress:表示重主要资料中取出的量化因子其数据长度是多少位元。
Block_type:表示window是何种型态,包含长窗(long window ),短窗(short window) 。
1.3.2.2 Scale Factor Decoder
Maindata码流分为 2 部分, scale factor 和huffman code。它们都是变长码。每个scalefactor的长度由slen1 和 slen2 计算出来,而slen1和 slen2 由scalefac_compress,block_type和mixed_block_flag一起确定。当解码到第二组时,如果SCFSI 被设定为 1,则第二组的scale factor 不必计算,可以由第一组中直接获得。在得到slen1 和slen2 之后,每一个 scale factor 频带都可以解码出scalefactor。最后所有的scale factors 的大小(part2length)都可以借由下列公式计算出来:
(1) Long block (block type = 0、 1、3):
576笔频谱值被分为21 个 scale factor 频带。slen1 表示频带0到10的scale factor 大小。slen2 表示频带11到20的scale factor 大小, slen2 其中: part2length = 11 × slen1 + 10 ×
(2) Short block (block type = 2 and mixed block flag = 0):576笔频谱值被分为 12 个 scalefactor 频带。slen1 表示频带0 到 5 的 scalefactor 大小。slen2 表示频带6 到 11 的 scale factor 大小, 其中:part2 length = 3 × 6 × slen1 + 3 × 6 × slen2
(3) Mix block (block type = 2 and mixed blockflag = 1):
576笔频谱值被分为17 个 scale factor 频带。前面8个频带为long block, 后面9个频带为shortblock,每一个频带包含3个窗口(window)。slen1表示频带 0 到 10 的scale factor 大小。slen2 表示频带11 到 16 的 scalefactor 大小,其中:part2 length=(8 + 3 × 3) × slen1 + (6× 3) × slen2
1.3.3 层3算法分析
1.3.3.4 霍夫曼解码
解析码流之后,提取了必要地的解码信息以后就进入依次的解码算法模块。Huffman解码是首先进行的解码算法。霍夫曼解码器使用标准固定的32个索引表把二进制码流解码成量化谱线数据。。它包含了这些代码当初编码的信息。不同的频率频谱使用不同的索引表,而所代表的查寻都是根据数据流的旁信息。在任何索引表当中最长的可变长度代码,至多到19 bits,但是实际上在标准中只有16种不同的索引表。则解码过程将会继续,由读取来自于索引表中的元素。来决定下一个标签到底需要读取多少的位,如同于下一个将要使用到的索引表的起始地址。具体内容详见11172-3 huffman解码算法分析文档。
1.3.2.5量化与de-scalefacotr
从Huffman解码后的值经过反量化重构频率谱线,反量化是依以下的公式:
(1) long block:
(2) short block:
其中global_gain、scalefac_multiplier、scalefac_l、preflag、pretab均在side information中有指定。具体内容详见11172-3 逆量化算法分析文档。
1.3.2.6 Reorder
因为在短窗的 Huffman编码时将每个子带内的同一频率的三个窗采样数据均重新排列为同一窗,故在此必须恢复成原来的顺序,而长窗没有重新排列故不需要再重新排列。
下面的例子说明了重新排列的方法:假设6组频率系数,每组频率系数由3个窗相同的频率系数组成,内总共有18个数据,Reorder过程如图2:
1.3.2.7 Alias Reduction
Alias Reduction只在长窗口要使用,以减少因互相影响产生的噪声原因:使用长窗框得到较细的频谱分辨率时,同时会有混叠(Aliasing)的产生。原始信号被分成32 个子频带时,在频谱上可见邻近的子频带间有明显的重叠现象,而处于重叠区间的信号将会同时影响两个子频带。所以使用Aliasing算法消除频率交叠。
混叠的过程如图
伪代码
for(sb=1;sb<32;sb++){
for(i=0;i<8;i++){
xr[18*sb-1 - i] = xr[18*sb -1-i]*cs[i] - xr[18*sb +i] *ca[i];
xr[18*sb +i] = xr[18*sb +i] *cs[i] + xr[18*sb -1-i] *ca[i];
}
}
Cs[i]=(1+C[i])^-0.5 Ca[i]=(C[i] /(1+C[i])) ^-0.5
c[0~7] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
xr[i]为经过reorder 模块重新排列后的频率值数据。C[i]值为8个可由查表取得之固定系数值。因此 Cs[i]与 Ca[i]为各 8 个可先计算出结果的值。
1.3.2.8 立体声效处理(Stereo Processing)
MP3 除了提供单声道及双声道之外,同时还提供强化立体声(intensity stereo)与 MS 立体声这两种立体声的编码方式。不过这时候的左右声道就并不是单纯是由反量化所处理过后的值,所以须要经过这个立体声的处理过程来将编码过的立体声信号还原回左/右立体声信号。具体内容详见11172-3 stereo处理分析文档。
1.3.2.9 改良式离散余弦反转换及重迭相加(IMDCT & Overlapping-Add)
标准中,编码器使用分析滤波器组把时域的576个数据分成32个子带,每个子带18个频域数据。再通过MDCT把18个频域数据进行细分,进一步提高频率分辨率。在解码端就要进行IMDCT把原有的频率信号复原。由于MDCT 并不是一种正交,也就是会产生时域上的不一致,所以做转换时,必须有50%做重迭,以消除这种不一致,因此在做完IMDCT 后还要做重迭相加。做IMDCT 长窗共有18条频线组成,输出得到36个值,短窗共有6条频线组成,输出得到12个值。 无论长窗或短窗做完IMDCT 后,在做windowing的动作,最终还是得到36个值,之后再将前一个区块输出值的前一半(0--17) 必须和先前的区块输出值的后一半(18--35) 做重迭相加。具体内容详见11172-3 IMDCT算法分析文档。
1.3.2.10合成滤波器(Synthesis Polyphase)
IMDCT后的结果再经多相滤波器就可以合成输出的讯号,由IMDCT输出的64个输出向量V,先暂存至一个FIFO,每16个V向量(1024个sample)交叉型成 U向量(512个元素),U向量再经D window形成W向量(512个元素),最后512个元素每32个为一组,共分16组,此16组向量的和即为最后的重建结果。 具体内容详见11172-3 分析综合滤波器组算法分析文档。
2 相关参考C代码实现
参考代码来自ISO标准参考代码
2.1解码主循环流程图
2.2层3解码算法流程图