MP3语音压缩的DSP设计与实现_第1页
MP3语音压缩的DSP设计与实现_第2页
MP3语音压缩的DSP设计与实现_第3页
MP3语音压缩的DSP设计与实现_第4页
MP3语音压缩的DSP设计与实现_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE17上海大学2014~2015学年冬季学期研究生实验报告课程名称:DSP技术及其应用课程编号:07S009005题目:MP3语音压缩的DSP设计与实现研究生姓名:学号:评语:成绩:任课教师:评阅日期:

MP3语音压缩的DSP设计与实现2014年12月25日—、实验要求与目的实验要求:对单声道、44.1KHz采样率、16位量化精度的音频信号进行压缩,实现*mp3格式的数据结构。实验目的:熟悉掌握MatlabR2010a软件的使用,及音频信号的采集与处理;学习掌握C语言,并熟悉掌握VS2013的仿真与调试;熟悉掌握CCS5.5软件的仿真与调试;熟悉掌握PCM、WAV以及MP3等音频信号的数据结构;熟悉掌握MP3压缩的原理;二、实验设备与环境本实验采用的硬件环境为:宏碁笔记本电脑,2.2GHzPentium(R)Dual-CoreCPU,i3处理器,2.00G内存,32位Windows7操作系统。使用的软件有:MatlabR2010a、MicrosoftVisualStudio2013以及CodeComposerStudio5.5.0。其中在CodeComposerStudio5.5.0中,仿真目标芯片选型为:Genericdevice-->GenericC64xxDevice。三、整体实验方案设计本实验主要包括以下三个部分:(1)Matlab录音:在Matlab平台,利用其自带的波形记录函数wavecord函数录制单通道、16位分辨率、采样率为44.1K音频信号,并保存为wav格式音频文件(10秒);(2)Matlab压缩:在Matlab平台,利用lamb工具,即mp3write函数,对音频进行mp3压缩(仅作为CCS的参考)。(3)CCS(VS2013)压缩:1、利用fread函数读取WAV文件,并解析其头部信息;2、利用fread函数读取一帧MP3对应的576个PCM数据(1152个采样值);3、对576个PCM数据进行多相滤波器,将其分成32个频宽大小相同的子频带,即变换为18*32个样本数据。4、进行MDCT变换,将分成的32个子带信号进一步细分,产生32*18=576个频线输出。5、对MDCT输出的信号,经过失真控制环和量化率控制环,即量化器的处理,最终实现信号的非线性量化。6、由霍夫曼编码(Huffmancode)做最后压缩处理,压缩后得到一个记录每个符号代表的字符串的编码表以及一连串由符号组成的信息内容,该编码方式可以节约20%的空间。7、将编码后的数据打包成MP3帧格式,并实现比特流数据输出。四、实验原理1、音频信号基本知识声音的数字化过程主要包括四个过程(如图所示):(1)采样,对振幅随时间连续变化的模拟信号波形按一定的时间间隔取出样值,形成在时间上不连续的脉冲序列;(2)量化,将模拟信号的幅度,在动态范围内划分为相等间隔的若干层次,把采样输出的信号电平按照四舍五入的原则归入最靠近的量值。(3)编码,把采样、量化所得的量值变换为二进制数码的过程称为编码。(4)压缩,依据声音信息中存在着多种冗余信息、听觉器官的不敏感性以及采样的标本中存在着相关性,对编码后的二进制信号进行压缩。图、声音数字化流程在对模拟音频信号进行采样量化编码后,将得到数字音频。数字音频的质量取决于采样频率、量化位数和声道数三个因素(如表1所示)。1)采样频率采样频率是指一秒钟时间内采样的次数。采样频率与声音频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。通常声音信号最高频率约为3.4kHz,则采样频率取至少为6.8kHz。在本实验中,我们采用的是CD的采样标准,即44.1kHz.2)量化位数量化位数也称“量化精度”,是描述每个采样点数值的二进制位数。例如,8位量化位数表示每个采样值可以用2的8次方,即256个不同的量化值之一来表示,而16位量化位数表示每个采样值可以用2的16次方,即65536个不同的量化值之一来表示。量化噪声则是指某个采样时间点的模拟值和最近的量化值之间的差,误差最大可以达到离散间距的一半。一般量化位数越大,量化噪声越小。在本实验中,我们采用的是16位的量化精度。3)声道数声音通道的个数称为声道数,是指一次采样所记录产生的声音波形个数。记录声音时,如果每次生成一个声波数据,称为单声道;每次生成两个声波数据,称为双声道(立体声)。随着声道数的增加,所占用的存储容量也成倍增加。本实验,为了降低语音文件的大小,以及实验的难度采用单声道。表1、数字音频质量的技术参数表采样频率量化位数声道数含义每秒钟抽取声波幅度样本的次数每个采样点用多少二进制位表示数据范围使用声音通道的个数特点采样频率越高、声音质量越好、数据量也越大量化位数越多、音质越好、数据量也越大立体声比单声道的表现力丰富,但数据量翻倍常用值11.025、22.05和44.1k8位、16位单声道、立体声2、WAV音频信号结构WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。其由文件头和数据体两大部分组成,其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分,而数据体主要包含以脉冲编码调制(PCM)格式表示的样本。WAV文件的由四个部分组成:表2、WAV文件结构RIFFWAVEChunkID

