MP3语音压缩的DSP设计与实现Word格式文档下载.docx

上传人:b****5 文档编号:21129683 上传时间:2023-01-27 格式:DOCX 页数:21 大小:170.89KB
下载 相关 举报
MP3语音压缩的DSP设计与实现Word格式文档下载.docx_第1页
第1页 / 共21页
MP3语音压缩的DSP设计与实现Word格式文档下载.docx_第2页
第2页 / 共21页
MP3语音压缩的DSP设计与实现Word格式文档下载.docx_第3页
第3页 / 共21页
MP3语音压缩的DSP设计与实现Word格式文档下载.docx_第4页
第4页 / 共21页
MP3语音压缩的DSP设计与实现Word格式文档下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

MP3语音压缩的DSP设计与实现Word格式文档下载.docx

《MP3语音压缩的DSP设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MP3语音压缩的DSP设计与实现Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。

MP3语音压缩的DSP设计与实现Word格式文档下载.docx

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.1k

8位、16位

单声道、立体声

2、WAV音频信号结构

WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。

其由文件头和数据体两大部分组成,其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分,而数据体主要包含以脉冲编码调制(PCM)格式表示的样本。

WAV文件的由四个部分组成:

表2、WAV文件结构

RIFFWAVEChunk

ID 

='

RIFF'

RiffType='

WAVE'

FormatChunk

ID='

fmt'

FactChunk(optional)

fact'

DataChunk

ID='

data'

表3、RIFFWAVEChunk结构

名称

长度

内容

ID

4Bytes

'

Size

FileLen-8,整个文件大小-8

Type

表4、FormatChunk结构

备注

18/16(有无附加信息)

本结构大小(除ID,Size)

FormatTag

2Bytes

通常0x0001

编码方式

Channels

1--单声道;

2--双声道立体声

声道数目

SamplesPerSec

AvgBytesPerSec

每秒所需字节数

BlockAlign

数据块对齐单位

BitsPerSample

每个采样需要的位bit数

附加信息

(可选,通过Size来判断)

表5、FactChunk(optional)结构(可选)

数值为4

data

表6、DataChunk结构:

数据区大小

数据区,真正存储数据的地方

表7、PCM数据的存放方式:

 

样本1

样本2

8位单声道

0声道

8位立体声

0声道(左)

1声道(右)

16位单声道

0声道低字节

0声道高字节

16位立体声

0声道左低字节

0声道左高字节

1声道右低字节

1声道右高字节

WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。

首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据大小如下所示。

表8、PCM波形样本大小 

样本大小

数据格式

最大值

最小值

8位PCM

unsignedint

225

16位PCM

int

32767

-32767

3、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。

每个Frame都有一个帧头Frameheader,长度4Byte(32bit)。

头部最前面的11位总是被设置为1并称它为“帧同步”。

因此,可以搜索整个文件以确定第一次出现连续11个被设置为1的地方,然后读整个头部并检测值是否正确。

帧头后面可能有两个字节的CRC校验,这两个字节的存在与否取决于Frameheader信息的第16bit:

若为0则帧头后面无校验;

否则有校验,校验长度为2个字节。

紧跟在Frameheader后面的是帧的实体数据,其具体格式如下表所示:

表10MP3帧结构

Frameheader

CRC(free)

Main_Data

4Byte

0或者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,通道数,本实验采用单通道;

,量化精度,本实验采用16位量化精度;

输出:

y,输出采样数据,大小为<

441000*1int16>

(2)函数wavwrite(y,fs,16,'

voice.wav'

y:

录制好的语音信号,大小<

fs:

采样频率,44100KHz;

16:

量化精度,16位;

'

保存的音频文件名。

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信号后,接下来就是对数据进行压缩编码处理。

具体包括以下几个部分。

1)多相滤波

多相滤波器组的作用是将声音信号分成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)<

}

/*平移样本到合适的窗口位置*/

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;

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];

15;

y[i+33]-=y[63-i];

/*简化的多相滤波器矩阵乘法*/

for(i=16;

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;

2)混合多相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+

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1