语音压缩存储与回放实验报告.docx
- 文档编号:27516999
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:25
- 大小:517.34KB
语音压缩存储与回放实验报告.docx
《语音压缩存储与回放实验报告.docx》由会员分享,可在线阅读,更多相关《语音压缩存储与回放实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
语音压缩存储与回放实验报告
语音压缩存储与回放实验报告
DSP课程设计
实验报告
语音压缩、存储和回放
院系:
电子信息工程学院
小组成员:
通信0607王颖06282022
自动化0601王燕06212016
一、设计任务书封面…………………………………………………1
二、设计内容与要求…………………………………………………3
三、设计算法原理说明………………………………………………4
四、程序设计、调试与结果分析……………………………………7
CMD程序,C语言程序……………………………………………7
调试过程…………………………………………………………15
波形与数据显示…………………………………………………16
五、设计(安装)与调试的体会……………………………………17
六、参考文献…………………………………………………………18
法。
三、实验原理
1.语音采集与输出模块
语音采集与输出模块采用的是TI公司推出的一款高性能的立体声音频Codec芯片TLC320AD50C,内置耳机输出放大器,支持MIC和LINEIN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。
AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。
与此同时,AD50还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。
由于具有上述优点,使得AD50是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3……)、录音机等数字音频领域[2]。
由TLC320AD50C组成的语音输入与输出模块不仅采样率高最高可达96K,且外围电路简单,性价比高。
2.语音编码
(1)概念:
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
PCM编码即脉冲编码调制。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化:
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和u律,u律是最常用的一种。
在美国,7位u律是长途电话质量的标准。
而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
(3)DPCM&ADPCM:
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。
相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。
因为差分信号比原语音信号的动态范围和平均能量都小。
这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。
CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。
这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。
(4)a律压缩
a律压缩示意图
A律压缩编码表
A律压缩编码表
线性输入编码
压缩编码
0000000wxyza
000wxyz
0000001wxyza
001wxyz
000001wxyzab
010wxyz
00001wxyzabc
011wxyz
0001wxyzabcd
100wxyz
001wxyzabcde
101wxyz
01wxyzabcdef
110wxyz
1wxyzabcdefg
111wxyz
采用DSP可以直接对PCM编码后的语音信号进行μ律和A律压缩。
图1是DSP硬件实现数据压缩解压的简单流程,DSP将传输来的压缩后的数据进行解压成16位或者32位,然后对解压后的数据进行分析、处理,最后将处理后的数据按照要求压缩成8位的数据格式输出到相应设备,供其他设备读取。
图1数据压缩解压流程
图2是DSP将数据解压的值,DSP将压缩的8位数据解压成16位的DSP通用数据格式,其中高13位为解压后的数据,低3位补0。
这是因为6.711的A律压缩只能对13位数据操作。
DSP将解压后的数据放在缓冲串口的发送寄存器中,只要运行发送指令,缓冲串口就会将数据发送出去。
缓冲串口对接收数据的解压过程和压缩过程完全相反。
图3是μ律数据解压的示意图。
图2A律数据解压
图3μ律数据解压
DSP内部的缓冲串口(McBSPs)带有硬件实现的μ律/A律压缩解压,用户只需要在相应寄存器中进行设置就可以了。
在进行A律压缩时,采样后的12位数据,默认其最高位为符号位,压缩时要保持最高位即符号位不变,原数据的后11位要压缩成7位。
这7位码由3位段落码和4位段内码组成。
具体的压缩变换后的数据根据后11位数据大小决定。
表2 A律数据压缩表
除对串行口数据实现压扩处理外,这套硬件在McBSP不使用时还可以当作一个特殊的处理单元对内部数据实现压扩处理,他有两种实现方法。
法一:
当串行口的发送和接受部分都处于复位状态时,DRR1和DXR1内部通过压扩逻辑连接在一起,数据从DXR1写入并根据XCOMPAND处理,然后根据RCOMPAND再处理,在4个CPU时钟后从DRR1中读出数据。
该处理比软件实现快,不利之处在于处理完后没有同步信息通知CPU和DMA。
法二:
在数据环回模式下,McBSP也实现了一种内连。
数据处理与第一种方法相同,但它可以提供中断信号(或同步事件)给CPU(或DMA)。
这里数据处理的时间是根据串行口的比特律确定的。
另外,在通常情况下McBSP先传输信号的高位后传输低位,但是在字长为8比特的数据传输时,McBSP提供了比特倒序的功能,即可以先传输低位后传输高位。
在本实验中,我们通过软件编程来完成线性码转换成A律。
语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信躁比,压缩比特速率,可为非线性量化。
语音压缩是把16位的数据比特转化为8位数据比特,从而到达语音压缩的目的。
在主程序中通过A/D抽样量化,可以得到16位的线性编码,再由编码表通过软件计算得到8位A律编码,其中最高位为符号位,第6位到第4位为段落码,低4位为段内码。
将8位的压缩结果存储到系统RAM中进行缓存,根据抽样率、语音存储时间以及系统RAM的容量设置语音存储缓冲区的大小,待缓冲区存满后,将缓冲区内的数据进行解压缩,然后输出到SPEAKER接口输出端。
若使用A/D转换器,必须首先对A/D转换器进行初始化设置,即设置A/D转换器的工作模式、输入增益以及抽样频率等。
3.程序设计
(1)、程序流程
存储器的分配(5402.cmd)
MEMORY
{
PAGE0:
VECS:
origin=0080h,length=0080h/*InternalProgramRAM*/
PRAM:
origin=7600h,length=8000h/*InternalProgramRAM*/
PAGE1:
SCRATCH:
origin=0060h,length=0020h/*ScratchPadDataRAM*/
DMARAM:
origin=0C00h,length=0300h/*DMAbuffer*/
DATA:
origin=1100h,length=0080h/*InternalDataRAM*/
STACK:
origin=1180h,length=0560h/*StackMemorySpace*/
INRAM:
origin=1900h,length=0100h/*InternalDataRAM*/
HPRAM0:
origin=1A00h,length=0002h/*HPImemoryaccessiblebyHostandDSP*/
HPRAM1:
origin=1A02h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/
HPRAM2:
origin=1C82h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/
EXRAM:
origin=1F10h,length=9000h/*ExternalDataRAM*/
}
SECTIONS
{
.cinit>PRAMPAGE0
.text>PRAMPAGE0
.vectors>VECSPAGE0
init_var>PRAMPAGE0
detect>PRAMPAGE0
vrcprg>PRAMPAGE0
matprg>PRAMPAGE0
.stack>STACKPAGE1
.trap>SCRATCHPAGE1
.const>EXRAMPAGE1
.data>EXRAMPAGE1
.bss>EXRAMPAGE1
.cio>EXRAMPAGE1
.switch>EXRAMPAGE1
tables>EXRAMPAGE1
var>EXRAMPAGE1
svctab>EXRAMPAGE1/*SS_VLSPtable*/
vctab>EXRAMPAGE1/*VLSPtable*/
uvctab>EXRAMPAGE1/*UVLSPtable*/
cuvtab>EXRAMPAGE1/*Stochasticcodebook*/
cdbktab>EXRAMPAGE1/*variouscodebooktables*/
logtab>EXRAMPAGE1/*tableforlog2*/
powtab>EXRAMPAGE1/*tableforpow2*/
hamtab>EXRAMPAGE1/*tableforhamming*/
lgwtab>EXRAMPAGE1/*tableforlagwindow*/
acostab>EXRAMPAGE1/*tableforarccos*/
sqrtab>EXRAMPAGE1/*tableforsquareroot*/
acbtab>EXRAMPAGE1/*tableforthresholdsinacb*/
pm03tab>EXRAMPAGE1/*tableforx^(-0.3)computation*/
costab>EXRAMPAGE1/*tableforcosine*/
V23>INRAMPAGE1
FSK>INRAMPAGE1
hpibuff0>HPRAM0PAGE1
hpibuff1>HPRAM1PAGE1
hpibuff2>HPRAM2PAGE1
dma_buff>DMARAMPAGE1
}
/*主程序设计*/
/*语音采集及回放程序*/
/*用A律进行压缩及解压*/
/*采用AD50进行A/D,D/A转换*/
/*灯循环闪烁程序开始*/
/*L0:
录音*/
/*L1:
放音*/
#include
#include
#include
#include
/*宏定义*/
#defineSIGN_BIT(0x80)/*SignbitforaA-lawbyte.*/
#defineQUANT_MASK(0xf)/*Quantizationfieldmask.*/
#defineNSEGS(8)/*NumberofA-lawsegments.*/
#defineSEG_SHIFT(4)/*Leftshiftforsegmentnumber.*/
#defineSEG_MASK(0x70)/*Segmentfieldmask.*/
/*函数声明*/
voiddelay(s16period);
voidled(s16cnt);
voidinitcodec(void);
voidflashenable(void);
unsignedchardata2alaw(s16pcm_val);
intalaw2data(unsignedchara_val);
staticintsearch(intval,short*table,intsize);
/*全局变量*/
HANDLEhHandset;
s16data;
s16data1;
u16i=0;
u16temp1;
u16j=0;
u16k,l=0;
u8temp2;
u16buffer[20000];
staticshortseg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF};
/*主函数*/
voidmain()
{
if(brd_init(100))
return;
led
(2);//闪灯两次
initcodec();//初始化codec
flashenable();//选择片外FLASH为片外存储器
/*
delay(100);
brd_led_toggle(BRD_LED0);
for(i=0x9000;i<0xefff;i++)
{
REG_WRITE(i,*(volatileu16*)DRR1_ADDR(HANDSET_CODEC));
delay(20);
}
brd_led_toggle(BRD_LED1);
delay(200);
for(i=0x9000;i<0xefff;i++)
{
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=REG_READ(i);
delay(20);
}
brd_led_toggle(BRD_LED2);
*/
while
(1)
{
while(!
MCBSP_RRDY(HANDSET_CODEC)){};//等待接收handset处的采样
brd_led_toggle(BRD_LED0);
data=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);//从handset处读取采样
temp1=data2alaw(data);//对采样进行a律压缩
/*把低地址数据放在高八位高地址数据放在低八位*/
i=i+1;
if(i%2==1)
{
buffer[j]=(temp1<<=8);
/*奇数数据左移8位temp1=abcdefgh00000000
buffer[j]=temp1*/
}
else
{
buffer[j]=(buffer[j]|temp1);
/*偶数数据与temp1取或组成新的数据
buffer[j]=abcdefghiabcdefghi*/
j++;//j加1
}
if(i>=40000)
{
i=0;
}
if(j>=20000)
{
j=0;
brd_led_disable(BRD_LED0);
brd_led_toggle(BRD_LED1);
//点亮二极管1表示放音开始
/*放音部分*/
for(k=0;k<40000;k++)
{
if(k%2==0)
{
temp2=(buffer[l]>>8)&0x0ff;
}
else
{
temp2=buffer[l]&0x0ff;
l++;
}
if(l>=20000)
l=0;
data1=alaw2data(temp2);//a律解压
while(!
MCBSP_XRDY(HANDSET_CODEC)){};
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data1;//将数据写入D/A转换器
}
/*放音结束*/
brd_led_toggle(BRD_LED0);
brd_led_toggle(BRD_LED1);
}
}
}//主程序结束
/*子函数*/
/*******延时******/
voiddelay(s16period)
{
inti,j;
for(i=0;i { for(j=0;j } } /*******闪灯******/ voidled(s16cnt) { while(cnt--) { brd_led_toggle(BRD_LED0);//切换LED指示灯0的显示状态 delay(1000); brd_led_toggle(BRD_LED1); delay(1000); brd_led_toggle(BRD_LED2); delay(1000); } } /*****初始化codec**/ voidinitcodec(void) { /*OpenHandsetCodec获取设置codec的句柄*/ hHandset=codec_open(HANDSET_CODEC);/Acquirehandletocodec /*Setcodecparameters*/ codec_dac_mode(hHandset,CODEC_DAC_15BIT);//DACin15-bitmode codec_adc_mode(hHandset,CODEC_ADC_15BIT);//ADCin15-bitmode codec_ain_gain(hHandset,CODEC_AIN_6dB);//6dBgainonanaloginputtoADC codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB); //-6dBgainonanalogoutputfromDAC codec_sample_rate(hHandset,SR_8000);//8KHzsamplingrate } /*****设置flash****/ voidflashenable(void) { CPLD_CTRL2_REG|=0x0010; CPLD_DMCTRL_REG|=0x0040; } /*****a律压缩******/ unsignedchardata2alaw(s16pcm_val) { intmask; intseg; unsignedcharaval; if(pcm_val>=0) { mask=0xD5;//标记(7th)bit=1 } else { mask=0x55;//标记bit=0 pcm_val=-pcm_val; } //Convertthescaledmagnitudetosegmentnumber. seg=search(pcm_val,seg_end,8); //Combinethesign,segment,andquantizationbits. if(seg>=8)//outofrange,返回最大数. return(0x7F^mask); else { aval=seg< if(seg<2) aval|=(pcm_val>>1)&QUANT_MASK; else aval|=(pcm_val>>seg)&QUANT_MASK; return(aval^mask); } } /****alaw的子程序**/ staticintsearch(intval,short*table,intsize) { inti; for(i=0;i { if(val<=*table++) return(i); } return(size); } /*****a律解压******/ intalaw2data(unsignedchara_val) { intt; intseg; a_val^=0x55; t=(a_val&QUANT_MASK)<<4; seg=((unsigned)a_val&SEG_MASK)>>SEG_SHIFT; if(seg==0) { t+=8; t=(t>>3); } if((seg<4)&&(seg>0)) { t+=0x108; t=(t>>(4-seg)); } if(seg>3) { t+=0x108; t=(t<<=(seg-4)); } return((a_val&SIGN_BIT)? t: -t); } /*结束*/ 四.操作过程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语音 压缩 存储 回放 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)