您好,欢迎访问三七文档
信息与通信工程学院多媒体课设Mpeg1-layer3解码器班级:2011211120班级:2011211120学号:2011210574学号:2011210574班内序号:06号班内序号:号学生姓名:陈明学生姓名:郭翔目录一:MPeg1-layer3解码器的基本原理...................................................................................1:Mp3解码过程了解...........................................................................................................2:Mp3解码程序框图............................................................................................................3:Mp3解码步骤原理分析解................................................................................................二:MP3主程序代码详析......................................................................................................1:比特流分解准备...............................................................................................................2:比特流分解代码分析.........................................................................................................3:霍夫曼解码代码分析.........................................................................................................4:程序其他解码代码分析.....................................................................................................三:Mp3解码器主程序代码展示及详悉...........................................................................四:Mp3解码器完整代码(另附)......................................................................................一:MPeg1-layer3解码器的基本原理1:Mp3解码过程了解Mp3的解码总体上可分为9个过程:比特流分解,霍夫曼解码,逆量化处理,立体声处理,频谱重排列,抗锯齿处理,IMDCT变换,子带合成,PCM输出。为了解上述9个过程的由来,简要描述mp3的压缩流程。声音是一个模拟信号,对声音进行采样,量化,编码将得到PCM数据。PCM又称为脉冲编码调制数据,是电脑可以播放的最原始的数据,也是MP3压缩的源。为了达到更大的数据压缩率,MPEG标准采用子带编码技术将PCM数据分成32个子带,每个子带都是独立编码的(参考《数字音频原理与应用》221页)。然后将数据变换到频域下分析,MPEG采用的是改进的离散余弦变换,也可以使用傅利叶变换(参考《数字音频原理与应用》225)。再下来为了重建立体声进行频谱按特定规则的排列,随后立体声处理,处理后的数据按照协议定义进行量化。为了达到更大的压缩,再进行霍夫曼编码。最后将一些系数与主信息融合形成mp3文件。解码是编码的反过程大概如下:1:所谓比特流分解是指将mp3文件以二进制方式打开,然后根据其压缩格式的定义,依次从这个mp3文件中取出头信息,边信息比例因子信息等。这些信息都是后面的解码过程中需要的。2霍夫曼编码是一种无损压缩编码,属于熵编码。Mp3的解码可以通过公式实时进行数据的解码,但往往采用的是通过查表法实现解码(节省了CPU时间资源)。(这部分是mp3解码工作量中最大的一部分)。3逆量化处理只是几个公式的操作,立体声处理:这部分的处理也只是对几个公式的操作。Stereo是一种立体声编码技巧,主要分为IntensityStereo(IS)和Mid/Side(M/S)stereo两种。IS的是在比较低流量时使用,利用了人耳对于低频讯号指向性分辨能力的不足,将音讯资料中的低频分解出来合成单声道资料,剩余的高频资料则合成另一个单声道资料,并另外纪录高频资料的位置资讯,来重建立体声的效果。例如钢琴独奏的录音就可以利用这种方法在有限的资料流量中减少音场资讯却大幅增加音色资讯。Mid/Side(M/S)stereo在左右声道资料相似度大时常被用到,纪录方式是将左右声道音讯合并(L+R)得到新的一轨,再将左右声道音讯相减(L-R)得到另外一轨,然后再将这两轨资料用上面提到听觉心理学模型与滤波器处理。Mid/Side(M/S)stereo与IS一样的是利用部分相位(phase)资讯的损失来换得较高的音色纪录资讯。一般的MP3是Mid/Sidestereo和IntensityStereo交替使用的)。3频谱重排列,抗锯齿处理,IMDCT变换,子带合成:这4个过程都是对若干公式的操作代码易懂,至于为什么要用这些公式,估计需要对MPEG编码有个了解才行。4PCM的输出是与c语言对文件的处理相关的。对文件的处理在比特流分解和霍夫曼解码总结:综上,对代码的理解难点集中在前两个环节,一是比特流分解,二是霍夫曼解码。比特流的分解难点在于c语言编程知识的应用。和一些算法的精短描述。霍夫曼解码部分的学习可以掌握霍夫曼的查表解码方法,很有学习价值的……-2:MP3解码器解码流程结构框图比特流同步及差错检查哈夫曼解码哈夫曼信息解码尺度因子解码逆量化重排序立体声解码混淆缩减合成多滤波IDMCT频率反转左声道MP3解码流程图3:解码步骤详细分析(一)同步及差错检测模同步及差错检测模块也就是比特流分解,主要用于找出数据帧在比特流中的位置,并对以此位置开始的帧头、CRC校验码及帧边信息进行解码,这些解码的结果用于后继的尺度因子解码模块和哈夫曼解码模块。Mpeg1layer3的流的主数据格式见下图:其中granule0和granule1表示在一帧里面的粒度组1和粒度组2,channel0和channel1表示在一个粒度组里面的两个通道,scalefactor为尺度因子quantizedvalue为量化后的哈夫曼编码值,它分为bigvalues大值区和count11值区(1.1)帧同步帧同步目的在于找出帧头在比特流中的位置,ISO1172-3规定,MPEG1的帧头为12比特的“111111111111”,且相邻的两个帧头隔有等间距的字节数,这个字节数可由下式算出:N=144*比特率/采样率。如果这个式子的结果不是整数,那么就需要用到一个叫填充位的参数,表示间距为N+1。(1.2)头信息解码头信息解码目的是找出这一帧的特征信息,如采样率,是否受保护,是否有填充位等。头信息见下图:混淆缩减合成多滤波频率反转IDMCT右声道帧头信息结构图(1.3)帧边信息解码帧边信息解码的主要目的在于找出解这帧的各个参数,包括主数据开始位置,尺度因子长度等。(1.4)main_data_beginmain_data_begin(主数据开始)是一个偏移值,指出主数据是在同步字之前多少个字节开始。需要注意的是,1.帧头不一定是一帧的开始,帧头CRC校验字和帧边信息在帧数据中是滑动的。2.这个数值忽略帧头和帧边信息的存在,如果main_data_begin=0,则主数据从帧边信息的下一个字节开始。参见下图:(1.5)big_values,count1每一个粒度组的频谱都是用不同的哈夫曼表来进行编码的。编码时,把整个从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值区和零值区分布图(二)、哈夫曼解码哈夫曼编码是一种变长编码,在mp3哈夫曼编码中,高频的一串零值不编码,不超过1的下一个区域使用四维哈夫曼编码,其余的大值区域采用二维哈夫曼编码,而且可选择地分为三个亚区,每个有独立选择的哈夫曼码表。通过每个亚区单独的自适应码表,增强编码效率,而且同时降低了对传输误码的敏感度。在程序实现上,哈夫曼表逻辑存储采用了广义表结构,物理存储上使用数组结构。查表时,先读入4bit数据,以这4bit数据作为索引,其指向的元素有两种类型,一种是值结构,另一种是链表指针式结构,在链表指针式结构中给出了还需要读取的bit数,及一个偏移值。如果索引指向的是一个值结构,则这个值结构就包含了要查找的数据。如果索引指向的是一个链表指针式结构,则还需再读取其中指定的比特数,再把读取出的比特数同偏移值相加,递归的找下去,直到找到值结构为止。(三)、逆量化逆量化公式逆量化由下面公式算出:短窗模式:长窗模式:其中:is[i]:由huffman编码构造的频率线sbg:subblock_gainscalefac_multiplier:=(scalefac_scale+1)/2其它值均可在帧边信息中找到。(四)、联合立体声转换强度立体声转换在强度立体声模式中,左声道传的是幅值,右声道的scalefactor传的是立体声的位置is_pos。需要转换的频率线有一个低边界,这个低边界是由右声道的zero_part决定的,并且使用右声道的尺度因子来作为is_pos。(五)、重排序重排序的目的在于把哈夫曼解码之后的短块的每个尺度因子带3个窗,每个窗sfbwidth(尺度因子带宽度)个采样的顺序整理成为每个子带三个窗,每个窗六个采样xr[sb][window][freq_line]的顺序。(六).混淆缩减对于长块,在进入IMDCT之前应当先进行混淆缩减。其算法思想是用蝶形算法进行相邻块相邻频率
本文标题:多媒体课设实验报告
链接地址:https://www.777doc.com/doc-2504020 .html