文档介绍:该【MP3语音压缩的DSP设计与实现 】是由【小果冻】上传分享,文档一共【17】页,该文档可以免费在线阅读,需要了解更多关于【MP3语音压缩的DSP设计与实现 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。1上海大学2024~2024学年冬季学期研究生实验报告课程名称:DSP技术及其应用课程编号:07S009005题目:MP3语音压缩的DSP设计与实现研究生姓名:学号:评语:成绩:任课教师:评阅日期:2MP3语音压缩的DSP设计与实现2024年12月25日—、实验要求与目的实验要求:对单声道、、16位量化精度的音频信号进行压缩,实现*mp3格式的数据结构。实验目的:熟悉掌握MatlabR2024a软件的使用,及音频信号的采集与处理;学习掌握C语言,并熟悉掌握VS2024的仿真与调试;;熟悉掌握PCM、WAV以及MP3等音频信号的数据结构;熟悉掌握MP3压缩的原理;二、实验设备与环境本实验采用的硬件环境为:宏碁笔记本电脑,(R)Dual-CoreCPU,i3处理器,,32位Windows7操作系统。使用的软件有:MatlabR2024a、。,仿真目标芯片选型为:Genericdevice-->64xxDevice。三、整体实验方案设计本实验主要包括以下三个局部:〔1〕Matlab录音:在Matlab平台,利用其自带的波形记录函数wavecord函数录制单通道、16位分辨率、,并保存为wav格式音频文件〔10秒〕;〔2〕Matlab压缩:在Matlab平台,利用lamb工具,即mp3write函数,对音频进行mp3压缩〔S的参考〕。〔S〔VS2024〕压缩:1、利用fread函数读取WAV文件,并解析其头部信息;2、利用fread函数读取一帧MP3对应的576个PCM数据(1152个采样值);3、对576个PCM数据进行多相滤波器,将其分成32个频宽大小相同的子频带,即变换为18*32个样本数据。4、进行MDCT变换,将分成的32个子带信号进一步细分,产生32*18=576个频线输出。35、对MDCT输出的信号,经过失真控制环和量化率控制环,即量化器的处理,最终实现信号的非线性量化。6、由霍夫曼编码(Huffmancode)做最后压缩处理,压缩后得到一个记录每个符号代表的字符串的编码表以及一连串由符号组成的信息内容,该编码方式可以节约20%的空间。7、将编码后的数据打包成MP3帧格式,并实现比特流数据输出。四、实验原理1、音频信号根本知识声音的数字化过程主要包括四个过程〔如下列图〕:〔1〕采样,对振幅随时间连续变化的模拟信号波形按一定的时间间隔取出样值,形成在时间上不连续的脉冲序列;〔2〕量化,将模拟信号的幅度,在动态范围内划分为相等间隔的假设干层次,把采样输出的信号电平按照四舍五入的原那么归入最靠近的量值。〔3〕编码,把采样、量化所得的量值变换为二进制数码的过程称为编码。〔4〕压缩,依据声音信息中存在着多种冗余信息、听觉器官的不敏感性以及采样的标本中存在着相关性,对编码后的二进制信号进行压缩。图、声音数字化流程在对模拟音频信号进行采样量化编码后,将得到数字音频。数字音频的质量取决于采样频率、量化位数和声道数三个因素〔如表1所示〕。1)采样频率采样频率是指一秒钟时间内采样的次数。采样频率与声音频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音复原成为原来的声音。,。在本实验中,我们采用的是CD的采样标准,)量化位数量化位数也称“量化精度〞,是描述每个采样点数值的二进制位数。例如,8位量化位数表示每个采样值可以用2的8次方,即256个不同的量化值之一来表示,而16位量化位数表示每个采样值可以用2的16次方,即65536个不同的量化值之一来表示。量化噪声那么是指某个采样时间点的模拟值和最近的量化值之间的差,误差最大可以到达离散间距的一半。一般量化位数越大,量化噪声越小。在本实验中,我们采用的是16位的量化精度。3)声道数4声音通道的个数称为声道数,是指一次采样所记录产生的声音波形个数。记录声音时,如果每次生成一个声波数据,称为单声道;每次生成两个声波数据,称为双声道〔立体声〕。随着声道数的增加,所占用的存储容量也成倍增加。本实验,为了降低语音文件的大小,以及实验的难度采用单声道。表1、数字音频质量的技术参数表采样频率量化位数声道数含义每秒钟抽取声波幅度样本的次数每个采样点用多少二进制位表示数据范围使用声音通道的个数特点采样频率越高、声音质量越好、数据量也越大量化位数越多、音质越好、数据量也越大立体声比单声道的表现力丰富,、、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数5附加信息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:1---12:1。MP3采取了“感官编码技术〞,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3文件,并使压缩后的文件在回放时能够到达比较接近原音源的声音效果。MP3文件又三个局部组成,分别是:TAG_V2(ID3V2),Frame,TAG_V1(ID3V1)。表9MP3文件结构ID3V2包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。Frame一系列的帧,个数由文件大小和帧长决定。每个Frame的长度可能不固定,也可能固定,由位率bitrate决定。每个Frame又分为帧头和数据实体两局部,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。ID3V1包含了作者,作曲,专辑等信息,长度为128Byte。7每个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两局部。子带滤波器组编码完成样本信号从时域到频域的映射,并将规定格式的数字音频信号〔,样本量化为16位,那么编码比特率为16*44100bit/s〕分解成32个子带输出。子带分析滤波器组的32个子带是等带宽的,而由心理声学模型得出的临界带宽那么不是等带宽的,所以分析滤波器的带宽与人耳听觉上的临界频带划分并不匹配。为了使得进行编码的各比例因子带与临界频带相匹配,需要对每个子带信号做MDCT变换,从而提供更精细的频率分辨率。将子带滤波器组的输出送到MDCT滤波器组后,每组将细分为18条频线,共产生576条频线,这对处理稳态信号能获得最大的编码增益。7子带滤波器由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个哈夫曼码表用于对量化后的信号进行哈夫曼编码,使得编码的码率大大降低。哈夫曼表的选择是根据量化值的最大值以及信号的统计特性来决定的。经量化编码的信号同边信息一起组成一帧数据,并以帧流的形式存储或传输。五、实验内容与结果81、Matlab语音信号录制 本实验原音频数据,利用Matlab软件自带wavrecord函数进行单声道、、16位量化精度语音录制,wavwrite函数将录制好的语音数据保存为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,'')y:录制好的语音信号,大小<441000*1int16>;fs:采样频率,44100KHz; 16:量化精度,16位; '':保存的音频文件名。2、 ,定义结构体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;:其中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;、 ,定义无符号整形buff数组来存储从WAV中的原始PCM数据,对于单声道音频,这里数组大小为576;对于双声道音频,这里数组大小为1152。unsignedint*wave_get(void){intn,p;staticunsignedintbuff[samp_per_frame];//采样数据缓存空间n=>>(2-);//实际所采样数p=fread(buff,sizeof(unsignedint),(short)n,);//读取WAV中的音频数if(!p)//对应单通道,高576位为0;return0;else{for(;p<n;p++)buff[p]=0;returnbuff;}4、 这获取WAV音频中的PCM信号后,接下来就是对数据进行压缩编码处理。具体包括以下几个局部。多相滤波多相滤波器组的作用是将声音信号分成32个频宽大小相同的子频带,即将输入的576个样本数据,变换为18*32个样本数据。但这32个子频带对音频压缩的效果并不好,因此通过参加混合多相MDCT的处理来改善信号的失真。voidL3_window_filter_subband(unsignedint**buffer,ints[SBLIMIT],intk)10{staticintoff[2];inty[64],s1,s2;inti,j;/*用新的32个样本数据替换旧的样本数据*/if(==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(ransform修饰离散余弦变换)MDCT有18个通道,将分成的32个子带信号进一步细分,产生32*18=576的频线输出。MDCT的特点是即使不经量化也不会产生失真;将子带的信号进一步细分到频谱上,便于提供较好的分析和效果;在编码时,能消除多相滤波器组产生的叠频效应,增加解压后的复原效果。voidL3_mdct_sub(intsb_sample[2][3][18][SBLIMIT],intmdct[2][2][samp_per_frame2]){