Mp3解码算法流程_第1页
Mp3解码算法流程_第2页
Mp3解码算法流程_第3页
Mp3解码算法流程_第4页
Mp3解码算法流程_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、Mp3解码算法流程 第1章     声明本文档版权归属于西安交通大学人工智能与机器人研究所 作者:李国辉  ghli第2章     Mp3解码算法流程       MP3的全称为MPEG1 Layer-3音频文件, MPEG音频文件是MPEG1标准中的声音部分,也叫MPEG音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer1、Layer2、Layer3,且分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同

2、层次的编码。MPEG音频编码的层次越高,编码器越复杂,压缩率也越高,MP1和MP2的压缩率分别为4:1和6:1-8:1,而MP3的压缩率则高达10:1-12:1。一分钟CD音质的音乐,未经压缩需要10MB的存储空间,而经过MP3压缩编码后只有1MB左右。不过MP3对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“心理声学模型”,即编码时先对音频文件进行频谱分析,然后再根据心理声学模型把谱线分成若干个阈值分区,并计算每个阈值分区的阈值,接着通过量化和熵编码对每个谱线进行编码,最后形成具有较高压缩比的MP3文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。2.1. M

3、p3文件格式       MP3文件以一帧为一个编码单元,各帧编码数据是独立的。为了清晰而准确地描述mp3文件格式,下面采用位流语法描述,这种语法格式与c语言近似,易于理解,且描述清晰。其中粗体表示码流中的数据项,bslbf代表位串,即“Bit string, left bit first ”,uimsbf代表无符号整数,即”unsinged integer, mostsignificant bit first”,数字表示该数据项所占的比特数。2.1.1.      

4、0; Audio Sequenceaudio sequence()  while (true)         frame()   2.1.2.        Audio Frameframe()       header()       error_check() &

5、#160;     audio_data()       ancillary_data()2.1.3.        Headerheader()      syncword                &#

6、160;                                                 &#

7、160;        12           bslbf      ID                         &#

8、160;                                                 &#

9、160;          1             bslbf      layer                     

10、                                                  

11、           2             bslbf      protection_bit                   &

12、#160;                                               1   

13、;          bslbf      bitrate_index                                

14、60;                                   4             bslbf  &

15、#160;   sampling_frequency                                            

16、             2             bslbf      padding_bit                 

17、0;                                                 

18、0;   1             bslbf      private_bit                           &#

19、160;                                            1      

20、       bslbf      mode                                     &

21、#160;                                           2       

22、;      bslbf      mode_extension                                    &#

23、160;                          2             bslbf      copyright    &#

24、160;                                                 &#

25、160;                    1             bslbf      original/home         

26、0;                                                 

27、0;        1             bslbf      emphasis                       

28、;                                                  

29、;  2             bslbf2.1.4.        Error Checkerror_check() if (protection_bit=0)       crc_check          &#

30、160;                                                 &#

31、160;        16           rpchof2.1.5.        Audio data , Layer IIIaudio_data()      main_data_begin         &

32、#160;                              9             uimsbf      if(mode=s

33、ingle_channel)private_bits                         5             bslbf      else private_bits &

34、#160;                                      3             bsl

35、bf       for(ch=0;ch<nch;ch+)         for(scfsi_band=0;scfsi_band<4;scfsi_band+)          scfsichscfsi_band             

36、0;                   1             bslbf       for(gr=0;gr<2;gr+)         for(ch=0;ch&l

37、t;nch;ch+)          part2_3_lengthgrch                              12        &#

38、160;  uimsbf          big_valuesgrch                                 9     

39、        uimsbf          global_gaingrch                                

40、; 8             uimsbf          scalefac_compressgrch                         &#

41、160; 4             bslbf          window_switching_flaggrch                         1

42、             bslbf           if(window_switching_flaggrch)            block_typegrch          &

43、#160;                     2             bslbf            mixed_block_flaggrch   

44、                         1             uimsbf             for(region=0

45、;region<2;region+)              table_selectgrchregion                             5  &

46、#160;          bslbf             for(window=0;window<3;window+)              subblock_gaingrchwindow      &

47、#160;               3             uimsbf              else       for(region=0;re

