MP3音频解码的仿真实现.doc_第1页
MP3音频解码的仿真实现.doc_第2页
MP3音频解码的仿真实现.doc_第3页
MP3音频解码的仿真实现.doc_第4页
MP3音频解码的仿真实现.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章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也可以用于低比特率(15kHzstereo112.128kbps14.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值定义Layer11层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)层层层0000FreeFreeFree00013232320010644840001196564801001286456010116080640110192968001112241129610002561281121001288160128101032019216010113522241921100384256224110141632025611104483843201111禁止使用禁止使用禁止使用 为了提供可能的最小延迟和复杂性,不需要解码器支持一连续可变位率(当在层和层时),层通过切换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)0044.101481032 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指定的模式00Stereo(立体声)01Joint_stereo(intensity_stereo或ms_strero)(联合立体声)10Dual_channel11Single_chanle 在层中,除联合立体声(Joint_stereo)之外的所有模式下,等32;在层中,在除联合立体声之外的所有模式下,约束值等于sblimit。在joint_stereo模式下,约束值由mode_extension确定。 Mode_extension:这些位用于joint_stereo模式中,在层和层中,它们表明哪个子带在iniensity_stereo中,所有其它子带按立体声编码,mode_extension的含义如“表2.6”所示。表2.6 mode_ectension的定义Mode_extension00Intensity_stereo中的子带4-31,bound=401Intensity_stereo中的子带8-31,bound=810Intensity_stereo中的子带12-31,bound=1211Intensity_stereo中的子带16-31,bound=16 在层中,它们表明应用何种类型的联合立体声(intensity_stereo和ms_stereo)模式所要应用的频率范围在算法中是隐含的。见“表2.7”。表2.7 mode_extension和intensity_stereo和ms_stereo的关系Mode_extensionIntensity_stereoMs_stereo00offoff01offoff10offon11onon 如果模式位指定为立体声,则使用一种“立体声”(stereo)模式,或者当模式位指定联合立体声并且mode_extension指定intensity_Stereo为“off”、ms_stereo为“off”时也使用立体声模式。 copyright:如果该位等于0,那么位流没有版权保护,否则相应的流受版权保护。用户在使用时应注意。 original/copy:如果该位为0,表示位流是复制品,否则为原始位流。 Emphasis:表明应使用的解加重(de_emphesis)的类型,见“表2.8”。表2.8 emphasis值表Emphasis指定的emphasis00无0150/15微秒10保留11CCITT J.172.4音频数据(层) altocationchsb:表明对通道ch的子带sb中的样品进行编码所需要的位数。对于模式intensity_stereo中的子带,位流只包含1个分配数据单元/子带,见“表2.9”。表2.9 allocationchsb值表Allocationchsb位/样本0 012233445566778899101011111212131314141515禁止 Sealfaetorchsb:表明通道ch的子带sb的因子,这个因子用于乘通道ch中子带sb的再量化样本。6位构成一个无符号整数,由于后面表“层、层缩放因子”的索引。 Samplechsbs:通道ch的子带sb的第s个样本的编码表示。对于iniensity_sterco模式中的子带,样本的编码表示对两个通道都有效。2.5 音频数据(层) alocationchsb:包含有与通道ch中子带样本的量化器有关的信息,以及有关3个连续样本信息(已被集成到1个代码中)和用于编码样本的位数的信息。该域的含义与长度依赖于子带数、位率和采样频率。这个域中的位形成一个无符号整数,用作表“层位分配表”中相关表的索引,该表给定用于量化的层次数。对在intensity_stereo模式下的子带而言,位流只包含1个分配数据元素/子带。Scfsichsb:缩放因子选择信息。这个域给出关于通道中子带传送的缩放因子信息,以及为该帧中有效信号部分传送的缩放因子数目的信息。sefsisb的取值如“表2.10”所示。表2.10 secfsisb的取值表scfsisb含义00传送3个缩放因子,部分0、1和2各1个01传送2个缩放因子,第1个对部分O和部分1有效,第2个对部分3有效10传送1个缩放因子,它对部分3有效效11传送2个缩放因子,第1个对部分0有效,第2个对部分1和部分2有效 sealefaetorchsbp:指定缩放因子。通道ch中的子带sb的样本和帧中p部分的样本要用这个缩放因子乘,从而再量化。6位组成一个无符号整数,用作后面表“层、层缩放因子”。 groupingchsb:这是1个函数,用于确定对通道ch的子带sb的样本进行编码时成组是否起作用。成组的含义如下:在当前块gr的通道ch中,当前子带中的三个连续样本(三元组)用一共同的代码字(而不是三个不同的代码字)进行编码和传送。如果在当前使用的位分配表中,在sb(行)的allocationsb(列)中的值为3、5或9,那么groupingch为真,否则为假。在模式intensity_stereo中,对两个通道而言成组都是有效的。 samplecodeehsbgr:通道ch的子带sb的块gr中3个连续样本的编码表示。对于iniensity_stereo模式下的子带而言,samplecode的编码表示对两个通道都有效。 samlelchsbs:通道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分配的位数时,应与用于辅助信息的位数相等。 scfsichscfsi_band:在层中,缩放因子选择信息与音频层工作方法类似。主要差别在于使用变量scfsi_band来把scfsi应用到缩放因子组(而不是单个缩放因子)上。把缩放因子应用到块上的操作scfsi由来控制。scfsi的取值如“表12”所示。如果切换到短窗口(shortwindow),即对于一个块有block_type=2,那么对这一帧而言总是0。 sefsi_band为缩放因子组(scfsi_bands)控制缩放因子选择信息的用法。如“表2.11”。表2.11 scfsi_band的取值及其含义scfsiscfsi_band含义0为每个块传送缩放因子0为块0传送缩放因子,它对块也有效表2.12 scfsi_band的取值及其含义00,1,2,3,4,516,7,8,9,10211,12,13,14,15316,17,18,19,20 part2_3_lengthgrch:该值包含用于缩放因子和Huffman代码数据的main_data位的数目。由于辅助信息的长度总是相同的,该值用于计算下一个块的主要信息开始位置和附属信息(如果有的话)的位置。注意,单通道音频帧包含17个字节长的辅助信息,而双通道音频帧包含32个字节的辅助信息。 big_valuesgrch:每个块的频谱使用不同的Huffman代码来编码。从0到Nyqulst的整个频率范围被分成几个区域,每个区域用不同的表进行编码。区域部分是以最大量化值为依据。在完成这一动作时,假定位于较高频率上的值具有较低的幅度值,并且可能根本不需要编码。从高频率开始,一对等于0的量化被计数,把计数值命名为“rzero”。然后,绝对值不超过1的4个量化值(也就是只有三个可能的量化层)被计数,该数命名为“countl”。同样,有偶数个值保留下来。最后,延伸到0的频谱区中的值的数目被命名为“big_values”。这个范围内的最大绝大值被约束为8195。 global_gaingrch:量化器大小信息辅助信息变量global_gain来传送,它用对数方法量化。 sealefac_compressgrch:选择用于传送缩放因子的位数,具体操作时按下面的表:如果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_compressslen1slen2000101202303430511612713820921102211331230133114421543 在长块的的情形下,IMDCT为每18个输出值产生36个值。对输出进行视窗变换并且块的前半部分与前面块的后半部分进行叠加。这样得到的向量是1个带的多相过滤器区的合成部分的输入。 在短块的情形下,完成3个变换,每个变换产生12个值。这3个向量被分别进行视窗变换和叠加处理。在结果向量两端级联6个O将使向量的长度为36,然后按长变换的输出进行处理。 mixed_block_flaggrch:表明低频进行变换时所用的窗口类型与高频进行变换时所用的窗口类型不同。如果mixed_block_flag为0,那么所用的块按block_typegrch表明的方式进行变换;如果为mixed_block_flag为1,那么用正常窗口对对应于两个最低频率多相子带的频率进行变换,而剩余的30的子带按block_typegrch指定的方式进行变换。 table_selectgrchvegion:根据显示量化值和信号的局部统计特性使用不同的Huffman代码表。在MPEG音频中给出了32个可能的表。subblock_gaingrchwindow:表明对于一个子块而言与全程增益的增益偏移量。仅与块类型2(短窗口)一起使用。子块的值必须被除(在解码器中)。 region_countgrch:对频谱进行进一步剖分,以增强编码器的性能。它是对由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_countgrch:region_count的值为区域1中缩放因子带的数目与1的差。同样,如果block_type=2,那么表示不同的时间槽的缩放因子带被分别计数。 preflaggrch:这是对量化进行额外放大一种方便途径。如果preflag被置位,那么把表的值加到缩放因子上,这与用表值乘再量化的缩放因子的效果相同。如果block_type=2,那么从不使用preflag。 scalefac_csalegrch:缩放因子按对数方法量化,步大小为2或者。“表15”给出了用在再量化方阵中的放大因子倍数。表2.14 放大因子倍数Scalefac_scalegrsclaefac_multipiler00,511 couniltable_selectgrch:这是1个标志,对于幅值不超过1到4量化值区域,它从两个可能的Huffinan代码表中选择1个。 scalefac_lgrchsfb,sealefac_sgrchsfbwindow,is_possbf:缩放因子,用于彩色和量化噪音。如果量化噪音有正确的形状着色,那么它被完全屏蔽。与层和层不同,层缩放因子不提供与量化信号的局部最大值有关的任何信息。在层中缩放因子用在解码器中,以获得值组的部分因子。在层的情形中,组延伸到几个频率行。这些组称为缩放因子带,并且选择它们与临界带尽可能相似。 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个样本。每部分可有自己的缩放因子,必须从位流中读出的缩放因子数目取决于scfsisb。为具有非。位分配的子带的缩放因子选择信息scfsisb从位流中读出。如果scfsisb等于00,那么就传送3个缩放因子,这分别对应于部分0、1和2,如果scfsisb了等于01,就传送2个缩放因子,第一个缩放因子对部分O和1有效,第2个缩放因子对部分2有效;如果scfsisb等于10,那么只传送第1个缩放因子,它对所有三个部分都有效;如果scfsisb等于11,那么传送2个缩放因子,第1个缩放因子对部分O有效,第2个缩放因子对部分1和2有效。 (3)缩放因子解码器: 对于具有非0位分配的每个子带,用于那个子带的编码缩放因子被从流中读出。编码的缩放因子号码(数目)和它们引用的子带样本部分由scfsisb定义。并把6位长的编码缩放因子解释为一无符号整数,这个整数用做层I、层n缩放因子表的索引。这个表给出一组缩放因子,相关的子带样本在再量化后要乘以这个表中的对应缩放因子。 (4)子带样本的再量化: 接着读入编码的样本。在前面己经讲过,编码的样本以3个一组的形式出现,既代码包含有3个连续的样本。可以知道应为每个子带中从流中读出多少位(对应于一个3元组而言)。同样,也可以知道,代码是包含每个样本的3个连续的分开的代码,还是包含3个样本的包含代码(成组)。在最后一种情形下,必须把成组代码分成3个独立的代码,每个代码对应1个样本。应把组合代码看成是一无符号整数,成为C,下面的算法将提供三个独立分开的代码s0、s1和s2:for(i=0;i3;i+)si=c/nelevesc=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_echo)理想情形。输入缓冲区的大小就是1帧的大小(对于层m而言,位率为每个通道160KBb/s)。使用的短期缓冲区技术称为“位存储器”,原因是它使用短期(shortseterm)可变位率,该位率与平均位率有最大的偏移量。 每个帧包含2个块的数据,帧中的音频数据按下列方式进行分配: .main_data_begin指针 .两个块的辅助信息 .辅助信息块1 .辅助信息块2 .头标和音频的这部分内容组成了辅助信息流。 .缩放因子和Huffinan代码数据块1 .缩放因子和Huffman代码数据块2 .附属数据 这些数据组成主要数据流。main_data_begin指针指向一负向位移,相对于头标的第1个字节位置。 (l)解码 解码的第一个动作是使解码器与输入位流同步,具体做法与其它层做法一样。头标信息包括同步字的前32位被读入,有关采样频率的信息用来选择sealefacto_band表。 (2)辅助信息 必须把辅助信息从位流中抽取出来并保存起来,供解码器相关帧中的内容使用。表选择信息用于选择Huffman编码器和位的树木和ESC位的数目(linbits)。 (3)main_data的开始 main_data(缩放因子、Huffinan编码数据和附属信息)不必与附属信息相邻存放,这在图中描述。通过使用当前帧的main_data_begin指针可定位主要数据部分的开始位置。主要数据的分配是这样的:当下一帧的头标到达输入缓冲区时,所有主要数据驻留在输入缓冲区中。当解码器主要数据时,要越过头标(header)和辅助信息。根据bitrate_index和padding_blt可知道它们的位置。header长度总是4个字节,辅助信息的长度为17个字节(在single_channel模式)或者32个字节(在其它模式)。主要数据能跨度1个以上的头标和辅助信息块。 (4)缓冲区考虑 下面的规则可用于计算1个块的最大位数: 缓冲区长度为7680位,该值用作每种位率下的最大缓冲区。在第层的最高可能位率(每个立体声信号320Kb/s)和采样频率48KHz下,平均帧长度为(320000/48000)*1152=7680位。因此在这个位率和采样频率下,帧的长度必须恒定。这意味着在64Kb/s下,允许的最大误差(短时间缓冲区)为7650-4*765=4608位,实际的偏差等于main_data_begin偏移量指针指定的字节数。实际的最大偏差为位。对于中等位率,延迟和缓冲区长度都可以相应计算。在立体声位流中,允许对左右声道的缓冲区进行交换。由于对缓冲区大小的约束,在bitrate_index=14(也就是每个立体声信号320Kb/s数据速率)的情况下,main_date_begin总置为0。在这种情形下,所有数据应在邻近头标之间分配。 当采样频率低于48KHz时,应对缓冲区加以约束,以便相同的物理缓冲区足够大,不会出现上溢情形。 (5)缩放因子 缩放因子根据slen1和slen2解码,而slen2和slen2由scalefac_compress确定。解码后的值可用做表的入口或用来为每个缩放因子带直接计算因子。当解码第2块时,必须考虑scfsi。对于那些对应的scfsi的置为1的带而言,第1块的缩放因子也为第2个块所用,因此,对第2个块就不传送缩放因子。 对于编码缩放因子的位数part2_length来标识,并且按以下方式计算: 当(gr=0)OR(gr=1)AND(sefsichsefsi_band=0)时,这些公式是有效的,不使用缩放因子选择信信息。 (6)Huffman解码 根据量化系数可以产生用于的实现Huffman代码树的必要信息。首先,号码为table_selectgrchregion的表可对ebig_valu数据进行解码,在区域。、区域1和区域2的频率行对进行解码,直到big_value数目的line_pair(行对)被解码后为止。剩余的Huffmancodebits用表根据countable_selectgrch进行解码,直到所有的Huffman代码位被解码后或表示576个频率行的量化值被解码后,解码工作才算完成。如果要解码的Huffman代码位多于必须解码的代码数目后,那么就把这多出的位当成填补位,并丢弃。使用countltable_select可导出变量countl的值,countl的值为解码四元组的数目。 (7)再量化器 非正规量化器使用乘方规则。对于每个Huffman解码器的输出值is,计算。这可以通过表查找或计算来完成。 再量化和所有缩放公式 一个完整的公式描绘从Huffman解码值到合成滤波器区的输入的所有处理,所有必要的缩放因子都包含在这个公式中。输出数据通过再量化器样本来重构。全程增益和子块增益值影响个时间窗口(在block_type=2的情形下)内的所有值。缩放因子和预标志(preflag)进一步调整每个缩放因子带内的增益。 下面是用于短窗口的再量化公式,在缓冲区索引之处的Huffhlan解码值称isi,在索引之处的合成过滤器的输入成为: Pretabsfb的值查表得到,公式中的常量210用于对输出进行必要的缩放,它是系统常量。假定合成滤波器区根据下面的公式来实现,解码器输出值(PCM样本)的范围在-1.0到1.0之间。 (8)重定序 如果使用短块(block_type=2),那么再缩放数据xrsef_bandwindowfreq_line应重定次序(按子带次序,xrsubbandwindowfre_line),重定序操作在IMDCT操作之前完成。 (9)合成过滤器区 合成过滤器区结构使用“别名”缩减(alias reduetion)机制来对频率进行预处理,并把处理结果输入到IMDCT矩阵中,每18个进入一个变换块中。输出值的前半部分被加到来自最后块的保存的叠加值上。这些值是新的输出值,并且作为多相过滤器区的输入值。输出值的后半部分被保存起来,以便与下一个数据块进行叠加。对于多相过滤器的每个第2个子带,每个第2个输入值被乘-1,从而校正多相过滤器区的负频率。 别名缩减 对于长block_type块(block_type!=2),合成滤波器区的输入先进行处理,以达到别名缩减的目的,然后再由IMDCT处理。 IMDCT(ImProvedModifiedDiscreteCosineTransform) 在下面的描述中,n是经过视窗变换的样本(对于短块而言,n=12,对于长块而言,n=36。当block的类型为short时,3个短块中的每

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论