DSP课程设计 MP3语音压缩_第1页
DSP课程设计 MP3语音压缩_第2页
DSP课程设计 MP3语音压缩_第3页
DSP课程设计 MP3语音压缩_第4页
DSP课程设计 MP3语音压缩_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、DSP系统课程设计利用DSP实现语音mp3压缩课程设计报告学院电子信息工程学院小组成员指导教师高海林时间2016年7月14日目录一、实验目的.3二、技术指标及设计要求.3三、实验原理.43.1MP3编码原理.43.1.1概述.43.1.2人耳听觉心理学模型(ThePsychoacousticModel).43.1.3滤波器排(Thefilterbank).53.1.4位元分配及量化(BitAllocationandQuantization).63.1.5霍夫曼编码(HuffmanEncoding).83.1.6位元串格式.83.2MP3解码原理.93.2.1MP3解码流程图.93.2.2解码步

2、骤分析.93.3硬件结构.193.2.1BJTU-DSP5502实验系统板.193.2.2TLC320AIC23的内部结构及工作原理.20四、程序设计.204.1MP3编码.204.2MP3解码.22五、方案优化.26六、总结与体会.26七、参考文献.26一、实验目的掌握利用DSP进行信号采集的方法,掌握利用DSP进行语音信号的压缩和解压方法,以及语音信号的回放方法。学会A/D、D/A的工作原理和使用,学会A/D、D/A转换器的编程方法。以语音信号处理为依托,深入理解信号的抽样和重建的基本方法,提高学生系统地思考问题和解决实际问题的能力。通过调用DSPCSL库对McBSP接口的编程,学会DSP