48、gion<3;region+)        table_selectgrchregion                                     

49、      5             bslbf      region0_countgrch                        

50、60;             4             bslbf      region1_countgrch                &

51、#160;                                      3            

52、; bslbf             preflaggrch                                   

53、0;                               1             bslbf      scalefa

54、c_scalegrch                                                &

55、#160;      1             bslbf      count1table_selectgrch                      

56、                             1             bslbf       main_data2.1.6.

57、        Main_datamain_data()       for(gr=0;gr<2;gr+)         for(ch=0;ch<nch;ch+)           if(window_switching_flaggrch=1)&&(block_typ

58、egrch=2)             if(mixed_block_flaggrch)               for(sfb=0;sfb<8;sfb+)                scalefac_l

59、grchsfb                                   0.4         uimsbf     

60、          for(sfb=3;sfb<12;sfb+)                 for(window=0;window<3;window+)                  sc

61、alefac_sgrchsfbwindow                0.4         uimsbf              else       for(sfb=0;sfb&l

62、t;12;sfb+)         for(window=0;window<3;window+)          scalefac_sgrchsfbwindow                       &#

63、160;        0.4         uimsbf              else           if(scfsich0=0|(gr=0)       

64、0;      for(sfb=0;sfb<6;sfb+)             scalefac_lgrchsfb                          &#

65、160;          0.4         uimsbf           if(scfsich1=0|(gr=0)              for(sfb=6;sfb<11;sfb+)  &

66、#160;          scalefac_lgrchsfb                                     0.4

67、60;        uimsbf           if(scfsich2=0|(gr=0)              for(sfb=11;sfb<16;sfb+)             scal

68、efac_lgrchsfb                                     0.3         uimsbf  

69、         if(scfsich3=0|(gr=0)              for(sfb=16;sfb<21;sfb+)             scalefac_lgrchsfb        

70、60;                            0.3         uimsbf              Hu

71、ffmancodebits()              for(b=0;b<no_of_ancillary_bits;b+)         ancillary_bit      1     bslbf2.1.7.        H

72、uffmancodebitsHuffmancodebits()       for(l=0;l<big_values*2;l+=2)        hcod|x|y|                         

73、0;                                         0.19       bslbf  

74、;      if(|x|=15&&linbits>0)  linbitsx                                   1.13   

75、;    uimsbf        if(x!=0)signx                                     &

76、#160;                            1             bslbf        if(|y|=15&&

77、amp;linbits>0)  linbitsy                                   1.13       uimsbf  

78、0;     if(y!=0) signy                                           &

79、#160;                  1              bslbf         isl=x         isl+1=y &

80、#160;     for(;l<big_values*2+count1*4;l+=4)        hcod|v|w|x|y|                              &#

81、160;                       1.6         bslbf        if(v!=0) signv        &

82、#160;                                                 &

83、#160;   1             bslbf        if(w!=0) signw                        &#

84、160;                                   1             bslbf  

85、      if(x!=0) signx                                          

86、60;                   1             bslbf        if(y!=0) signy        

87、0;                                                 

88、0;   1             bslbf         isl=v         isl+1=w         isl+2=x         isl+3=y

89、0;             for(;l<576;l+)         isl=02.1.8.        Ancillary dataancillary_data()       if(layer=1|layer=2)    

90、     for(b=0;b<no_of_ancillary_bits;b+)          ancillary_bit                              

91、                                1             bslbf 2.2. 数据项的含义2.2.1.  

92、;      HeaderØ       Syncword 同步头,表示一帧数据的开始,共12位,全1即0XFFF。表格 21 LayerLayer '11'Layer I'10'Layer II'01'Layer III'00'reserved 表格 22 Bitrate_index bitrate specified (kBit/s)bitrate_index

93、Layer ILayer IILayer III '0000'freefreefree '0001'323232 '0010'644840 '0011'965648 '0100'1286456 '0101'1608064 '0110'1929680 '0111'22411296 '1000'256128112 '1001'28816012

94、8 '1010'320192160 '1011'352224192 '1100'384256224 '1101'416320256 '1110'448384320 '1111'forbiddenforbiddenforbidden  Ø       ID 算法标识位,“1”表示MPEG音频,“0”保留。Ø  &#

95、160;    Layer 用来说明是哪一层编码,如表格 21 Layer所示。Ø       Protection_bit 用来表明冗余信息是否被加到音频流中,以进行错误检测和错误隐蔽。“1”表示未增加,“0”表示增加。Ø       Bitrate_index用来指示该帧的bitrate,如表格 22 Bitrate_index所示。Ø    

96、   Sampling_frequency用来指示采样频率,如表格 23 Sampling_frequency所示。表格 23 Sampling_frequencysampling_frequencyfrequency specified (kHz)'00'44.1'01'48'10'32'11'reserved Ø       Padding_bit如果该位为1,那么帧中包含一个额外槽,用于把平均位率调节到采样

97、频率,否则该位必须为0。在采样频率为44.1kHz时,填补是必要的,在自由格式中也可能需要填补。Ø       Private_bit留做私用,没有定义。Ø       Mode定义通道模式,如表格 24  Mode所示。 表格 24  Modemodemode specified'00'stereo'01'joint_stereo (intensity_stereo and

98、/or ms_stereo) '10'dual_channel'11'single_channel  Ø       Mode_extension用来标识采用了哪一种joint_stereo,具体对应的频带范围隐含在算法中,如表格 25  Mode_extension所示。表格 25  Mode_extensionmode_extension '00'subbands  4-31 in intensity_stereo

99、, bound=4'01'subbands  8-31 in intensity_stereo, bound=8'10'subbands 12-31 in intensity_stereo, bound=12'11'subbands 16-31 in intensity_stereo, bound=16 Ø       Copyright表明版权用,“1”表示有版权,“0”表示没有版权。Original/copy :表明原版还是复制,“1”表示原版

100、,“0”表示复制。Emphasis :表明加重音类型,如表格 26  Emphasis所示。表格 26  Emphasisemphasisemphasis specified'00'none'01'50/15 microseconds'10'reserved'11'CCITT J.17 2.2.2.        Error Check       CRC校验的基

101、本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。在MP3协议中采用了CRC-16生成CRC码,其生成多项式如下:2.2.3.        Side information       Sideinformation 指的是在aud

102、io_data中main_data之前的一部分信息。这部分提供了解码中一些辅助的信息,用来帮助整个解码过程。为了帮助理解这一部分数据项的含义,会在下面大致阐述mp3解码所用的基本概念。Ø       Main_data_begin       表示一帧数据main data的开始位置。它表示main data相对于该帧同步头的负偏移。这里涉及到一个bit reservoir的技术,它改变了每帧的可用比特数为常数的限制,而是围绕一个长时间的平均值(目标比特率

103、)变化。因为MP3的编码方式是采用Huffman编码,所以编码后每一帧的数据长度是不一样的,可能有的大于目标比特率为每一帧分配的空间,有的可能小于这个空间,所以为了增加空间利用率,当前帧未使用完的空间可以保存起来留给后面需要的帧使用,因此每一帧的main data开始位置可能在它的header和sideinformation之前,而main_data_begin就是用来指示这个开始位置的,这种技术就叫做bit reservoir。Ø       Private_bits留做私用。Ø  

104、     Scfsi、scalefac_compress参考2.3.4 缩放因子(scalefactor)Ø       Part_2_3_length表示main data中scalefactor和huffman数据所占用的比特数。Ø       Global_gain全局量化步长。Ø       Wind

105、ow_switching_flag、block_type和mixed_block_flag参考2.3.5 节的长短块切换Ø       Table_select、big_values、count1_table_select、region0_count和region1_count参考2.3.2 Huffman码表的选择Ø       Subblock_gain短窗块量化时所用的增益偏移量。Ø   &

106、#160;   Preflag和scalefac_scale在反量化过程中对压缩数据还原时用到的变量。2.3. Mp3解码算法所用的基本概念2.3.1.        子带和缩放因子频带       压缩之后的mp3数据是以一桢为单位的,每一桢分为两节(granule),这两节在编解码时相对独立,从每一节中可以解码出576个pcm数据,两节可解出1152个pcm数据。从二进制101码流中得到我们所需要的信息的第一步就是huff

107、man解码,huffuman编码信息存放在每一节中的Huffmancodebits( )中,通过huffman解码可以得到576个值,这576个值在不同节类型(参考2.3.5 节的长短块切换)下有不同的含义,下面分情况描述: u     该节为长块       这576个值代表576条频率线上的值,它们是时域中576个pcm值经过时频变换的结果。这576条频率线从低到高分为32个子带,每个子带包含18条频率线。解出来的这576个值是整数,需要进行反量化变成浮点数,反量化的过程

108、并不是一条频率线为单位进行的,而是若干条频率线为单位进行的,这若干条频率线组成了频带(band),叫做缩放因子频带(scalefactorband),顾名思义,在一个缩放因子频带内的频率线在反量化时共用缩放因子。在44.1khz的采样率下,缩放因子频带的划分如所示:表格 27  长块的缩放因子频带划分scalefactor bandwidth of bandindex of startindex of end04031447248113412154416195420236624297630358836439844511010526111126273121674891320901091

109、424110133152813416116341621951742196237185023828719542883412076342417              其中,频率线418至575不需要归属于某一个scalefactor band, 因为属于这一个频带的频率线在进行反量化时,系统提供默认的反量化因子。 u     该节为短块       这576

110、个值代表192条频率线上的值,这192条频率线从低到高分为32个子带,每个子带包含6条频率线。每一条频率线上有三个值,分别属于三个窗(window0、window1和window2)。这192条频率线被划分为若干缩放因子频带,在44.1khz情况下,划分方式如下:表格 28  短块的缩放因子频带划分scalefactor bandwidth of band index of startindex of end040314472481134121546162158222961030397124051814526591866831022841051130106135  

111、;            其中,频率线136至192不需要归属于某一个scalefactor band, 因为属于这一个频带的频率线在进行反量化时,系统提供默认的反量化因子。按先后顺序解出来的这576个值先是按缩放因子频带从低到高排列,在每一个缩放因子频带内,按window0,window1,window2排列,在每一个window中,频率线从低到高排列。 u     该节是混合块    

112、0;  在这种情况下,按先后顺序解出来的576个值分为两部分,第一部分(前36个值)是长块部分,故它们代表36条频率线,这36条频率线(参考表格 27  长块的缩放因子频带划分)划分为8个缩放因子频带;第二部分(后540个值)是短块部分,它们代表180个频率线,每个频率线上有三个值,分别属于window0、window1和window2,这180个频率线(参考表格 28  短块的缩放因子频带划分)划分为9个缩放因子频带(scalefactorband3àscalefactor band11)。     &

113、#160; 综合上述三种情况,这576值排列方式如下所示:图 21不同情况下huffman解码得到的576个值的含义2.3.2.        Huffman码表的选择       从Huffmancodebits( )中解码得到576个值的过程不是一个简单的查表过程,这涉及到换表的过程。在解码时,当从一个缩放因子频带过渡到另一个缩放因子频带时,huffman码表可能需要改变。Huffman解码得到的576个值分为三个部分,如下所示:图 22 

114、bigvalues和count1的含义        在大值区(xxx),得到的值较大,一共有bigvalues*2个值,每两个值一起编码;在小值区(-),值只能为-1,0,+1,一共有count1*4个值,每四个值一起编码;在零值区(000)值为零,不需要编码。       在不同区域编码时,用到的huffman表是不一样的。 u     在大值区编码时,为了进一步提高编码效率,大值区又分为三个区域:re

115、gion0、region1和region2,在不同区域用不同的huffman表编码。region的划分是以缩放因子频带为单位划分的。在side information中,region0_countgrch和region1_countgrch提供了划分信息。region0_count+1表示在region0区的缩放因子频带的个数,region1_count+1表示在region1区的缩放因子频带的个数。需要说明的是,如果是短块或者混合块中的短块部分,一个缩放因子频带被计数三次,例如,对于短块来说,region0_count为8意味着region1从scalefactor band 3开始。Reg

116、ion2区的长度在side information中并没有给出,但是根据big_valuesgrch、region0_count和region1_count可以计算出来。在得到大值区region的划分之后,就可以根据table_selectgrchregion来选择在每个区域所用的huffman码表,一共有32个huffman码表可供选择,在mp3官方协议错误!未找到引用源。AnnexB Table 3-B.7中给出了这32个表。 u     在小值区,所用huffman表的选择信息由count1table_selectgrch提供。

117、需要说明的是,小值区的长度是count1*4,虽然在side information中并没有count1,但解码程序知道在耗尽part2_3_lengthgrch长度的码流之后就可以判断已经达到了小值区的末尾。        2.3.3.        huffman码表的特点       大值区的huffuman表一个入口项可得到两个值,小值区的huffman表一个入口项可得到四个值。

118、大值区的huffman表有一个参数为linbits(见2.1.7)。当linbit为0时,该huffman表只能用来编码小于等于15的数。当linbit不为0时,该huffman表可用来编码值大于15的数,当用这样的huffman码表编码时,在hcod|x|y|之后的码流中有linbit位,这长度为linbit的位串表示无符号整数,它与x(或者y)相加后表示x(或者y)真正的编码值。 2.3.4.        缩放因子(scalefactor)     

119、  如前所述,一个缩放因子频带内的频率线在反量化时共用缩放因子,在码流中,缩放因子被编码于main_data中(见2.1.6)。要解码得到缩放因子,首先需要知道该缩放因子所占的比特数,在side information中scale_compressgrch提供了这样的信息,首先需要查找如下表格:表格 29  scale_compressscale_compressslen1slen2000101202303430511612713821922102311311232133314421543       

120、下面针对不同的节(块)类型说明slen1和slen2的含义。 u     该节为长块slen1表示缩放因子频带0到10所用缩放因子的长度;slen2表示缩放因子频带11到20所用缩放因子的长度。 u     该节为短块slen1表示缩放因子频带0到5所用缩放因子的长度;slen2表示缩放因子频带6到11所用缩放因子的长度。 u     该节为混合块在这种情况下,长块部分(sfb0到sfb7)和短块部分(sfb3到sf

121、b5)所用的缩放因子的长度相同,为slen1;短块部分(sfb6到sfb11)所用的缩放因子长度相同,为slen2。 为了进一步地减少mp3码流的大小,节1(granule1)有时会共用节0(granule 0)的缩放因子信息,是否共用由字段scfsiscfsi_band来决定,如下所示:表格 210  scfsiscfsiscfsi_band 0scalefactors are transmitted for each granule1scalefactors transmitted for granule 0 are also valid for granul

122、e 1 表格 211  scfsi_bandscfsi_bandscalefactor bands (see Annex B,Table3-B.8)00,1,2,3,4,516,7,8,9,102111531620        只有granule1的长块才可以共用前一节的缩放因子信息,对于短块来说,scfsi为0。知道缩放因子的共用就不难理解在2.1.6(Main_data)中位流的组织形式。 2.3.5.       &#

123、160;节的长短块切换       节的类型由block_type来定义,如果window_switching_flag未置位,那么block_type的值为0。如果window_switching_flag置位,那么block_type由字段block_typegrch给出,如下所示:表格 212  block_typeblock_typegr 0reserved 1start block23 short windows3end block      

124、当block_type为0、1、3时,该节属于长块。当block_type为2时,如果mixed_block_flaggrch为0,则该节为短块;mixed_block_flaggrch为1,则该节为混合块。长块和短块在解码时算法有较大区别。 2.4. mp3解码具体流程       MP3解码的流程如下所示,解码的主要过程包括Preprocessing、Huffman decoding、Requantization、Reordering、Stereo decoding、Alias reduction、IMDCT、Frequ

125、ency inversion、Synthesis filter bank,最后输出原始的PCM数据。图 23  解码流程图2.4.1.        预处理(Preprocessing)       这个步骤主要是完成Header和Side information的解码,得到后面解码所需要的一些信息,并保存起来。2.4.2.        Huffman decodi

126、ng       在2.3.1(子带和缩放因子频带)和2.3.2(Huffman码表的选择)中已经详细介绍了,在这里就不再重叙。2.4.3.        反量化(Requantization)       经过Huffman解码之后的值必须经过反量化的处理,反量化过程根据使用的windows使用不同的反量化运算公式,其反量化的公式如下: u     短块:公式 21u   &

温馨提示

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

评论

0/150

提交评论