='RIFF'RiffType='WAVE'FormatChunkID='fmt'FactChunk(optional)ID='fact'DataChunkID='data'表3、RIFFWAVEChunk结构名称长度内容ID4Bytes'RIFF'Size4BytesFileLen-8,整个文件大小-8Type4Bytes'WAVE'表4、FormatChunk结构名称长度内容备注ID4Bytes'fmt'Size4Bytes18/16(有无附加信息)本结构大小(除ID,Size)FormatTag2Bytes通常0x0001编码方式Channels2Bytes1--单声道;2--双声道立体声声道数目SamplesPerSec4Bytes采样频率AvgBytesPerSec4Bytes每秒所需字节数BlockAlign2Bytes数据块对齐单位BitsPerSample2Bytes每个采样需要的位bit数附加信息2Bytes(可选,通过Size来判断)附加信息表5、FactChunk(optional)结构(可选)名称长度内容ID4Bytes'fact'Size4Bytes数值为4data4Bytes表6、DataChunk结构:名称长度内容ID4Bytes'data'Size4Bytes数据区大小data4Bytes数据区,真正存储数据的地方表7、PCM数据的存放方式:样本1样本28位单声道0声道0声道8位立体声0声道(左)1声道(右)0声道(左)1声道(右)16位单声道0声道低字节0声道高字节0声道低字节0声道高字节16位立体声0声道左低字节0声道左高字节1声道右低字节1声道右高字节WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据大小如下所示。表8、PCM波形样本大小样本大小数据格式最大值最小值8位PCMunsignedint225016位PCMint32767-327673、MP3音频信号结构MP3的全称为MPEG1Layer-3音频文件,由帧(frame)构成,帧又是MP3文件的最小组成单元。MPEG音频文件是MPEG1标准中的声音部分,也叫MPEG音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG音频编码的层次越高,编码器越复杂,压缩率也越高。MP1和MP2的压缩率分别为4:1和6:1-8:1,而MP3的压缩率则高达10:112:1。MP3采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。MP3文件又三个部分组成,分别是:TAG_V2(ID3V2),Frame,TAG_V1(ID3V1)。表9MP3文件结构ID3V2包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。Frame一系列的帧,个数由文件大小和帧长决定。每个Frame的长度可能不固定,也可能固定,由位率bitrate决定。每个Frame又分为帧头和数据实体两部分,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。ID3V1包含了作者,作曲,专辑等信息,长度为128Byte。每个Frame都有一个帧头Frameheader,长度4Byte(32bit)。头部最前面的11位总是被设置为1并称它为“帧同步”。因此,可以搜索整个文件以确定第一次出现连续11个被设置为1的地方,然后读整个头部并检测值是否正确。帧头后面可能有两个字节的CRC校验,这两个字节的存在与否取决于Frameheader信息的第16bit:若为0则帧头后面无校验;否则有校验,校验长度为2个字节。紧跟在Frameheader后面的是帧的实体数据,其具体格式如下表所示:表10MP3帧结构FrameheaderCRC(free)Main_Data4Byte0或者2Byte长度由帧头计算得出4、MP3音频压缩算法MP3的编码框图如图所示。从整体来看,MP3编码算法流程刻大致分为:时频映射(包括子带滤波器组和MDCT)和量化编码(包括比特和比例因子分配和哈夫曼编码)等两大功能模块。计算都十分复杂,实现MP3编码的关键也在于这两个功能模块。在MP3编码中,输入的数字音频信号(即PCM采样信号)进入子带滤波器组后,被分成32个子带信号,MDCT(改进离散余弦变换))把子带的输出在频域里进一步地细分成18个频线,这样共产生576个频线。(若采用心理声学模型来计算子带信号的信掩比的方式,即根据这些信掩比决定分配给576个频线的比特数,则在比特分配的过程可以实现可变步长量化)接着再对频线进行定长量化,量化后的样值,再经过无失真的哈夫曼编码,以提高编码效率,并与比特分配和量化产生的边信息一起组成一帧数据。MP3编码的一帧数据包括两个组,每组有576个频线和与他们相关的边信息,边信息被存储在每一帧的帧头中。对这样一帧一帧组成的比特流,MP3解码器可以独立的进行解码,而不需要额外的信息了。1)混合滤波器组 混合滤波器组包括子带滤波器组和MDCT两部分。子带滤波器组编码完成样本信号从时域到频域的映射,并将规定格式的数字音频信号(若采样频率是44.1kHz,样本量化为16位,则编码比特率为16*44100bit/s)分解成32个子带输出。子带分析滤波器组的32个子带是等带宽的,而由心理声学模型得出的临界带宽则不是等带宽的,所以分析滤波器的带宽与人耳听觉上的临界频带划分并不匹配。为了使得进行编码的各比例因子带与临界频带相匹配,需要对每个子带信号做MDCT变换,从而提供更精细的频率分辨率。将子带滤波器组的输出送到MDCT滤波器组后,每组将细分为18条频线,共产生576条频线,这对处理稳态信号能获得最大的编码增益。子带滤波器由32个FIR型BPF组成,每个BPF的长度为512点。因此实际上是用一个32×512的变换矩阵C将输入序列{Xi}中的连续512个数据点所构成的输入矢量X,变换成一个具有32个分量的输出矢量S。其中S的32个数据点SK按子带频率从低到高的顺序排列。将PCM采样音频信号以32个为一组输入一个长度为512的X向量缓冲区,构造一个具有512个元素的矢量空间X;然后用矢量C对X加窗,得到矢量Z,其中Ci在标准中给出;512维矢量Z被分成8个64维矢量Yi,然后将8个矢量相加得到矢量Y;最后对进行变换从而得到32个子带信号。子带滤波器组对不同块类型的输出有不同的计算矩阵(已在MPEG-I标准中给出),即不同的窗口类型:长窗、开始窗、结束窗和短窗。对子带滤波器组的输出加窗后,再进行MDCT变换,这样可以有效的控制前回声2)量化编码在MPEG-I标准中用一个三层迭代的循环模型(如图),对经过MDCT后输出的样本进行比特分配和量化。最高一级称为帧循环,它首先复位所有的迭代变量,计算能够

