还剩14页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
MPEG1Layer3MP3解码算法原理详解本文介绍了符合ISO/IEC11172-3MPEG1AudiocodecLayerILayerIIandLayerIIIaudiospecifications或ISO/IEC13818-3BCAudioCodec的音频编码原理通过madlib解码库进行实现
1、程序系统结构 mp3解码流程图其中同步及差错检查包括了头解码模块在主控模块开始运行后,主控模块将比特流的数据缓冲区交给同步及差错检查模块,此模块包含两个功能,即头信息解码及帧边信息解码,根据它们的信息进行尺度因子解码及哈夫曼解码,得出的结果经过逆量化,立体声解码,混淆缩减,IMDCT,频率反转,合成多相滤波这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备
2、主控模块主控模块的主要任务是操作输入输出缓冲区,调用其它各模块协同工作其中,输入输出缓冲区均由DSP控制模块提供接口输入缓冲区中放的数据为原始mp3压缩数据流,DSP控制模块每次给出大于最大可能帧长度的一块缓冲区,这块缓冲区与上次解帧完后的数据(必然小于一帧)连接在一起,构成新的缓冲区输出缓冲区中将存放的数据为解码出来的PCM数据,代表了声音的振幅它由一块固定长度的缓冲区构成,通过调用DSP控制模块的接口函数,得到头指针,在完成输出缓冲区的填充后,调用中断处理输出至I2S接口所连接的音频ADC芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音
3、同步及差错检测同步及差错检测模块主要用于找出数据帧在比特流中的位置,并对以此位置开始的帧头、CRC校验码及帧边信息进行解码,这些解码的结果用于后继的尺度因子解码模块和哈夫曼解码模块Mpeg1layer3的流的主数据格式见下图主数据的组织结构图其中granule0和granule1表示在一帧里面的粒度组1和粒度组2,channel0和channel1表示在一个粒度组里面的两个通道,scalefactor为尺度因子quantizedvalue为量化后的哈夫曼编码值,它分为bigvalues大值区和count11值区CRC校验表达式为X16+X15+X2+
13.1 帧同步帧同步目的在于找出帧头在比特流中的位置,ISO1172-3规定,MPEG1的帧头为12比特的“111111111111”,且相邻的两个帧头隔有等间距的字节数,这个字节数可由下式算出N=144*比特率/采样率如果这个式子的结果不是整数,那么就需要用到一个叫填充位的参数,表示间距为N+
13.2 头信息解码头信息解码目的是找出这一帧的特征信息,如采样率,是否受保护,是否有填充位等头信息见下图帧头信息结构图其长度为4字节,数据结构如下:typedefstruct tagHeader{unsignedintsync:11;//同步信息unsignedintversion:2;//版本unsignedintlayer:2;//层unsignedinterror2protection:1;//CRC校正unsignedintbit2rate2index:4;//位率索引unsignedintsample2rate2index:2;//采样率索引unsignedintpadding:1;//空白字unsignedintextension:1;//私有标志unsignedintchannel2mode:2;//立体声模式unsignedintmodeextension:2;//保留unsignedintcopyright:1;//版权标志unsignedintoriginal:1;//原始媒体unsignedintemphasis:2;//强调方式}HEADER
3.3 帧边信息解码帧边信息解码的主要目的在于找出解这帧的各个参数,包括主数据开始位置,尺度因子长度等帧边信息如下图所示帧边信息side_infomation表
3.4 main_data_beginmain_data_begin主数据开始是一个偏移值,指出主数据是在同步字之前多少个字节开始需要注意的是,
1.帧头不一定是一帧的开始,帧头CRC校验字和帧边信息在帧数据中是滑动的
2.这个数值忽略帧头和帧边信息的存在,如果main_data_begin=0则主数据从帧边信息的下一个字节开始参见下图同步示意图
3.5 block_typeblock_type指出如下三种块类型block_type=0长块block_type=1开始块block_type=3结束块block_type=2短块在编码过程中进行IMDCT变换时,针对不同信号为同时得到较好的时域和频域分辨率定义了两种不同的块长长块的块长为18个样本,短块的块长为6个样本这使得长块对于平稳的声音信号可以得到更高的频率分辨率,而短块对跳变信号可以得到更高的时域分辨率由于在短块模式下,3个短块代替1个长块,而短块的大小恰好是一个长块的1/3,所以IMDCT的样本数不受块长的影响对于给定的一帧声音信号,IMDCT可以全部使用长块或全部使用短块,也可以长短块混合使用因为低频区的频域分辨率对音质有重大影响,所以在混合块模式下,IMDCT对最低频的2个子带使用长块,而对其余的30个子带使用短块这样,既能保证低频区的频域分辨率,又不会牺牲高频区的时域分辨率长块和短块之间的切换有一个过程,一般用一个带特殊长转短(即,起始块block_type=1)或短转长(即终止块,block_type=3)数据窗口的长块来完成这个长短块之间的切换因此长块也就是包括正常窗,起始块和终止块数据窗口的数据块;短块也包含18个数据,但是是由6个数据独立加窗后在经过连接计算得到的
3.6big_valuescount1每一个粒度组的频谱都是用不同的哈夫曼表来进行编码的编码时,把整个从0到奈奎斯特频率的频率范围(共576个频率线)分成几个区域,然后再用不同的表编码划分过程是根据最大的量化值来完成的,它假设较高频率的值有较低的幅度或者根本不需要编码从高频开始,一对一对的计算量化值等于“0”的数目,此数目记为“rzero”然后4个一组地计算绝对值不超过“1”的量化值(也就是说,其中只可能有-1,0和+1共3个可能的量化级别)的数目,记为“count1”,在此区域只应用了4个哈夫曼编码表最后,剩下的偶数个值的对数记为“bigvalues”,在此区域只应用了32个哈夫曼编码表在此范围里的最大绝对值限制为8191此后,为增强哈夫曼编码性能,进一步划分了频谱也就是说,对bigvalues的区域(姑且称为大值区)再细化,目的是为了得到更好的错误顽健性和更好的编码效率在不同的区域内应用了不同的哈夫曼编码表具体使用哪一个表由table_select给出从帧边信息表中可以看到当window_switch_flag==0时,只将大值区在细分为2个区,此时region1_count无意义,此时的region0_count的值是标准默认的;但当window_switch_flag==1时再将大值区细分为3个区但是由于region0_count和region1_count是根据从576个频率线划分的,因此有可能超出了big_values*2的范围,此时以big_values*2为准.region0_count和region1_count表示的只是一个索引值,具体频带要根据标准中的缩放因子频带表来查得.参见下图:缩放因子、大值区、1值区和零值区分布图
3.7处理流程
4、缩放因子scalefactor解码缩放因子用于对哈夫曼解码数据进行逆量化的样点重构根据帧边信息中的scalefactor_compress和标准中的对应表格来确定的slen1和slen2对缩放因子进行解码,即直接从主数据块中读取缩放因子信息并存入表scalefac_l[gr][ch][sfb]和scalefac_s[gr][ch][sfb]中对第2粒度组解码时,若为长块,则必须考虑尺度因子选择信息
4.1尺度因子带(scalefactor-band)在mpeglayer3中576条频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度因子带,每个长窗有21个尺度因子带而每个短窗有12个尺度因子带
4.2scfsiscfsi尺度因子选择信息用于指出是否将粒度组1的尺度因子用于粒度组2如果为0表示不用,则在比特流中需读取粒度组2的尺度因子
4.3处理流程 缩放因子解码流程图
5、哈夫曼解码哈夫曼编码是一种变长编码,在mp3哈夫曼编码中,高频的一串零值不编码,不超过1的下一个区域使用四维哈夫曼编码,其余的大值区域采用二维哈夫曼编码,而且可选择地分为三个亚区,每个有独立选择的哈夫曼码表通过每个亚区单独的自适应码表,增强编码效率,而且同时降低了对传输误码的敏感度在程序实现上,哈夫曼表逻辑存储采用了广义表结构,物理存储上使用数组结构查表时,先读入4bit数据,以这4bit数据作为索引,其指向的元素有两种类型,一种是值结构,另一种是链表指针式结构,在链表指针式结构中给出了还需要读取的bit数,及一个偏移值如果索引指向的是一个值结构,则这个值结构就包含了要查找的数据如果索引指向的是一个链表指针式结构,则还需再读取其中指定的比特数,再把读取出的比特数同偏移值相加,递归的找下去,直到找到值结构为止
5.1处理流程
6、逆量化
6.1逆量化公式逆量化由下面公式算出短窗模式长窗模式:其中is[i] 由huffman编码构造的频率线sbg subblock_gainscalefac_multiplier =scalefac_scale+1/2其它值均可在帧边信息中找到
7、联合立体声转换
7.1强度立体声转换在强度立体声模式中,左声道传的是幅值,右声道的scalefactor传的是立体声的位置is_pos需要转换的频率线有一个低边界,这个低边界是由右声道的zero_part决定的,并且使用右声道的尺度因子来作为is_pos强度立体声比左声道 右声道
7.2M_S立体声转换在M_S立体声模式中,传送的是规格化的中间/旁边声道的信息左声道 右声道 其中Mi是channel
[0]的值,Si是channel
[1]的值
7.3处理流程强度立体声模式MS_STEREO因公式单一,较易理解,故流程图略去
8、重排序重排序的目的在于把哈夫曼解码之后的短块的每个尺度因子带3个窗,每个窗sfbwidth尺度因子带宽度个采样的顺序整理成为每个子带三个窗,每个窗六个采样xr[sb][window][freq_line]的顺序
8.1处理流程 重排序处理流程图混淆缩减对于长块,在进入IMDCT之前应当先进行混淆缩减其算法思想是用蝶形算法进行相邻块相邻频率线的调整如图:混淆缩减算法图其计算公式如下其中ci可由ISO
1172.3tableB.9查得计算流程如下pascal 描述Forsb=1to32do Fori=0to7do Xar[18sb-i-1]=xr[18sb–i-1]cs[i]–xr[18sb+i]ca[i] Xar[18sb+i]=xr[18sb+i]cs[i]+xr[18sb-i-1]ca[i] EndforEndfor
10、IMDCT覆盖叠加MDCT的目的在于进行时域到频域的转换,减少信号的相关性,使得信号的压缩可以更加高效地完成,而它的反变换IMDCT的目的在于将信号还原为没有变换之前的数值,使频域值向时域值过渡其公式如下在进行了IMDCT变换之后,需对频率信号进行加窗、覆盖、叠加
10.1加窗长块开始块结束块短块的每个窗口分别计算
10.2叠加将每一块变换出来的值的前半部分与前一块的后半部分相加,并把后半部分保留来和下一块的前半部分相加如下公式resulti=zi+si fori=0to17si=zi+18 fori=0to
1710.3Szu-WeiLee的快速算法Szu-WeiLee的IMDCT快速算法是针对非2的n次幂个点的IMDCT快速算法他的主要步骤如下
1.将N点MDCT化为N/2点DCT-IV
2.将N/2点DCT-IV化为N/2点SDCT-II
3.将N/2点SDCT-II化为2个相同的N/4点SDCT-II
4.计算SDCT-II(9点)在本程序中,因为对短块使用这个快速算法并没有带来较大的速度改善,故只对长块使用此快速算法,相较于直接运算的648次乘和612次加来,它只用43次乘和115次加
11、频率反转在IMDCT之后,进入合成多相滤波之前必须进行频率反转补偿以校正多相滤波器组的频率反转方法是将奇数号子带的奇数个采样值乘以-
1.
12、合成多相滤波合成多相滤波的目的是将频域信号转化为时域信号其原理流程如下合成多相滤波算法图上图流程可简述如下
1.将从32个子带抽来的32个sample值通过一个矩阵运算算出64个中间值
2.将这64个中间值放入一个长度为1024的FIFO缓冲区这个缓冲区初始化为
03.从这个缓冲区中每连续的128个值中取头尾各32个值,合为64个值完成后组成512值的向量U
4.加窗,即将Ui与窗口系数Di相乘,得到另一512值向量W
5.最后将这512值向量W每连续的32个值中顺次取一个值,一次共取得512/32=16个值相加完成后一共取得32个最终的时域信号值ByeongGiLee的dct快速算法ByeongGiLee的DCT快速算法是用于2的n次幂个点的dct快速算法它用于N点的DCT时仅需N/2*log2N次乘法和小于3·*N/2*log2 N次加法其基本思想是,将N个点的DCT转化为两个N/2个点的DCT的和进一步分解,即重复这个过程,减少乘法数量由于向量Vi的运算是一个类似于DCT的变换,故使用了此快速算法32点运算共使用了80次乘法和80次加法119次减法术语说明MPEG MotionPictureExpertGroupIMDCT反离散余弦变换gr granule粒度组ch channel通道参考文献
1.ISO/IEC11172_
32.赖鸿志MPEG-1LAYER3音訊解碼器於DSP晶片之即時軟體實現
3.AnIntroductiontoDigitalAudio JohnWatkinson
4.Madlib源程序
5.Szu-WeiLee ImprovedAlgorithmforEfficientComputationfotheForwardandBackwardMDCTinMPEGAudioCoder
6.BYEONGGILEE ANewAlgorithmtoComputetheDiscreteCosineTransform。