3、片上外设的使用方法。二、技术指标及设计要求2.1基本部分:(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型采用mp3压缩算法。(2)设置A/D的采样率为32KHz,从Line-in或MIC输入口实时采集语音信号,利用McBSP1接收寄存器将外部语音数据接收到DSP中,接收1s数据。(3)采用适当的语音压缩算法,将接收到的数据进行压缩。也可以将接收到的数据直接压缩后存储。(4)对上述已压缩数据进行解压。(5)将解压后的数据经Headphone端口输出,利用耳机试听。(6)使用指示灯对语音存储和回放过程进行指示。2.2发挥部分:(1)将A/D采样率和D/A的转换率设置为不同频率,对比输出的

4、语音信号,发现不同并解释。(2)实现mp3语音压缩。三、实验原理3.1MP3编码原理3.1.1概述图3-1MP3编码器方框图如图3-1所示,就单声道而言,MP3的一个编码框包含1152个声音取样,每个取样为16位元。MP3编码时,首先将原始输入的16-bitPCM音讯经过滤波器排分析(FilterBankAnalysis),转换成32个等频宽的子频带讯号(SubbandSignals),然后通过改良式离散余弦转换(MDCT,ModifiedDiscreteCosineTransform),将每个子频带信号,再细分为18个次频带。然后根据第二声响心理模型(PsychoacousticModell

5、l)所提供的讯号遮噪比(SMR,Signal-to-MaskRatio),对每一子频带讯号,做位元分配及量化编码。最后只要将编码后的资料依照MPEG-1定义的位元串的型式输出即可。3.1.2人耳听觉心理学模型(ThePsychoacousticModel)1.最小听觉门槛判定(Theminimalauditionthreshold)人耳的听力范围是20Hz-20kHz的频率范围,但是人耳对不同的频率声音的灵敏度是不同的,不同频率的声音要达到能被人耳听到的水平所需要的强度是不一样。那么通过计算,可以把音乐文件中存在但不能被人耳听到的声音去掉。通过这原理,我们还可以建立模型,把大部分数据空间分配到

6、人耳最灵敏的2kHz到5kHz范围,其余频率分配比较少的空间。2.人耳的遮蔽效应(TheMaskingeffect)遮蔽效应表现在强信号会遮蔽邻近频率的弱信号。用生活经验来说,在安静的房间中,一根针掉到地上都能听见,可到了大街上,就算手机音量调到最大,来电时也未必能听见,而手机的声音确确实实是存在的,原因就是被周围更大的声音遮蔽了。有了对遮蔽效应的研究成果,编码器就能根据已建立的数学模型,计算强信号对附近弱信号的遮蔽,把能引起人们注意的声音才保留。3.1.3滤波器排(Thefilterbank)滤波器排包含分析子频带滤波器和改良式离散余弦转换两部分。如图3-2所示。图3-2分析子频带滤波器和M

7、DCT1.分析子频带滤波器MP3是一种子带编码,使用的是一个32通道的伪标准正交镜像滤波器组来完成这一功能,该滤波器组实际上是32个512阶的FIR带通滤波器,通带频率由低到高。当PCM信号输入滤波器组后,就会被分解成32路等频宽的子带信号,如图3-3所示。每输入32个PCM讯号做一次滤波器排分析,然后可以得到32个输出(每个子频带有一个结果),由于一个编码框有1152个PCM信号,所以共需要36次的子频带分析。图3-3分析子频带滤波器组示意图2.改良式离散余弦变换(MDCT)将原始的音讯经过滤波器排分析,分成32个等宽的子频带讯号后,为了提高频谱的分辨率,将每个子频带信号再经MDCT细分成数

8、个频线信号。MDCT的运算共包含了MDCT窗框、MDCT与长窗框假象处理三个部分。如图3-2所示。首先介绍MDCT的四种窗框:长窗框(NormalWindow)、长短窗框(StartWindow)、短窗框(ShortWindow)与短长窗框(StopWindow)。使用长窗框做转换,可得较好的频谱分辨率,而使用短窗框做转换,则可得较佳的时间轴分辨率。至于长短窗框是用于长窗框要转换到短窗框时的过渡窗框,短长窗框则相反。决定好窗框后就可以做MDCT的运算,表达式如下:其中Zk是子频带讯号与MDCT窗框相乘后的结果,若此处选择短窗框则做短区块的DCT运算(n=12),否则就做长区块的DCT运算(n=

9、36)。由于滤波器排的特性,当原始音频被分成32个子频带时,在频谱上可见邻近的子频带间有明显的重叠现象,而处于重叠区间的讯号将会同时影响两个子频带。所以在经过MDCT转成频线信号时,需对邻近相对应的频线信号做特别处理,以减少因混叠所造成的噪声,影响音讯质量。处理的方式是将处在相对应位置的频线之能量做一定比例的增减。3.1.4位元分配及量化(BitAllocationandQuantization)1.位元分配(Bitallocation)位元分配的目的,在于使得每个比例因子频带之遮噪比(MNR,Mask-to-NoiseRatio)达到最大,以得到最佳的音讯质量。这是一个反复的过程,每次找出最

10、小MNR的频带,分配位元给此频带以提高MNR,接着重新计算各频带的MNR,然后再不断重覆此调整过程,直到没有足够的位元可供调整为止。因此在进行位元分配之前,需要知道可以用来编码之位元数,以及各子频带的MNR。假设用SNR(m)来表示讯号经过m个位元量化之后的signal-to-noiseratio(SNR),那么在这个临界频带中,用来量测人耳可感知的失真之参数mask-to-noiseratio(MNR)可以计算如下:SMR是由声响心理模型提供。有了MNR之后,就可以开始位元分配与量化。MP3编码在量化时,将频域划分成21个比例因子频带(scalefactorband)为单位来处理。量化器对频

11、谱量化后,计算需要多少位元来对做霍夫曼编码,若超过可用之位元数,就要调整stepsize的大小,如此可以降低所需的位元数。决定好量化后的频线后,再和未量化前的频线做噪声估计。如果求出的比例因子频带的失真超过可容忍的大小(由人耳听觉心理模型提供),编码器就会放大该频带内的值,这样就可以使得该频带分到更多的位元,也就和前面所提到有关利用MNR来做位元分配的观念呼应。如此一来,再对做量化的操作,重复上述操作一直到没有任何比例因子频带的误差超过可容忍的失真大小即可。2.非均匀量化上式是MP3编码的量化公式,其中xr(i)是从MDCT输出并调整过的频线,ix(i)为量化过后的频线(整数值),0.75次方

12、是用来使得量化器能提供一致的SNR值,而nint()代表四舍五入的函数。图3-4量化器的输入输出关系曲线图图3-4是MP3量化器的输入输出关系图,可以看出这是一个非均匀量化的量化器。0.75次方是造成非均匀量化的原因,如果把0.75次方改成1次方,就会变为均匀量化。编码器一方面要削减量化噪音,让它在人耳遮蔽曲线以下;另一方面要保证bitrate满足要求。实际上这里就是要确定两个数值:一个是确定bitrate的步进值(gainvalue),另一个是削减量化噪音的增益因子(ScaleFactor),这两个系数会在正式编码之前确定下来,确定过程由两个嵌套的迭代回路完成:失真控制回路(Distorti

13、onControlLoop)和量化速率控制回路(NonuniformQuantizationRateControlLoop)。u内部迭代回路(RateLoop)量化以后的数据送进Huffman编码器,当发现比特数大于可用流量时,编码器会返回信息,让RateLoop调整步进值以增大量化步长,从而让数据流量减小。循环会一直进行,尝试不同的量化步长,直到Huffman编码以后的数据流量足够小。因为这个回路是用来控制码率的,所以叫做RateLoop。u外部迭代回路(noisecontrolloop)显然,这个回路的作用就是控制量化噪音(quantizationnoise),让其保持在听觉心理学提供的屏

14、蔽临界线(maskingthreshold)以下。每一个频段都会有一个增益因子,一开始编码器以1.0作为默认因子,如果量化噪音量超过允许的值,那么回路就会调整增益因子,来把量化噪音降下来。更少的量化噪音意味着流量增大,码率需要提高,所以增益因子每次改变以后,RateLoop都要进行调整,让码率符合要求。频线经量化之后再做霍夫曼编码。3.1.5霍夫曼编码(HuffmanEncoding)为了提高压缩率,在量化之后又使用了无失真且非固定长度的霍夫曼编码,将量化后的频线ix(i)编码。在量化后除了在MDCT使用短区块的情况之外,量化器将输出的频线依频率来排序。对于使用短区块的情况而言,在相同的频率下

15、,又有三个窗框值,所以在每个比例因子频带里其顺序为频率再来才是窗框。排序的优点在于可使得最大的值分布在低频,而在高频时有一连频的零(zerovalues),能够提高压缩比。量化器将频线ix(i)分成三个区间,分别为零区间(zeroregion)、count1区间和big_value区间,这样就可以让编码器依照不同的区间使用不同的霍夫曼表(Huffmantable),而此霍夫曼表是利用各个区间里的统计特性而建立的。在高频区间,编码器将连续的一串零视为一个区间,称为零区间(zeroregion),在此区间是不用编码的,因为这个区间的长度的信息可由另两个区间的长度求之。而第二个区间称为count1区

16、间,是由一连串的0和1组成,此区间的霍夫曼编码方式是以四个取样为一组来查表,所以此区间的长度为4的倍数。第三个区间为big_value区间,此区间会出现较大的数值,这里所用的霍夫曼表是以两个量化后的频线为一组来编码,而此区间可再细分成三个区间,每个区间的霍夫曼表不一定相同,根据各区间的最大数值来决定合适的霍夫曼表。3.1.6位元串格式MP3的位元串格式共分为四个部分,分别是档头(header)、错误侦测码(CRC)、附属资料(sideinformation)和主要信息(maindata)。档头和附属资料记载译码时所需的信息,其中单声道的音讯必须包含136位元的附属资料,双声道的音讯则需要256

17、位元。在档头区的第16个位元会记录是否使用错误侦测码,若有,则在档头区之后会接着16位元的侦测码。错误侦测码是用来对档头在译码时做侦错的动作,避免因为档头出现错误而无法正确的译码资料;主要资料区是存放着比例因子(scalefactor)和经过量化、位元分配与无失真的霍夫曼编码之后的音乐讯号。3.2MP3解码原理3.2.1MP3解码流程图图3-5MP3解码流程图说明:其中同步及差错检查包括了头解码模块在主控模块开始运行后,主控模块将比特流的数据缓冲区交给同步及差错检查模块,此模块包含两个功能,即头信息解码及帧边信息解码,根据它们的信息进行尺度因子解码及哈夫曼解码,得出的结果经过逆量化,立体声解码

18、,混淆缩减,IMDCT,频率反转,合成多相滤波这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。3.2.2解码步骤分析1.主控模块主控模块的主要任务是操作输入输出缓冲区,调用其它各模块协同工作。其中,输入输出缓冲区均由DSP控制模块提供接口。输入缓冲区中放的数据为原始mp3压缩数据流,DSP控制模块每次给出大于最大可能帧长度的一块缓冲区,这块缓冲区与上次解帧完后的数据(必然小于一帧)连接在一起,构成新的缓冲区。输出缓冲区中将存放的数据为解码出来的PCM数据,代表了声音的振幅。它由一块固定长度的缓冲区构成,通过调用DSP控制模块的接口函数,得到头指针,在

19、完成输出缓冲区的填充后,调用中断处理输出至I2S接口所连接的音频ADC芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音。2.同步及差错检测同步及差错检测模块主要用于找出数据帧在比特流中的位置,并对以此位置开始的帧头、CRC校验码及帧边信息进行解码,这些解码的结果用于后继的尺度因子解码模块和哈夫曼解码模块。Mpeg1layer3的流的主数据格式见下图:图3-6主数据的组织结构图其中granule0和granule1表示在一帧里面的粒度组1和粒度组2,channel0和channel1表示在一个粒度组里面的两个通道,scalefactor为尺度因子quantizedvalue

20、为量化后的哈夫曼编码值,它分为bigvalues大值区和count11值区CRC校验:表达式为X16+X15+X2+12.1帧同步帧同步目的在于找出帧头在比特流中的位置,ISO1172-3规定,MPEG1的帧头为12比特的“111111111111”,且相邻的两个帧头隔有等间距的字节数,这个字节数可由下式算出:N=144*比特率/采样率如果这个式子的结果不是整数,那么就需要用到一个叫填充位的参数,表示间距为N+1。2.2头信息解码头信息解码目的是找出这一帧的特征信息,如采样率,是否受保护,是否有填充位等。头信息见下图:图3-7帧头信息结构图2.3帧边信息解码帧边信息解码的主要目的在于找出解这帧

21、的各个参数,包括主数据开始位置,尺度因子长度等等,帧边信息如下表所示:表3-1帧边信息(side_infomation)表2.4main_data_beginmain_data_begin(主数据开始)是一个偏移值,指出主数据是在同步字之前多少个字节开始。需要注意的是:1.帧头不一定是一帧的开始,帧头CRC校验字和帧边信息在帧数据中是滑动的。2.这个数值忽略帧头和帧边信息的存在,如果main_data_begin=0,则主数据从帧边信息的下一个字节开始。2.5block_typeblock_type指出如下三种块类型:block_type=0长块block_type=1开始块block_typ

22、e=3结束块block_type=2短块在编码过程中进行IMDCT变换时,针对不同信号为同时得到较好的时域和频域分辨率定义了两种不同的块长:长块的块长为18个样本,短块的块长为6个样本。这使得长块对于平稳的声音信号可以得到更高的频率分辨率,而短块对跳变信号可以得到更高的时域分辨率。由于在短块模式下,3个短块代替1个长块,而短块的大小恰好是一个长块的1/3,所以IMDCT的样本数不受块长的影响。对于给定的一帧声音信号,IMDCT可以全部使用长块或全部使用短块,也可以长短块混合使用。因为低频区的频域分辨率对音质有重大影响,所以在混合块模式下,IMDCT对最低频的2个子带使用长块,而对其余的30个子

23、带使用短块。这样,既能保证低频区的频域分辨率,又不会牺牲高频区的时域分辨率。长块和短块之间的切换有一个过程,一般用一个带特殊长转短(即起始块block_type=1)或短转长(即终止块,block_type=3)数据窗口的长块来完成这个长短块之间的切换。因此长块也就是包括正常窗,起始块和终止块数据窗口的数据块;短块也包含18个数据,但是是由6个数据独立加窗后在经过连接计算得到的。2.6big_values,count1每一个粒度组的频谱都是用不同的哈夫曼表来进行编码的。编码时,把整个从0到奈奎斯特频率的频率范围(共576个频率线)分成几个区域,然后再用不同的表编码。划分过程是根据最大的量化值来

24、完成的,它假设较高频率的值有较低的幅度或者根本不需要编码。从高频开始,一对一对的计算量化值等于“0”的数目,此数目记为“rzero”。然后4个一组地计算绝对值不超过“1”的量化值(也就是说,其中只可能有-1,0和+1共3个可能的量化级别)的数目,记为“count1”,在此区域只应用了4个哈夫曼编码表。最后,剩下的偶数个值的对数记为“bigvalues”,在此区域只应用了32个哈夫曼编码表。在此范围里的最大绝对值限制为8191。此后,为增强哈夫曼编码性能,进一步划分了频谱。也就是说,对bigvalues的区域(姑且称为大值区)再细化,目的是为了得到更好的错误顽健性和更好的编码效率。在不同的区域内

25、应用了不同的哈夫曼编码表。具体使用哪一个表由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表示的只是一个索引值,具体频带要根据标准中

26、的缩放因子频带表来查得。图3-8缩放因子、大值区、1值区和零值区分布图3、缩放因子(scalefactor)解码缩放因子用于对哈夫曼解码数据进行逆量化的样点重构。根据帧边信息中的scalefactor_compress和标准中的对应表格来确定的slen1和slen2对缩放因子进行解码,即直接从主数据块中读取缩放因子信息并存入表scalefac_lgrchsfb和scalefac_sgrchsfb中。对第2粒度组解码时,若为长块,则必须考虑尺度因子选择信息。3.1尺度因子带(scalefactor-band)在mpeglayer3中576条频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺

27、度因子,这些组就叫做尺度因子带,每个长窗有21个尺度因子带而每个短窗有12个尺度因子带。3.2scfsiscfsi(尺度因子选择信息)用于指出是否将粒度组1的尺度因子用于粒度组2。如果为0表示不用,则在比特流中需读取粒度组2的尺度因子。4、哈夫曼解码哈夫曼编码是一种变长编码,在mp3哈夫曼编码中,高频的一串零值不编码,不超过1的下一个区域使用四维哈夫曼编码,其余的大值区域采用二维哈夫曼编码,而且可选择地分为三个亚区,每个有独立选择的哈夫曼码表。通过每个亚区单独的自适应码表,增强编码效率,而且同时降低了对传输误码的敏感度。在程序实现上,哈夫曼表逻辑存储采用了广义表结构,物理存储上使用数组结构。查

28、表时,先读入4bit数据,以这4bit数据作为索引,其指向的元素有两种类型,一种是值结构,另一种是链表指针式结构,在链表指针式结构中给出了还需要读取的bit数,及一个偏移值。如果索引指向的是一个值结构,则这个值结构就包含了要查找的数据。如果索引指向的是一个链表指针式结构,则还需再读取其中指定的比特数,再把读取出的比特数同偏移值相加,递归的找下去,直到找到值结构为止。5、逆量化5.1逆量化公式逆量化由下面公式算出:短窗模式:长窗模式:其中:isi:由huffman编码构造的频率线sbg:subblock_gainscalefac_multiplier:=(scalefac_scale+1)/2其

29、它值均可在帧边信息中找到。6.联合立体声转换6.1强度立体声转换在强度立体声模式中,左声道传的是幅值,右声道的scalefactor传的是立体声的位置is_pos。需要转换的频率线有一个低边界,这个低边界是由右声道的zero_part决定的,并且使用右声道的尺度因子来作为is_pos。强度立体声比左声道:右声道:6.2M_S立体声转换在M_S立体声模式中,传送的是规格化的中间/旁边声道的信息。左声道右声道其中Mi是channel0的值,Si是channel1的值6.3处理流程强度立体声模式:图3-9处理流程图7、重排序重排序的目的在于把哈夫曼解码之后的短块的每个尺度因子带3个窗,每个窗sfbw

30、idth(尺度因子带宽度)个采样的顺序整理成为每个子带三个窗,每个窗六个采样xrsbwindowfreq_line的顺序。图3-10重排序处理流程图8.混淆缩减对于长块,在进入IMDCT之前应当先进行混淆缩减。其算法思想是用蝶形算法进行相邻块相邻频率线的调整。如图:图3-11混淆缩减算法图9.IMDCT覆盖叠加MDCT的目的在于进行时域到频域的转换,减少信号的相关性,使得信号的压缩可以更加高效地完成,而它的反变换IMDCT的目的在于将信号还原为没有变换之前的数值,使频域值向时域值过渡。其公式如下:在进行了IMDCT变换之后,需对频率信号进行加窗、覆盖、叠加。10、频率反转在IMDCT之后,进入

31、合成多相滤波之前必须进行频率反转补偿以校正多相滤波器组的频率反转。方法是将奇数号子带的奇数个采样值乘以-1。11、合成多相滤波合成多相滤波的目的是将频域信号转化为时域信号。其原理流程如下:图3-12合成多相滤波原理图上图流程可简述如下:1.将从32个子带抽来的32个sample值通过一个矩阵运算算出64个中间值。2.将这64个中间值放入一个长度为1024的FIFO缓冲区(这个缓冲区初始化为0)。3.从这个缓冲区中每连续的128个值中取头尾各32个值,合为64个值。完成后组成512值的向量U。4.加窗,即将Ui与窗口系数Di相乘,得到另一512值向量W。5.最后将这512值向量W每连续的32个值

32、中顺次取一个值,一次共取得512/32=16个值相加。完成后一共取得32个最终的时域信号值。3.3硬件结构3.2.1BJTU-DSP5502实验系统板本次实验采用的BJTU-DSP5502实验系统,是一套DSP信号处理硬件实验系统,包括BJTU-DSP5502实验板和SEED-XDS510PLUS仿真器以及相关配件。图3-13BJTU-DSP5502实验系统图3-14BJTU-DSP5502板结构组成框图BJTU-DSP5502实验系统板主要包括:(1)DSP芯片1枚(U1):TMS320VC5502300MHz(2)SDRAM1枚(U5):2M32bit(8Mbytes)HY57V64322

33、0CT(3)FLASH1枚(U4):256K16bit(512Kbytes)SST39VF400A-70(4)CPLD1枚(U2):CY37064VP100(5)通信接口3个:仿真器JTAG接口(J1)、连接到PC机USB接口(J4)和UART接口(J2)(6)信号采集和输出端口:立体音输入接口line-in(J5,直接接电脑的语音输出端口)/麦克风输入接口(J7)/耳机音频输出接口(J6)(7)扩展板接口(J9,J10)3.2.2TLC320AIC23的内部结构及工作原理TLV320AIC23B是TI公司生产的高性能语音芯片,16、20、24、32位串行A/D、D/A转换电路。采样速率:可通

34、过DSP对其寄存器编程来设置,范围8KHz96KHz。内含抗混叠滤波器和重构滤波器。在ADC之后有一个抽取滤波器:提高输入信号的信噪比(通带截频0.416fs或0.4535fs)。在DAC之前有一个插值滤波器:保证输出信号平滑(通带截频0.416fs或0.4535fs)。内含11个寄存器,名称和功能如下(省略9、10、11):左侧line输入通道音量控制(地址:0000000)右侧line输入通道音量控制(地址:0000001)耳机左声道音量控制(地址:0000010)耳机右声道音量控制(地址:0000011)模拟音频通道控制(地址:0000100)数字音频通道控制(地址:0000101)采样

35、率控制(地址:0001000)数字音频接口格式设置(地址:0000111)四、程序设计4.1MP3编码#includeg_includes.h#includewave.h#includeLayer3.h#defineWAVE0xfb1externintwave_get(shortbuffer2samp_per_frame,void*config_in);intwrite_mp3(longbytes,void*buffer,void*config_in)config_t*config=(config_t*)config_in;config-mpeg.outbufferconfig-mpeg.ou

36、tprocessed=*(char*)buffer);config-mpeg.outprocessed+;return1;voiderror(char*s)printf(ERROR%sn,s);exit(1);staticvoidset_defaults(config_t*config)L3_set_config_mpeg_defaults(&config-mpeg);staticboolparse_command(config_t*config)config-infile=C:test.pcm;config-outfile=C:test.mp3;voidoutmp3(config_t*con

37、fig)FILE*fp=fopen(config-outfile,wb);fwrite(config-mpeg.outbuffer,sizeof(char),config-mpeg.outprocessed,fp);fclose(fp);intmain()config_tconfig;set_defaults(&config);/设定默认参数parse_command(&config);wave_open(&config);/打开pcm文件config.mpeg.samplerate_index=L3_find_samplerate_index(config.wave.samplerate);