提供给每节数据的最大比特数,然后调用外层迭代模型;外层迭代模型首先调用内层迭代循环,内层迭代循环对输入矢量进行量化,通过递增量化步长使量化输出能够在一定的比特位数限制之内被编码。然后确定哈夫曼编码表的选择,并对量化频谱进行哈夫曼编码。哈夫曼编码对量化的最大值有限制,MPEG-I规定最大值不超过8191。所以要判断所有的量化值是否超过限定,如果超过最大限制,内层迭代循环递增量化步长,重新量化。然后确定哈夫曼编码的位数,使其所占的比特数小于由帧循环计算出的每节编码所能提供的最大比特数,否则也要增加量化步长重新量化。如果经过量化产生的噪声过大,有可能导致样本失真,无法被正确解码,所以外层迭代循环根据内层输出来检测每个比例因子频段的量化噪。图、三层迭代模型在内层迭代中采用了哈夫曼编码是为了消除信号中的冗余,提高编码的效率。在MP3编码标准中,提供了32个哈夫曼码表用于对量化后的信号进行哈夫曼编码,使得编码的码率大大降低。哈夫曼表的选择是根据量化值的最大值以及信号的统计特性来决定的。经量化编码的信号同边信息一起组成一帧数据,并以帧流的形式存储或传输。五、实验内容与结果1、Matlab语音信号录制 本实验原音频数据,利用Matlab软件自带wavrecord函数进行单声道、44.1KHz采样率、16位量化精度语音录制,wavwrite函数将录制好的语音数据保存为wav音频文件。录制后,最终音频文件保存为voice.wav音频文件,大小为861KB(882,044字节)。(1)函数y=wavrecord(time*fs,fs,1,'int16')输入:time,音频录制时间,本实验为10s;fs,采样频率,本实验为44100KHz;1,通道数,本实验采用单通道;'int16',量化精度,本实验采用16位量化精度;输出:y,输出采样数据,大小为<441000*1int16>。(2)函数wavwrite(y,fs,16,'voice.wav')y:录制好的语音信号,大小<441000*1int16>;fs:采样频率,44100KHz; 16:量化精度,16位; 'voice.wav':保存的音频文件名。2、 CCS5.5读取WAV文件 在CC5.5中,定义结构体header来存储WAV帧头信息,用fread函数来读取WAV文件。其中结构体header定义如下:structwave_header{charriff[4]; /*"RIFF"*/unsignedintsize; /*文件大小=头大小(36)+数据长度*/charwave[4];/*"WAVE"*/charfmt[4]; /*"fmt"*/unsignedintfmt_len; /*fmtchunk的长度=16*/unsignedshorttag; /*MSPCM=1*/unsignedshortchannels; /*通道数*/unsignedintsamp_rate; /*采样率*/unsignedintbyte_rate; /*bytespersecond=samp_rate*byte_samp*/unsignedshortbyte_samp; /*blockalign(bytespersample)*/unsignedshortbit_samp; /*bitspersample*/chardata[4]; /*"data"*/unsignedintlength; /*数据长度(bytes)*/}header;CCS5.5读取到的头信息如图所示:其中riff=’RIFF’;size=882036;wave=’WAVE’;fmt=’fmt.’;f,t_len=16;tag=1;channels=1;samp_rate=44100;byte_rate=88200;byte_samp=2;bit_samp=16;data=’data’;lenth=882000;图CCS5.5读取WAV文件头信息3、 CCS5.5读取一帧MP3对应WAV原始PCM数据 在CCS5.5中,定义无符号整形buff数组来存储从WAV中的原始PCM数据,对于单声道音频,这里数组大小为576;对于双声道音频,这里数组大小为1152。unsignedint*wave_get(void){intn,p;staticunsignedintbuff[samp_per_frame];//采样数据缓存空间n=config.mpeg.samples_per_frame>>(2-config.wave.channels);//实际所采样数p=fread(buff,sizeof(unsignedint),(short)n,config.wave.file);//读取WAV中的音频数if(!p)//对应单通道,高576位为0;return0;else{for(;p<n;p++)buff[p]=0;returnbuff;}4、 CCS5.5MP3帧压缩处理 这获取WAV音频中的PCM信号后,接下来就是对数据进行压缩编码处理。具体包括以下几个部分。多相滤波多相滤波器组的作用是将声音信号分成32个频宽大小相同的子频带,即将输入的576个样本数据,变换为18*32个样本数据。但这32个子频带对音频压缩的效果并不好,因此通过加入混合多相MDCT的处理来改善信号的失真。voidL3_window_filter_subband(unsignedint**buffer,ints[SBLIMIT],intk){staticintoff[2];inty[64],s1,s2;inti,j;/*用新的32个样本数据替换旧的样本数据*/if(config.mpeg.channels==1){for(i=15;i>=0;i--){x[k][(2*i)+off[k]+1]=(**buffer)<<16;x[k][(2*i)+off[k]]=((*(*buffer)++)>>16)<<16;}}/*平移样本到合适的窗口位置*/for(i=HAN_SIZE;i--;){z[i]=mul(x[k][(i+off[k])&(HAN_SIZE-1)],ew[i]);}off[k]=(off[k]+480)&(HAN_SIZE-1);/*offsetismodulo(HAN_SIZE)*//*子窗口的数据样本*/for(i=64;i--;)for(j=8,y[i]=0;j--;)y[i]+=z[i+(j<<6)];/*结合子样本用于简单矩阵计算*/for(i=0;i<16;i++)y[i+17]+=y[15-i];for(i=0;i<15;i++)y[i+33]-=y[63-i];/*简化的多相滤波器矩阵乘法*/for(i=16;i--;)for(j=0,s[i]=0,s[31-i]=0;j<32;j+=2){s1=mul(fl[i][j],y[j+16]);s2=mul(fl[i][j+1],y[j+17]);s[i]+=s1+s2;s[31-i]+=s1-s2;}}混合多相MDCT(ModifiedDiscreteCosineTransform修饰离散余弦变换)MDCT有18个通道,将分成的32个子带信号进一步细分,产生32*18=576的频线输出。MDCT的特点是即使不经量化也不会产生失真;将子带的信号进一步细分到频谱上,便于提供较好的分析和效果;在编码时,能消除多相滤波器组产生的叠频效应,增加解压后的还原效果。voidL3_mdct_sub(intsb_sample[2][3][18][SBLIMIT],intmdct[2][2][samp_per_frame2]){int(*mdct_enc)[18];intch,gr,band,j,k;intmdct_in[36];intbu,bd,*m;for(gr=0;gr<config.mpeg.granules;gr++)for(ch=config.mpeg.channels;ch--;){/*setuppointertothepartofmdct_freqwe'reusing*/mdct_enc=(int(*)[18])mdct_freq[gr][ch];/*Compensateforinversionintheanalysisfilter*/for(band=1;band<=31;band+=2)for(k=1;k<=17;k+=2)sb_sample[ch][gr+1][k][band]*=-1;/*Performimdctof18previoussubbandsamples+18currentsubbandsamples*/for(band=32;band--;){for(k=18;k--;){mdct_in[k]=sb_sample[ch][gr][k][band];mdct_in[k+18]=sb_sample[ch][gr+1][k][band];}/*CalculationoftheMDCTfor(k=18;k--;){m=&mdct_enc[band][k];for(j=36,*m=0;j--;)*m+=mul(mdct_in[j],cos_l[k][j]);}}/*Performaliasingreductionbutterfly*/for(band=31;band--;)for(k=8;k--;){bu=muls(mdct_enc[band][17-k],cs[k])+muls(mdct_enc[band+1][k],ca[k]);bd=muls(mdct_enc[band+1][k],cs[k])-muls(mdct_enc[band][17-k],ca[k]);mdct_enc[band][17-k]=bu;mdct_enc[band+1][k]=bd;}}/*Savelatestgranule'ssubbandsamplestobeusedinthenextmdctcall*/for(ch=config.mpeg.channels;ch--;)for(j=18;j--;)for(band=32;band--;)sb_sample[ch][0][j][band]=sb_sample[ch][config.mpeg.granules][j][band];}失真控制环对MDCT输出的信号,经过失真控制环和量化率控制环,即量化器的处理,最终实现对信号进行量化。voidL3_iteration_loop(intmdct_freq_org[2][2][samp_per_frame2],L3_side_info_t*side_info,intl3_enc[2][2][samp_per_frame2],intmean_bits){reservoir=main_data_begin<<3;/*calculatereservoirattheframestart*/side_info->main_data_begin=main_data_begin;/*setnextframesbackpointer*/for(gr=0;gr<config.mpeg.granules;gr++)for(ch=config.mpeg.channels;ch--;){/*setuppointers*/ix=l3_enc[gr][ch];xr=mdct_freq_org[gr][ch];gi=&side_info->gr[gr].ch[ch].tt;/*calculateabsoluteandmaximum*/for(i=cutoff,xrmax=0;i--;)if(xrmax<(xrabs[i]=abs(xr[i])))xrmax=xrabs[i];/*calculatetheavailablebitsforthemaindata*/extra_bits=reservoir>>1;/*simplescheme,givehalfeachtime*/reservoir-=extra_bits;max_bits=mean_bits+extra_bits;if(max_bits>PART_2_3_LIMIT){reservoir+=max_bits-PART_2_3_LIMIT;max_bits=PART_2_3_LIMIT;}/*quantizethespectrumunlessallspectralvalueszero*/if(xrmax)gi->part2_3_length=inner_loop(ix,max_bits,gi);reservoir+=max_bits-gi->part2_3_length;/*adjustforunusedbits*/gi->global_gain=gi->quantizerStepSize+89;/*restoresignofquantizedspectralvalues*/for(i=0;i<cutoff;i++)if(xr[i]<0)ix[i]*=-1;}/*Sortoutreservoiratframeend,limitthesizeandstufftheexcess*/resv_max=DEC_BUFF_LIMIT-config.mpeg.bits_per_frame;if(resv_max>config.mpeg.resv_limit)resv_max=config.mpeg.resv_limit;elseif(resv_max<0)resv_max=0;main_data_begin=(reservoir<resv_max)?(reservoir>>3):(resv_max>>3);extra_bits=reservoir-(main_data_begin<<3);side_info->resv_drain=extra_bits;/*remainingbitstoancillarydata*/}Huffman编码量化好的数据变成一连串的系数,由霍夫曼编码(Huffmancode)做最后压缩处理。霍夫曼编码是将比较常见的字符用特定的符号表示,压缩后得到一个记录每个符号代表的字符串的编码表以及一连串由符号组成的信息内容,使用霍夫曼编码可以节约20%的空间。staticintencodeMainData(intl3_enc[2][2][samp_per_frame2],L3_side_info_t*si){intgr,ch;bits=0;by=0;bi=8;main_[0]=0;/*Huffmancodesplusreservoirstuffing*/for(gr=0;gr<config.mpeg.granules;gr++)for(ch=0;ch<config.mpeg.channels;ch++)Huffmancodebits(l3_enc[gr][ch],&si->gr[gr].ch[ch].tt);/*encodespectrum*//*ancillarydata,usedforreservoirstuffingoverflow*/if(si->resv_drain){intwords=si->resv_drain>>5;intremainder=si->resv_drain&31;/*padwithzeros*/while(words--)putbits(main_,0,32);if(remainder)putbits(main_,0,remainder);}returnbits>>3;}编码MP3帧头与边信息每个Frame都有一个帧头Frameheader,长度4Byte(32bit)。头部最前面的11位总是被设置为1并称它为“帧同步”.staticvoidencodeSideInfo(L3_side_info_t*si){intgr,ch,region;unsignedchar*sf=fifo[wr].side;/*header*/*sf=header[0];*(sf+1)=header[1];*(sf+2)=header[2]|(config.mpeg.padding<<1);*(sf+3)=header[3];*(sf+4)=0;bits=32;by=4;bi=8;/*sideinfo*/if(config.mpeg.type==MPEG1){putbits(sf,si->main_data_begin,9);putbits(sf,0,(config.mpeg.channels==2)?3:5);/*privatebits*/for(ch=0;ch<config.mpeg.channels;ch++)putbits(sf,0,4);/*scfsi*/for(gr=0;gr<2;gr++)for(ch=0;ch<config.mpeg.channels;ch++){gr_info*gi=&(si->gr[gr].ch[ch].tt);putbits(sf,gi->part2_3_length,12);putbits(sf,gi->big_values,9);putbits(sf,gi->global_gain,8);putbits(sf,0,5);/*scalefac_compress,windowswitchingflag*/for(region=0;region<3;region++)putbits(sf,gi->table_select[region],5);putbits(sf,gi->region0_count,4);putbits(sf,gi->region1_count,3);putbits(sf,0,2);/*preflag,scalefac_scale*/putbits(sf,gi->count1table_select,1);}}fifo[wr].fr_len=(config.mpeg.bits_per_frame-bits)>>3;fifo[wr].si_len=bits>>3;/*bytesinsideinfo*/if(++wr==FIFO_SIZE)wr=0;/*pointtonextbuffer*/}六、实验结果分析 本实验中压缩原始音频数据为:Matlab录制的单声道、44.1KHz采样率、16位量化精度的WAV音频信号,大小为862KB,时间为10秒钟。然后分别利用Matlab、VS2013和DSP(CCS5.5)对音频信号进行压缩,最后保存为mp3格式音频文件。音质采用两种方式(Matlab语言和C语言)进行音频压缩,都能够保存音频中原有的语音信息,且去除一定的噪声,即两种压缩方式在音质方面,效果相当。压缩时间比较两种音频压缩方式,压缩10秒钟,441000个采样数据。在Matlab中,压缩花费的时间为1~2s;在VS2010(C程序)中,压缩花费的时间为1~2s;而在CCS5.5(C程序)中,压缩花费的时间为2~5分钟s。由此可得出本程序中C编写的MP3压缩算法(VS2013)与Matlab中编写的算法压缩时间相当,而在CCS中压缩的时间很长(暂时没有明白为什么)。压缩比采用两种音频压缩方式,对10秒音频数据进行压缩。在Matlab中,压缩后的音频大小为79KB。在VS2010和CCS5.5中,压缩后的音频大小为78.1KB。可知:在三种编译器中编写的音频MP3压缩算法都达到了标准的MP3算法要求。七、实验感悟本次实验虽然经历了各种心酸,也遇到过各种困难,但在几个礼拜的努力下,最终还是在CCS5.5中完成了MP3语音信号的压缩。通过此次实验,我真实的感受到自己以前知道的知识太少,熟悉的软件不多,该学的东西太多太多。在本次实验中,我使用到的软件主要有:VS2013、MatlabR2010a和CCS5.5(其中我前面还分别尝试了C5000和CSS3.3版本),编程的主要语言是C语言和Matlab语言。做完实验,回顾前面的历程,总结遇到的困难有:1、对音频知识了解不够,不知如何下手不知道单通道、44.4KHz采样率、16位量化的语音录制方法,最初采用语音录制软件实现,后利用Matlab函数实现。不知道将采样好的数据保存何种格式,然后又是如何导入到CCS工程当中。不知道WAV、MP3和PCM语音信号的格式,无法进行语音处理。2、不会CCS,导致程序由VS2013移植到CCS中屡屡受挫(1)开始时,自己网上找资料,选取C5000作为开发软件(资料齐全),并学会将Matlab数据通过I/O文件读取方式导入C5000中、波形绘制、软件仿真和波形调试等功能。出现问题:内存分配错误,出现数据溢出。(2)请教老师后,了解可能是芯片内存太小导致,于是又去装CCS3.3版本。CCS3.3界面同C5000相同,但是数据导入方式不一样。出现问题:同C5000,一样。(3)听同学的建议,又装了CCS5.5。CCS5.5同C5000和CCS3.3完全不一样,于是又重新学习了CCS5.5,CCS5.5优点在于其不用自己去分配程序空间。出现问题:内存空间不够。最终解决方案:在量化函数中,调用一数组pow3_4,大小10000。3、CCS中出现无法识别WAV音频文件,及压缩后的数据没有声音不同平台下,相同类型的字节长度不同shortintlonglongintlonglongunsignedshortunsignedintunsignedlongunsignedlongintunsignedlonglongVS20132444824448CCS5.524888248884、CCS读取PCM数据时,每帧MP3数据只读576个PCM数据,而每个MP3数据包含1152个采样值,无法解释这个由PCM数据格式所决定,一个PCM数据包含4个字节,对于16位单声道的音频数据,前两个字节用于存储第一个采样数据,后面两个字节用于存储第二个采样数据,这样576个PCM数据,就有1152个样本数据。表7、PCM数据(4字节)的存放方式:样本1样本28位单声道0声道0声道8位立体声0声道(左)1声道(右)0声道(左)1声道(右)16位单声道0声道低字节0声道高字节0声道低字节0声道高字节16位立体声0声道左低字节0声道左高字节1声道右低字节1声道右高字节5、CCS和VS中音频压缩后压缩率为5.5,与Matlab结果有出路,无法解释并修改压缩比:声道数*采样数*量化位数/MP3比特率在程序中,对于单声道或立体声都是采用128kbps的输出比特率(双声道),对于单声道,其将第二声道数据全部设置为0。结论:经过本次实验,我学会了CCS软件的仿真调试,断点调试以及文件读取和输出等操作,以及学会了如何找问题,解决问题。当然,这都需要感谢其中帮助过我的同学。八、问题1、long型数据在VS2013和CCS5.5中各占几个字节长度?为什么不同?2、为什么同样的C程序在VS2013和CCS5.5中运行的时间不一样?参考文献范建军.MP3文件格式剖析[J].咸宁师专学报,2002(12),77-79蒋华,赵耿.实时MP3语音编码器的DSP设计与实现[J].西安科技学院学报,2004(3),115-118张晓婷.数字音频技术(MP3)的压缩编码原理与制作方法[J].长沙航空职业技术学院学报,2004(6),51-56马昌苹,宋丹.MP3编码算法分析[J].佳木斯大学学报,2005(1),64-67林胜,纪涌,全子一.MPEG-III声音编码算法[J].电声技术.1998(5),2–5桂杰出.基于DSP的MP3编解码系统研究[M].重庆大学硕士学位论文张敬怀,马道钧.WAV语音文件格式的分析与处理[J].北京电子科技学院学报,2004(6),46-50徐济仁,HYPERLINK"

温馨提示

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

评论

0/150

提交评论