dsp+语音压缩存储与回放.docx
《dsp+语音压缩存储与回放.docx》由会员分享,可在线阅读,更多相关《dsp+语音压缩存储与回放.docx(21页珍藏版)》请在冰点文库上搜索。
![dsp+语音压缩存储与回放.docx](https://file1.bingdoc.com/fileroot1/2023-8/3/2606c816-b31b-4ff9-aad7-ae0c665371a7/2606c816-b31b-4ff9-aad7-ae0c665371a71.gif)
dsp+语音压缩存储与回放
A率语音压缩、存储与回放
一、概述
语音信号是信息的重要形式,语音信号处理有着广泛的应用领域,而语音压缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中以及有较成熟的发展并且已经广泛应用。
本次实验采用TI公司的TMS320C5402的DSK实验版实现语音信号的压缩存储与解压的。
SEED-VC5402DSK实验板上集成了SRAM,FLASH,音频输入输出接口等部件。
这些外设为我们提供了极大的方便。
实验主要分为语音信号接收,压缩,存储,解压,增益和输出几部分。
语音信号模数、数模转换采用TLC320AD50C(以下简称AD50),这是一款SIGMA-DELTA型单片音频接口芯片(AIC)。
它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置,内含抗混叠滤波器和重构滤波器。
在DAC之前有一个插值滤波器以保证输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。
DSP主芯片通过McBSP多通道缓冲串行口与AD50连接,其主要特点如下:
1.全双工通信。
2.双缓冲发送、三缓冲接收寄存器,以实现连续数据流发送。
3.支持多达128通道个的接收和发送。
4.利用DMA,McBSP可脱离CPU控制,直接内存存取单独运行5.内置律和律硬件压缩和扩展。
信号的接收和输出采用DMA方式,DMA是C5400DSP系统中非常重要的片上外设,其控制器可以在不影响CPU的情况下完成数据的传输,因此数据传输速度快,其数据的源和目的可以是片内存储器片上外设和片外设备。
C5402的DMA拥有6个独立的可编程通道,允许6个不同的DMA操作。
另外DMA控制器还相应HPI的服务请求。
二、实验目的
1.通过本次试验的设计和操作,掌握在CCS的软件环境下进行编辑、编译链接、调试和数据分析等工作。
2.学习采集及存储数据方法。
3.充分利用DSK的集成环境,完成语音的采集,存储和回放。
4.掌握PCM编码技术的基本原理及语音的A律压缩与解压。
三、实验内容
1.使用DSP实现语音压缩和解压缩的基本算法,算法类型自定。
2.采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中。
3.存储器存满后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。
4.使用指示灯对语音存储和回放过程进行指示。
四、实验原理
1.语音编码
(1)概念:
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
PCM编码即脉冲编码调制。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化:
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和μ律,μ律是最常用的一种。
在美国,7位μ律是长途电话质量的标准。
而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
(3)DPCM&ADPCM:
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。
相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。
因为差分信号比原语音信号的动态范围和平均能量都小。
这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。
CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。
这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。
2.当前压缩算法及压缩技术介绍
(1).压缩算法的介绍
用途
抽样频率(kHz)
压缩标准或系统
压缩技术
码率(kbit/s)
长途电话
8
G.711
G.726
G.728
PCM
ADPCM
LD-CELP
64
40/32/24/16
16
移动电话
8
GSM
IS54/IS95
G.729
RPE/LTP
VSELP/QSELP
CS-ACELP
13.2
16/8/4/2/1
8
ISDN,会议电视
1
G.722
SB-ADPCM
64/56/48
VCD
32/48
ISO/IEC10149
MPEG1
192/128/96
(2).压缩技术的介绍压缩技术
a.波形编码:
直接对语音时域或频域波形样值进行编码。
PCM,ADPCM,SBC,ATC
b.参数编码:
对人类语音的生成模型的参数进行编码。
c.混合编码:
结合波形编码和参数编码。
MPLPC,RPE/LTP,CELP,VSELP
d.可变速率编码:
G.727嵌入式编码
e.无失真编码。
霍夫曼编码
f.ADPCM工作原理
h.自适应地改变量化幅值
i.确定好量化幅度的最大值和最小值
3、语音的A律压缩与解压
统计表明对于每一个讲话者来说,语音中小幅度成分出现的概率要比大幅度多得多,为了在语音信号的整个动态范围内都可以接受低电平信号,量化电平必须照顾到语音的低电平信号,极低电平的量化间隔要小,高电平的量化间隔要大。
压缩扩展技术能过借用3种方法实现:
(1)模拟信号在到达ADC前,即进行8比特量化前,首先通过一个非线性电路;
(2)使用一个8比特ADC,其内部量化电平取非均等间隔;
(3)使用线性12比特ADC然后借助于数字查表(12笔特输入,8比特输出)。
这三种方法都需要有非线性性功能,差别仅是非线性放在什么地方。
两个标准的压缩扩展特性曲线称为u律和A律,使CCITT提出的G.711协议PCM编码方式的一部分。
北美和日本使用u律,欧洲使用A律,两个算法使用了非线性,把量化间隔变换成人耳能检测的线性空间。
A律限制采样值为12比特,A律的压缩可以按照下列公式进行定义:
式中,A是压缩参数(在欧洲,A=87.6)x是需要压缩的归一化整数。
从线性到A律的压缩转换如下表所示:
压缩后的码字组成:
比特0-3表矢量化值,比特4-6表示段值,压缩后的码字符号放在比特7,为了简化未写出.
压缩前的码字
丢弃的比特数
压缩后的码字
输入值
段值,量化值
比特:
11109876543210
比特:
6543210
0000000abcdx
1
000abcd
0000001abcdx
1
001abcd
000001abcdxx
2
010abcd
00001abcdxxx
3
011abcd
0001abcdxxxx
5
100abcd
001abcdxxxxx
6
101abcd
01abcdxxxxxx
7
110abcd
1abcdxxxxxxx
8
111abcd
A律的扩展可定义为:
从A律到线性扩展的转换如下表:
压缩过的码字
偏值的输入
段值,量化值
比特:
6543210
比特:
11109876543210
000abcd
0000000abcd1
001abcd
0000001abcd1
010abcd
000001abcd10
011abcd
00001abcd100
100abcd
0001abcd1000
101abcd
001abcd10000
110abcd
01abcd100000
111abcd
1abcd1000000
4.硬件特点
C5402的特点
●增强型哈佛结构,一个程序总线,三个独立的数据总线
●40bit的算术逻辑单元ALU
●可寻址的程序空间达1Mx16bit
●4Kx16bit片内ROM
●16Kx16bit双口片内RAM
●片内外设:
软件可编程等待状态发生器;片内锁相环时钟发生器;
●两个多通道缓冲串口;增强型8bit并行HPI口;两个16bit定时器;六通道DMA控制器
●节电模式IDLE1,IDLE2,IDLE3做功耗控制
●单周期定点指令(100MIPS)执行时间为10ns
5.C5402及其多通道缓冲串口
C5402硬件优点:
内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间;指令执行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求如FIR、IIR、FFT等运算。
C5402的软件特点:
7种有效灵活的寻址方式,仅为10ns的指令执行周期。
6.AD50
(1)AD50是一款SIGMA-DELTA型单片音频接口芯片。
它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置。
在DAC之前有一个插值滤波器以保证输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。
(2)AD50内部有7个数据和控制寄存器,用于编程控制它们的工作状态。
寄存器0:
空操作寄存器。
寄存器1:
软件复位;软件掉电;选择16位或15位工作方式;硬件或软件二次通信请求方式的选择。
寄存器2:
使能ALTDATA输入端;为ADC选择16/15位方式。
寄存器3:
选择FS与FSD之间延迟SCLK的个数;告诉主机有几个从机被联上。
寄存器4:
为输入和输出放大器选择放大器增益;选择N来设置采样频率,fs=MCLK/(128*N)MCLK/(512*N);在MCLK输入端使能外部时钟输入并旁通内部的PLL。
寄存器5,6:
保留
(3)AD50与C5402之间的数据传送采用串行方式,包括两种传输模式:
16位和15+1位传输模式。
15+1位模式时,其中的D0位表示二次通信。
五、实验程序设计
1.TMS320VC5402McBSP的串口的初始化:
首先将DSP的串口1复位,再对串口1的16个寄存器进行编程,使串口1工作在以下状态:
禁止SPI模式,但数据相,每帧一字,每字16位,帧同步脉冲低电平有效,并且帧同步信号和移位信号有外部时钟产生。
DSP给AD50编程用查询方式,A/D转换数据的接收和D/A转换的数据发送采用查询方式。
hHandset=codec_open(HANDSET_CODEC);
此语句调用了函数codec_open()对串口1进行了初步设置,设置成功返回codec的句柄放在变量hHandset中,作为调用其他函数的实参。
2.AD50的初始化:
codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DAC15bit模式*/
codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADC15bit模式*/
codec_ain_gain(hHandset,CODEC_AIN_6dB);/*输入6dB增益*/
codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);/*输出-6dB增益*/
codec_sample_rate(hHandset,SR_16000);/*16KHz采样率*/
该初始化过程调用了5个函数对AD50的5项参数进行了设置,包括ADC和DAC的工作模式,模拟输入和输出的增益;以及AD/DA的转换速率。
3.用TMS320VC5402实现语音的A率压缩解压有两种方法:
(1)使用多通道缓冲串口(McBSP)的缩展器
在多缓冲通道串口(McBSP)内部装置了硬件电路,支持A律格式缩展器,对数据进行压缩与扩展,A律缩展器允许14比特的动态范围。
首先描述一下McBSP硬件如何能够同时处理A律,如图显示的是McBSP缩展器硬件工作流程。
在接受端,McBSP接收压缩的、非线性的数据然后扩展为线性数据写道CPU或DMA,在发送端,从CPU或DMA得到的线性数据在发送前必须按着A律压缩。
RSRRBRRJUSTDRR
到CPU或DMA
DLB模式非DSB模式
(1)用软件实现
主程序的功能是从McBSP的接收通道读取A/D转换的值,然后经过压缩解压后将其发送到McBSP的发送通道,构成AD50CODEC模拟输入和输出通道的自环,是否能接收到A/D转换的数据是通过查询串口1的接收标志RRDY来进行的,程序为:
while
(1)
{
while(!
MCBSP_RRDY(HANDSET_CODEC)){};
data=*(volatileint*)DRR1_ADDR(HANDSET_CODEC);
temp1=data2alaw(data);
data=alaw2data(temp2);
*(volatileint*)DXR1_ADDR(HANDSET_CODEC)=data;
}
3.
程序流程图
六、实验操作步骤
1.将SEED-VC5402DSK板与计算机的并口相连。
2.连接DSK板的电源,并启动计算机。
3.双击桌面上的CCS2(C5000)图标运行CCS程序,在CCS并行调试管理器窗口中选择打开“C5402DSK/CPU-1”选项启动DSK板的驱动程序,注意在启动CCS之前先按一下DSK板的复位按钮。
正常启动CCS之后,在CCS的左上角出现“C5402DSK/CPU-1”的提示。
4.将本工程目录拷贝至C:
\ti\myproject目录下。
5.将本工程进行编译,并装载程序。
6.运行工程,在MIC信号输入端输入语音信号,在SPEAKER信号输出端用耳机接收。
七、程序调试及结果
1.待程序设计好之后,将其添加到一个新建的工程里调试,编译,在次过程中要向工程中添加文件:
.CMD和库文件:
(1)drv5402.lib是软件仿真所用的仿真器所必需的库文件;
(2)dsk5402.lib是驱动DSK板所必需的库文件;
(3)rts.lib,这个库提供目标DSP运行时间支持(runtime-support)。
在程序中还用到了头文件:
#include
#include
#include
#include
构建通过并生成.out文件,然后装载.out文件。
这样就可以运行了。
为了验证程序是否已正常运行,可以在麦克风/扬声器接口分别接上话筒和耳机,对着话筒说一段话,一段延时后将可以从耳机中听到之前的声音。
同时,也可以在CCS中打开观察窗口、寄存器窗口以及图形显示窗口。
2..cmd文件类型及作用:
.cmd是链接器命令文件,用于存储器配置。
.cmd文件结构:
.cmd由两条链接伪指令来描述:
MEMORY和SECTIONS,其中:
MEMORY定义用户目标系统存储器的配置;
SECTIONS控制段的构建和存储器的分配。
首先存储器空间是需要配置的,因为DSP不同的空间占用相同的地址,因此需要人工分配。
5402.cmd全文及其解释如下:
MEMORY
{
PAGE0:
VECS:
origin=0080h,length=0080h/*内部程序RAM*/
PRAM:
origin=0100h,length=0FFFh/*内部程序RAM*/
PAGE1:
SCRATCH:
origin=1000h,length=0020h/*ScratchPadDataRAM*/
DMARAM:
origin=1020h,length=0300h/*DMA缓存*/
DATA:
origin=1320h,length=0080h/*内部数据RAM*/
STACK:
origin=1400h,length=0500h/*堆栈内存空间*/
INRAM:
origin=1900h,length=0100h/*内部数据RAM*/
HPRAM0:
origin=1A00h,length=0002h/*HPI*/
HPRAM1:
origin=1A02h,length=0280h/*HPI*/
HPRAM2:
origin=1C82h,length=0280h/*HPI*/
EXRAM:
origin=1F10h,length=0EA00h/*外部内存*/
}
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
}
.cmd文件的细节问题:
未初始化段:
存储器中的保留空间(通常是RAM)。
程序可以在运行时使用这个空间,建立和存储变量。
汇编器compiler建立如下未初始化段:
.bss段:
为globalandstaticvariables保留空间。
当使用-c链接选项,程序启动时,C/C++boot程序将.cinit段的数据拷出,存到.bss段中。
.stack段:
为C/C++系统堆栈systemstack分配存储器,其存储器可以传送变量。
八、硬件实现及现象
连接好SEED-VC5402DSK试验板和计算机的通信,通电后首先进行复位,然后启动CCS,编译、下载。
运行编写的程序会看到DSK板上的3个灯依次点亮三次,熄灭之后就可以进行采集语音信号了,当第一个灯亮时,开始在J5端采集音频信号,采集完后,第一个灯灭,第二个灯亮,在J6端耳机开始放音,就会听到刚才储存的15秒左右的音频信号。
放完音后,第二个灯熄灭,第三个灯亮,程序结束。
经过短暂的延时后,程序进入下一轮循环。
九、实验心得及总结
本次课程设计我们学会了DSP基本的原理结构、TMS320C5402芯片及其DSK开发板的使用,并利用编写了本次A率语音压缩存储的程序,对语音压缩的基本原理也有了一定的了解。
课程设计中我们选择了较为简单的C语言而没有选择繁杂的汇编语言,但是由于以前没有给PC以外的平台编写程序的经验,给涉及硬件的程序编写带来了困难。
通过阅读TI公司的例程和相关的文档,我们才逐步掌握了DSP编程的方法。
课程设计中使用了TI的CCS集成开发工具,给整个课程设计带来了极大的便利,学会了CCS使用后,整个程序的设计、编辑、载入都可在一个集成环境下完成,而不用去输入繁杂的DOS提示符命令。
本次课程设计的结果基本达到了预期的效果,但是还有很多不完善的地方。
程序在运行过程中始终伴随着某种固定的噪声,虽然反复查询修改程序,最后仍然没有找到噪声产生的原因,只是通过增加采样频率和输出增益尽量的减少噪声的干扰。
程序在运行过程中也不是每次都按照预期结果运行,有时出现语声被噪声掩埋的现象,分析原因可能是由于DSK开发板的存储器配置出现问题,但因时间所限,最终没有找到错误的原因并将其改正。
十、A率语音源程序:
#include
#include
#include
#include
voiddelay(intperiod);//延时子程序声明
unsignedchardata2alaw(intpcm_val);//压缩子程序
intalaw2data(unsignedchara_val);//解压缩子程序
HANDLEhHandset;