38、if(config.mpeg.samplerate_index0)error(invalidsamplerate);config.mpeg.bitrate_index=L3_find_bitrate_index(config.mpeg.bitr);if(config.mpeg.bitrate_index0)error(invalidbitrate);if(config.mpeg.file=fopen(config.outfile,wb)=NULL)printf(Couldnotcreate%s.n,config.outfile);exit(1);config.get_pcm=&wave_get

39、;config.write_mp3=&write_mp3;L3_compress(&config);wave_close(&config);outmp3(&config);fclose(config.mpeg.file);exit(0);4.2MP3解码#include#include#includecommon.h#includedecode.hvoidmain(intargc,char*argv)/定义变量FILE*musicout;Bit_stream_strucbs;frame_paramsfr_ps;III_side_info_tIII_side_info;III_scalefac_

40、tIII_scalefac;unsignedintold_crc;layerinfo;intsync,clip;intdone=FALSE;unsignedlongframeNum=0;unsignedlongbitsPerSlot;unsignedlongsample_frames;/二进制方式打开文件typedefshortPCM2SSLIMITSBLIMIT;PCM*pcm_sample;char*file_in=D:test.mp3;char*file_out=D:test.pcm;pcm_sample=(PCM*)mem_alloc(long)sizeof(PCM),PCMSamp)

41、;fr_ps.header=&info;if(musicout=fopen(file_out,w+b)=NULL)printf(Couldnotcreate%s.n,file_out);exit(1);/以比特为单位取出文件包含的信息并存入相应内存open_bit_stream_r(&bs,file_in,BUFFER_SIZE);sample_frames=0;while(!end_bs(&bs)/尝试帧同步sync=seek_sync(&bs,SYNC_WORD,SYNC_WORD_LENGTH);if(!sync)done=TRUE;printf(nFramecannotbelocatedn);out_fifo(*pcm_sample,3,&fr_ps,done,musicout,&sample_frames);break;/解码帧头decode_info(&bs,&fr_ps);/将fr_ps.header中的信息解读到fr_ps的相关域中hdr_to_frps(&fr_ps);/输出相关信息if(frameNum=0)WriteHdr(

温馨提示

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

评论

0/150

提交评论