资源描述
`第一章 MP3音频概述
1. 1 MP3的历史
运动图像及其伴音通用的压缩编码技术是多媒体计算机、多媒体数据库、多媒体通信、数字化电视、高清晰度电视以及交互式电视系统中的关键技术。要解决上述应用中的传输和存储问题,必须要采用压缩编码技术。从最早提出PCM编码理论开始,迄今己有50多年的历史,很多科学家、工程师先后提出了预测编码、变换编码、矢量量化编码、信息嫡编码、子带编码、结构编码以及基于知识的编码等。其的目的就是为了从原始数据中去除信息的时间冗余、空间冗余、信息嫡冗余、结构冗余、知识冗余以及视觉的冗余,保留有用的信息,以便提高信息处理、传输和存储效率。
从八十年代开始,很多大的国际性公司,为了设计开发多媒体计算机系统以及通信系统,专门研制了自己的音频视频信息压缩解压缩算法,为了提高速度,投入了大量研究经费,设计制造了专用集成电路,当时在国际市场上取得了良好的经济效益和社会交易。但是随着国际标准化组织ISO(The Intemational Organization for Standardization)先后制定了ISO/IEC10918[连续色调静态图象的数字压缩和解码(JPEG)]、ISO/IECI1172(具有1.5/Mbit/s数据传输率数字存储媒体运动图象及其伴音的标准MPEG-I)以及CCITT制定的H.261(Px64Kbps视声业务视象编码方式)等标准,使得一些不符合国际标准的产品的技术发展受到限制。国际标准化组织于1988年就成立一个致力于制订有关运动图像压缩编码的组织。组织在工作一开始就考虑到相关标准化组织的研究成果,如JPEG和H.261标准。运动图像可以看成是静止图像的一个系列,所以图象运用的帧内解码器中就采用了JPEG推荐的技术,此外又加进了帧间压缩技术(运动补偿技术)。到1992年MPEG正式推出了MPEG-I标准草案,1993年正式通过。MP3就是MPEG标准中的音频标准中的一部分。1987年,IIS开始进行有关实用的音频编码方面的工作。它们同Erlangen大学合作开展了一个项目,最后IIS提出了一个非常优秀的算法,也就是ISO-MPEG-I音频的第3层,同时通过的ISO11172-3标准也就成为了MPEG标准中的一部分。后来,在MPEG-I的基础上,又提出了MPEG-II的编码标准,该标准的音频部分与MPEG-I的音频部分在算法上基本一致,但提供了与CCITT的G-722相类似的16KHz、22.05KHz和24KHz的采样速率,这样就使得MP3也可以用于低比特率(<64Kbit/s)语音通信中。同时,为了适应多通道语音通信的需要,新标准又提出了多语音通道的压缩方法,并且可以提供一个额外的LEF通道(low frequency enhancement channel),该标准后来被命名为ISO13818-3标准。
1. 2 MP3的特点
MP3标准用尽可能低的码流位率实现CD音质的声音而不会产生数据损失。如果对于一段声音不进行压缩的话,那么每存储一秒钟的立体声CD音质音乐必须用1.4Mbit,这是个十分大的开销。通过运用MPEG音频标准的压缩技术,我们可以把存储空间压缩到原来的十二分之一而不会降低声音的音质。即使使用二十四分之一的压缩因子,仍然比单纯降低采样频率的音质要好。
表1.1 MP3音质与码流位率
音质
带宽
模式
位流率
压缩因子
电话音质
2.5kHz
mono
8kbps
96:1
短波
4.5kHz
mono
16kbps
48:1
中波
7.5kHz
mono
32kbps
24:1
调频
11kHz
stereo
56...64kbps
26...24:1
接近CD
15kHz
stereo
96kbps
16:1
CD
>15kHz
stereo
112...128kbps
14...12:1
从上表可以看出,采用MP3标准压缩的声音具有音质好,码率低的特点,而且根据国际上众多的视听测试,MP3提供了非常好的性能,根据测试,在10kHz的通道中完全可以实现立体声广播。
1. 3 MP3的实现基础及局限性
MP3之所以能够实现主要是因为人的听觉的特性以及编码技术的发展。
最小听觉阈制值与声音掩蔽:
人耳的听觉阈制并不是线性的,而且人耳对于不同的声音的感觉是不同的,强的声音往往可以淹没弱的声音。所以在编码的时候就没有必要将所有的声音进行编码,这样就减小了数据量。
Huffman编码技术:
MP3使用了非常经典的Huffman算法,MP3使用Huffman算法实现压缩的最后步骤。在编码过程中,Huffman算法产生一个可变码长的位流,并且可以根据一个相应的表格解决码流不等长的问题,而且解码速度非常快,同时压缩比也较高,平均可节省20%的空间。MP3虽然有压缩比大的优点,但因为它的编码原理的限制,同样也存在缺点。MP3一个显著的缺点就是延迟时间长,它的最小理论延时是59ms,而实际上的值要比这要大许多,而且同系统的实现方法有关,很难给出一个精确的值。
第二章 音频解码概述
2.1.音频序列[1]
帧—层Ⅰ和层Ⅱ:位流的部分内容可以根据自身的信息进行解码。在层Ⅰ中,它包含有384个样本信息;在层Ⅱ中,包含1152个样本。它以一个同步字开始,在下一个同步字前结束。它由整数个槽(slot)组成(层Ⅰ中4个字节,层Ⅱ中1个字节)。帧—层Ⅲ:位流的部分内容可使用先前获得的主要信息进行解码。在层Ⅲ中,它包含有1152个样本信息。尽管两个连续的同步字开始位置之间的距离为整数槽(层Ⅲ1个字节),属于一个帧的音频信息一般并不包含在两个相继的同步字之间。
2.2 音频帧
header:位流的一部分,它包含同步和状态信息。
error_check:位流的一部分,它包含用于错误检测的信息。
audio_data:位流的一部分,包含音频样本的信息。
ancillary_data:位流的一部分,可用于辅助数据。
2.3 头标
前32位(4个字节)是头标信息,对所有层而言,它是一样的。
syncword:位串1111 1111 1111
ID标明算法ID的位(l位),等于z表示是IsozIEe11172-3音频,0值
保留。
Layer:2位,表明使用的层次,取值如“表2.1”所示。
表2.1 Layer值定义
Layer
11
层Ⅰ
10
层Ⅱ
01
层Ⅲ
00
保留
为了改变层,可能需要复位音频解码器。
protection_bit:1位长,用于表明冗余信息是否被加到音频流中,以进行错误检测和错误隐蔽。位值为1表示未增加冗余信息,位值为0表示增加冗余信息。
bitrateindeX:指定位率。所有。值表明“自由格式”情形,在这种情形下可以使用不同于表中的固定位率。这里的固定意味着帧包含N或者N+1个槽(依赖于填补位的值)。bitrate_index是1个表的索引,每层所用的表各不相同。bitrate_index表明整个位率,而不管其方式(stereo(立体表)joint_stero(联合立体声)dual_chanel(双声道)和single_chanel(单声道))。
表2.2 不同层次的位率
Bitrate_index
指定的位率(Kb/s)
层Ⅰ
层Ⅱ
层Ⅲ
0000
Free
Free
Free
0001
32
32
32
0010
64
48
40
0011
96
56
48
0100
128
64
56
0101
160
80
64
0110
192
96
80
0111
224
112
96
1000
256
128
112
1001
288
160
128
1010
320
192
160
1011
352
224
192
1100
384
256
224
1101
416
320
256
1110
448
384
320
1111
禁止使用
禁止使用
禁止使用
为了提供可能的最小延迟和复杂性,不需要解码器支持一连续可变位率(当在层Ⅰ和层Ⅱ时),层Ⅲ通过切换bitrate_index来支持可变位率。bitrate_index的切换可用来优化DSM上的存储需求或者插值任何中等数据位率,具体方法是在位率表中近似的值之间进行切换。然而,在自由格式中,需要使用固定位率。另外要求解码器所支持的位率高于448kb/s、384kb/s和320kb/s(分别对应与层Ⅰ、层Ⅱ和层Ⅲ),这时的操作模式为自由格式。
对于层Ⅱ而言,并非所有位率与模式的组合都是允许的,参见“表2.3”。
表2.3 位率与模式的关系
位率(Kb/s)
自由格式
所有模式
34
单通道
48
单通道
56
单通道
64
所有模式
80
单通道
96
所有模式
112
所有模式
128
所有模式
160
所有模式
192
所有模式
224
立体声,强度立体声,双通道
256
立体声,强度立体声,双通道
320
立体声,强度立体声,双通道
384
立体声,强度立体声,双通道
sampling_frequeney:指定采样频率,参见“表2.4”。
表2.4 采样频率的值
Sampling_frequency
指定的频率(kHz)
00
44.1
01
48
10
32
paddingesbit:如果该位为1,那么帧中包含一个额外槽,用于把中等位率调节为采样频率,否则该位必须为0。在采样频率为44.1妞z时,填补是必要的,在自由格式中也可能需要填补。
之所以要应用填补操作位到流中,原因是在一定数量的音频帧后,编码帧的累计长度不应与下面的计算值偏离(+0,-1槽)以上:
其中,帧大小=384(层Ⅰ)或1152(层Ⅱ和层Ⅲ):
Private_bit:标志私有使用的位
mode:表明所有的模式,见“表2.5”。在层Ⅰ和层Ⅱ中,joing_stereo模式是instersity_stereo;在层Ⅲ中,它是iniensity_stereo或ms_stereo.
表2.5 模式表
Mode
指定的模式
00
Stereo(立体声)
01
Joint_stereo(intensity_stereo或ms_strero)(联合立体声)
10
Dual_channel
11
Single_chanle
在层Ⅰ中,除联合立体声(Joint_stereo)之外的所有模式下,等32;在层Ⅱ中,在除联合立体声之外的所有模式下,约束值等于sblimit。在joint_stereo模式下,约束值由mode_extension确定。
Mode_extension:这些位用于joint_stereo模式中,在层Ⅰ和层Ⅱ中,它们表明哪个子带在iniensity_stereo中,所有其它子带按立体声编码,mode_extension的含义如“表2.6”所示。
表2.6 mode_ectension的定义
Mode_extension
00
Intensity_stereo中的子带4-31,bound=4
01
Intensity_stereo中的子带8-31,bound=8
10
Intensity_stereo中的子带12-31,bound=12
11
Intensity_stereo中的子带16-31,bound=16
在层Ⅲ中,它们表明应用何种类型的联合立体声(intensity_stereo和ms_stereo)模式所要应用的频率范围在算法中是隐含的。见“表2.7”。
表2.7 mode_extension和intensity_stereo和ms_stereo的关系
Mode_extension
Intensity_stereo
Ms_stereo
00
off
off
01
off
off
10
off
on
11
on
on
如果模式位指定为立体声,则使用一种“立体声”(stereo)模式,或者当模式位指定联合立体声并且mode_extension指定intensity_Stereo为“off”、ms_stereo为“off”时也使用立体声模式。
copyright:如果该位等于0,那么位流没有版权保护,否则相应的流受版权保护。用户在使用时应注意。
original/copy:如果该位为0,表示位流是复制品,否则为原始位流。
Emphasis:表明应使用的解加重(de_emphesis)的类型,见“表2.8”。
表2.8 emphasis值表
Emphasis
指定的emphasis
00
无
01
50/15微秒
10
保留
11
CCITT J.17
2.4音频数据(层Ⅰ)
altocation[ch][sb]:表明对通道ch的子带sb中的样品进行编码所需要的位数。对于模式intensity_stereo中的子带,位流只包含1个分配数据单元/子带,见“表2.9”。
表2.9 allocation[ch][sb]值表
Allocation[ch][sb]
位/样本
0
0
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
11
11
12
12
13
13
14
14
15
15
禁止
Sealfaetor[ch][sb]:表明通道ch的子带sb的因子,这个因子用于乘通道ch中子带sb的再量化样本。6位构成一个无符号整数,由于后面表“层Ⅰ、层Ⅱ缩放因子”的索引。
Sample[ch][sb][s]:通道ch的子带sb的第s个样本的编码表示。对于iniensity_sterco模式中的子带,样本的编码表示对两个通道都有效。
2.5 音频数据(层Ⅱ)
alocation[ch][sb]:包含有与通道ch中子带样本的量化器有关的信息,以及有关3个连续样本信息(已被集成到1个代码中)和用于编码样本的位数的信息。该域的含义与长度依赖于子带数、位率和采样频率。这个域中的位形成一个无符号整数,用作表“层Ⅱ位分配表”中相关表的索引,该表给定用于量化的层次数。对在intensity_stereo模式下的子带而言,位流只包含1个分配数据元素/子带。Scfsi[ch][sb]:缩放因子选择信息。这个域给出关于通道中子带传送的缩放因子信息,以及为该帧中有效信号部分传送的缩放因子数目的信息。sefsi[sb]的取值如“表2.10”所示。
表2.10 secfsi[sb]的取值表
scfsi[sb]
含义
00
传送3个缩放因子,部分0、1和2各1个
01
传送2个缩放因子,第1个对部分O和部分1有效,第2个对部分3有效
10
传送1个缩放因子,它对部分3有效效
11
传送2个缩放因子,第1个对部分0有效,第2个对部分1和部分2有效
sealefaetor[ch][sb][p]:指定缩放因子。通道ch中的子带sb的样本和帧中p部分的样本要用这个缩放因子乘,从而再量化。6位组成一个无符号整数,用作后面表“层Ⅰ、层Ⅱ缩放因子”。
grouping[ch][sb]:这是1个函数,用于确定对通道ch的子带sb的样本进行编码时成组是否起作用。成组的含义如下:在当前块gr的通道ch中,当前子带中的三个连续样本(三元组)用一共同的代码字(而不是三个不同的代码字)进行编码和传送。如果在当前使用的位分配表中,在sb(行)的allocation[sb](列)中的值为3、5或9,那么grouping[ch]为真,否则为假。在模式intensity_stereo中,对两个通道而言成组都是有效的。
samplecode[eh][sb][gr]:通道ch的子带sb的块gr中3个连续样本的编码表示。对于iniensity_stereo模式下的子带而言,samplecode的编码表示对两个通道都有效。
samlel[ch][sb][s]:通道ch中子带的第s个样本的编码表示。对于intensity_stere。模式中的子带,样本的编码表示对于两个通道都有效。
2.6 音频数据(层Ⅲ)
main_data_begin:main_data_begin的值用于确定帧中主要数据的第1位的位置值。这个main_data_begin值把位置用一负偏移量(相对于音频同步的第一个字节)表示,以字节为单位。属于头标和辅助信息的字节数不考虑在内。例如,如果main_data_begin==0,那么主要数据从辅助信息后开始。
Private_bits:私有用途的位。这些位在将来的ISO/IEC标准中使用。Private_bits的数目取决于通道的数目。在确定为private_bits分配的位数时,应与用于辅助信息的位数相等。
scfsi[ch][scfsi_band]:在层Ⅲ中,缩放因子选择信息与音频层Ⅱ工作方法类似。主要差别在于使用变量scfsi_band来把scfsi应用到缩放因子组(而不是单个缩放因子)上。把缩放因子应用到块上的操作scfsi由来控制。scfsi的取值如“表12”所示。如果切换到短窗口(shortwindow),即对于一个块有block_type==2,那么对这一帧而言总是0。
sefsi_band为缩放因子组(scfsi_bands)控制缩放因子选择信息的用法。如“表2.11”。
表2.11 scfsi_band的取值及其含义
scfsi[scfsi_band]
含义
0
为每个块传送缩放因子
0
为块0传送缩放因子,它对块也有效
表2.12 scfsi_band的取值及其含义
0
0,1,2,3,4,5
1
6,7,8,9,10
2
11,12,13,14,15
3
16,17,18,19,20
part2_3_length[gr][ch]:该值包含用于缩放因子和Huffman代码数据的main_data位的数目。由于辅助信息的长度总是相同的,该值用于计算下一个块的主要信息开始位置和附属信息(如果有的话)的位置。注意,单通道音频帧包含17个字节长的辅助信息,而双通道音频帧包含32个字节的辅助信息。
big_values[gr][ch]:每个块的频谱使用不同的Huffman代码来编码。从0到Nyqulst的整个频率范围被分成几个区域,每个区域用不同的表进行编码。区域部分是以最大量化值为依据。在完成这一动作时,假定位于较高频率上的值具有较低的幅度值,并且可能根本不需要编码。从高频率开始,一对等于0的量化被计数,把计数值命名为“rzero”。然后,绝对值不超过1的4个量化值(也就是只有三个可能的量化层)被计数,该数命名为“countl”。同样,有偶数个值保留下来。最后,延伸到0的频谱区中的值的数目被命名为“big_values”。这个范围内的最大绝大值被约束为8195。
global_gain[gr][ch]:量化器大小信息辅助信息变量global_gain来传送,它用对数方法量化。
sealefac_compress[gr][ch]:选择用于传送缩放因子的位数,具体操作时按下面的表:
如果block_type是0、l、或3:
slen1:用于缩放因子带0-10的缩放因子长度。
slen2:用于缩放因子带11-20的缩放因子长度。
如果block_type是2并且mixed_block_flag为0:
slen1:用于缩放因子带0-5的缩放因子长度。
slen2:用于缩放因子带6-11的缩放因子长度。
如果block_type是2并且mixed_bloek_fiag为1:
slen1:用于缩放因子带。0-7(长窗口缩放因子带)和3-5(短窗口缩放因子带)的缩放因子长度。
slen2:用于缩放因子带6-11的缩放因子长度。slen1和slen2的取值如“表14”。
表2.13 slen1和slen2取值表
scalefac_compress
slen1
slen2
0
0
0
1
0
1
2
0
2
3
0
3
4
3
0
5
1
1
6
1
2
7
1
3
8
2
0
9
2
1
10
2
2
11
3
3
12
3
0
13
3
1
14
4
2
15
4
3
在长块的的情形下,IMDCT为每18个输出值产生36个值。对输出进行视窗变换并且块的前半部分与前面块的后半部分进行叠加。这样得到的向量是1个带的多相过滤器区的合成部分的输入。
在短块的情形下,完成3个变换,每个变换产生12个值。这3个向量被分别进行视窗变换和叠加处理。在结果向量两端级联6个O将使向量的长度为36,然后按长变换的输出进行处理。
mixed_block_flag[gr][ch]:表明低频进行变换时所用的窗口类型与高频进行变换时所用的窗口类型不同。如果mixed_block_flag为0,那么所用的块按block_type[gr][ch]表明的方式进行变换;如果为mixed_block_flag为1,那么用正常窗口对对应于两个最低频率多相子带的频率进行变换,而剩余的30的子带按block_type[gr][ch]指定的方式进行变换。
table_select[gr][ch][vegion]:根据显示量化值和信号的局部统计特性使用不同的Huffman代码表。在MPEG音频中给出了32个可能的表。subblock_gain[gr][ch][window]:表明对于一个子块而言与全程增益的增益偏移量。仅与块类型2(短窗口)一起使用。子块的值必须被
除(在解码器中)。
region_count[gr][ch]:对频谱进行进一步剖分,以增强编码器的性能。它是对由big_value描述的区域的剖分,目的在于获得较好的容错性和编码效率。使用的3个区为区域0、区域1和区域2。根据最大量化指标和局部信号的统计特性,对每个区域使用不同的Huffman代码表。
region0_count和region0_count用于表明区域的边界,区域边界由把频谱剖分为缩放因子带的操作进行调整。域regio0_count包含的值为区域0中的缩放因子带数目与1的差。在短块情况下,每个缩放因子带被计数三次,每个短窗口1次,因此,若region_count的值为8,那么表明区域1从缩放因子带号3开始。
如果block_type==2,并且mixed_block_falg==0,那么块的缩放因子带的总数为12*3=36;如果block_type==2,并且mixed_bloek_flag==l,那么缩放因子带的最大数目为8+9*3=35,如果block_type!=2,那么缩放因子带的数目为21。
region_count[gr][ch]:region_count的值为区域1中缩放因子带的数目与1的差。同样,如果block_type==2,那么表示不同的时间槽的缩放因子带被分别计数。
preflag[gr][ch]:这是对量化进行额外放大一种方便途径。如果preflag被置位,那么把表的值加到缩放因子上,这与用表值乘再量化的缩放因子的效果相同。如果block_type==2,那么从不使用preflag。
scalefac_csale[gr][ch]:缩放因子按对数方法量化,步大小为2或者。“表15”给出了用在再量化方阵中的放大因子倍数。
表2.14 放大因子倍数
Scalefac_scale[gr]
sclaefac_multipiler
0
0,5
1
1
couniltable_select[gr][ch]:这是1个标志,对于幅值不超过1到4量化值区域,它从两个可能的Huffinan代码表中选择1个。
scalefac_l[gr][ch][sfb],sealefac_s[gr][ch][sfb][window],is_pos[sbf]:缩放因子,用于彩色和量化噪音。如果量化噪音有正确的形状着色,那么它被完全屏蔽。与层Ⅰ和层Ⅱ不同,层Ⅲ缩放因子不提供与量化信号的局部最大值有关的任何信息。在层Ⅲ中缩放因子用在解码器中,以获得值组的部分因子。在层Ⅲ的情形中,组延伸到几个频率行。这些组称为缩放因子带,并且选择它们与临界带尽可能相似。
Huffman编码数据按频率递增的顺序排列。如果block_type==2(短块),那么Huffman编码数据按那个块缩放因子值的顺序排列。Huffman编码数据由后续的缩放因子带决定,从缩放因子带0开始。在每个缩放因子带内,为每个后续时间窗口给定数据,从窗口0开始,到窗口2结束。在每个窗口内,把量化值按上升频率顺序排列。
2.7 辅助数据[2]
Ancinarywebit:该位由用户定义。
辅助位的数目(no_of_ancillary_bits)等于音频帧中可用的位数目与音频数据的位数之差。在层Ⅰ和层Ⅱ中,no_of_ancillary_bits对应于应用于音频数据结束处与下一个头标开始位置之间的距离;在层Ⅲ中,no_of_ancillary_bits对应于Huffman_code_bits的结束处与位流下一帧的main_data_begin指针所指位置之间的距离。
第三章 MP3音频解码过程分析及算法描述
2. 1 MP3概述[3]
MP3全称MPEG-I音频第3层(MPEG-I Audio LayerIII) ,它融合了MPEG音频第1层第2层中的MUSICAM(掩蔽型通用子带综合编码及复用)算法和ASPEC(自适应谱分析听觉熵编码)算法,并且通过应用混合滤波提供额外的频率分辨率,另外还采用非均匀量化、自适应分段、熵编码等,获得了最高的压缩比,已成为网络数字音频的压缩标准。
在消费电子领域涌现出大量的便携式MP3播放器,其着重考虑的是音质、功耗、尺寸,在实现上有基于DSP+MCU的和基于ASIC的。传统的MP3算法需要完成大量的高精度浮点计算,其解码速度和效率依赖于通用浮点运算单元的支持。大部分的专用MP3解码播放系统均需要使用DSP处理器或浮点协处理器处理浮点指令并完成高速浮点运算过程,因而系统设计复杂、成本高、通用性差、难以升级换代。本文选取的目标机摩托罗拉DSP56858在单片内真正融合了MCU的控制功能和16位定点DSP的处理能力,对外呈现单一指令集,可大大降低总体器件成本、减小电路板空间并具有更高的可靠性。
MP3解码算法定点化的关键在于在有限的MIPS开销及内存使用的约束下尽量减小有限字长造成的量化误差,保证音频解码输出具有较高的SQNR。OCAPI充分考虑到定点DSP固有的有限字长效应,其定点类全面地描述了定点数的数值行为特性。作者首先简介MP3解码算法,提取出关键处理步骤;随后用OCAPI对MP3解码算法进行基于C++的系统级定点仿真,对目标DSP的数据通道建模,迭代求精,快速引出各数据处理步骤中间运算结果及滤波系数的最佳字长及Q值,得到内存使用情况,给出了SQNR评估方法及结果;最后在目标机上为各数据处理基本块实现了比特精准的实时汇编,并给出了MIPS开销分布。
音频解码过程中的第1个动作是使解码器与输入位流同步。在启动后,这可以通过搜索位流中12位长的同步字来完成。在某些应用中,lD、层和保护状态对解码器己知,因而头标的前16位应当成是16位的同步字,从而允许更可靠的同步。相连的同步字的位置可根据proteetionesbit后的7位信息来计算,位流被剖分为槽。两个相连同步字的开始位置之间的距离等于“N”或“N+1”槽,“N”的值依赖于层次。
对层I,下面的公式有效:
对于层n和层m,下面的公式有效
如果上述计算结果不是整数,那么就要进行舍入操作,并且需要“填补”。在这种情形下,帧中的槽数将在N和N+1之间变化。如果槽数等于N,那么把添补位置为O;如果槽数不等于N,那么添补位置1。知道相连同步字的关系后,使得同步操作变得相对容易。
如果位率等于‘0000’,那么并不表明精确位率,N可通过相连同步字与填补位的值之间的距离来确定。
位流中的模式位应被读取,并且如果它们的值是‘01’,那么也应读取mode-extension位。mode_extension位按规定设置‘bound’,以表明在joint_stereo模式中对哪个子带进行编码。
如果头标中保护位等于0,那么把CRC检验字插入到位流中,插入位置为头标的紧后面。检测错误方法为CRC-16,它的产生器多项式为:
所使用的方法见后面的CRC检验图,移位寄存器的初始状态为‘1111 1111 1111 1111’。然后包括CRC检验器中的所有位被输入到移位电路中。每输入1位后,移位寄存器就平移一位。在最后一次平移后,输出b15-b0。组成1个字,并把该字与位流中的CRC检验字相比较。如果这两个字不同,那么在位流的保护域中发生了传送错误。为了避免这种变形(distortion),需要利用隐蔽技术,比如使实际音频帧不发声或重复先前帧。
2.1.1 MPEG音频第Ⅰ层
解码部分对所有层都一样,在着一操作完成后,为所有子带读取位分配信息,并且为具有非0位分配的所有子带读取缩放因子。
子带样本的再量化:
根据位分配,要为每个子带样本读取的位数nb即可知道,每个模式下样本的次序已在前面给定。当用于1个样本的位被从位流中聚集在一起时,必须把第一位取反,所得到的结果可当成2的补码,而MSB代表值-1。再量化值可用下面的公式获得:
其中是小数,是再量化值。
nb是分配给子带中样本的位数。
intensity_stereo模式下子带中的样本被复制到两个通道上。再量化的值必须被再缩放。再缩放的值用下面的式子计算:
S'=factor*S''
合成子带过滤器:
如果子带未分配任何位,那么那个子带中的样本被置为0。每计算1个通道所有32个子带的样本后,把他们应用到合成子带过滤器,并且可以计算32个连续音频样本。矩阵操作的系数Nik由下面的公式给出:
用于视窗操作的系数Di。系数通过数值化优化方法来导出。一帧包含12*32=384个子带样本,在过滤操作后产出384个音频样本。
2.1.2 MPEG音频第Ⅱ层
层Ⅱ与层Ⅰ相比,是一种更有效的但更复杂的编码器机制。第一步完成解码器操作,解码操作对所有三层都是相同的。
(1)位分配解码:
对于位率和采样频率的不同组合,存在不同的位分配表。注意,表头标中给出的位率是针对每个通道的。位分配表的解码由3步完成。第1步,从位流中为1个子带读信息nbal(2、3或者4)位信息,nbal的值由相关表给出,这些位应解释为无符号整数;第2步,使用这个数和子带的号作为指向表中的索引。值代表用于量化子带中样本的层号nlsleve。第3步,用于编码量化样本的位数、再量化系数以及用于3个相连子带样本的代码是否组织到1个代码中等信息都可确定。从位分配表中可以看出,某些最高子带从不分配。那些不分配位的最低子带的号
码将赋予标识符Sblimit。
(2)缩放因子选择信息解码:
一帧内一个子带的36个样本被分成三个相等的部分,每部分有12个样本。每部分可有自己的缩放因子,必须从位流中读出的缩放因子数目取决于scfsi[sb]。为具有非。位分配的子带的缩放因子选择信息scfsi[sb]从位流中读出。如果scfsi[sb]等于00,那么就传送3个缩放因子,这分别对应于部分0、1和2,如果scfsi[sb]了等于01,就传送2个缩放因子,第一个缩放因子对部分O和1有效,第2个缩放因子对部分2有效;如果scfsi[sb]等于10,那么只传送第1个缩放因子,它对所有三个部分都有效;如果scfsi[sb]等于11,那么传送2个缩放因子,第1个缩放因子对部分O有效,第2个缩放因子对部分1和2有效。
(3)缩放因子解码器:
对于具有非0位分配的每个子带,用于那个子带的编码缩放因子被从流中读出。编码的缩放因子号码(数目)和它们引用的子带样本部分由scfsi[sb]定义。并把6位长的编码缩放因子解释为一无符号整数,这个整数用做层I、层n缩放因子表的索引。这个表给出一组缩放因子,相关的子带样本在再量化后要乘以这个表中的对应缩放因子。
(4)子带样本的再量化:
接着读入编码的样本。在前面己经讲过,编码的样本以3个一组的形式出现,既代码包含有3个连续的样本。可以知道应为每个子带中从流中读出多少位(对应于一个3元组而言)。同样,也可以知道,代码是包含每个样本的3个连续的分开的代码,还是包含3个样本的包含代码(成组)。在最后一种情形下,必须把成组代码分成3个独立的代码,每个代码对应1个样本。应把组合代码看成是一无符号整数,成为C,下面的算法将提供三个独立分开的代码s[0]、s[1]和s[2]:
for(i=0;i<3;i++){
s[i]=c/neleves
c=cDIVnleves
{
在上面的算法描述中,nlevels是步数。3个代码中的每个第1位必须被置反,得到的结果为2的补码形式,其中MSB代表一1。再量化值可通过下面公式来获得:
其中S”’是小数,S”是再量化值常数C得D的值由表给出。再量化值必须被再缩放。乘法因子从表中查出,和上面描述的一样。再缩放值S’采用下面的式子计算:
(5)合成子带过滤器:
如果1个子带没有位分配给它,那么就把那个子带中的样本值为0。每当1个通道的所有咒个子带的样本都被计算后,它们应用到合成子带过滤器,并且能计算32个连续的音频样本。为了这个目的,必须采取后面的动作。用于矩阵操作的系数Nik由下面的式子给定:
由于视窗操作的系数D可从表中查到。一帧包含36*32=1152个子
带样本,在过滤后将产生1152个音频样本。
2.1.3 MPEG音频第Ⅲ层
通过使用混合过滤器可以提供额外的频率分辨率,使用MDCT把每个带分成18个频率行。MDCT的窗口长度为36。自适应窗口切换用用于控制时间因素。能够选择较短块(较好时间分辨率)使用的频率之上的频率。依赖于“mixedeeblock--flag”的频率以下的信号部分可用较好的频率分辨率进行编码,上面的信号部分用较好的时间分辨率进行编码。
频率分量使用非正规量化器进行量化,并用Huffman编码器进行编码。Huffman解码器使用18个不同的表中的1个表。缓冲器用来增强Huffman编码器的编码效率以及用于预回响(pre
展开阅读全文