语音信号压缩μ率.docx
《语音信号压缩μ率.docx》由会员分享,可在线阅读,更多相关《语音信号压缩μ率.docx(23页珍藏版)》请在冰点文库上搜索。
![语音信号压缩μ率.docx](https://file1.bingdoc.com/fileroot1/2023-7/26/d1307dff-2d28-4fac-8035-b01f820666f6/d1307dff-2d28-4fac-8035-b01f820666f61.gif)
语音信号压缩μ率
1语音信号压缩(μ律)原理
1.1语音信号编码
概念:
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
PCM编码即脉冲编码调制。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
量化:
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和μ律,μ律是最常用的一种。
在美国,7位μ律是长途电话质量的标准。
而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
DPCM&ADPCM:
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。
相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。
因为差分信号比原语音信号的动态范围和平均能量都小。
这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。
CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。
这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。
1.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
表1.1 压缩算法表
2.压缩技术的介绍
波形编码:
直接对语音时域或频域波形样值进行编码。
PCM,ADPCM,SBC,ATC
参数编码:
对人类语音的生成模型的参数进行编码。
混合编码:
结合波形编码和参数编码。
MPLPC,RPE/LTP,CELP,VSELP
可变速率编码:
G.727嵌入式编码
无失真编码。
霍夫曼编码
ADPCM工作原理
自适应地改变量化幅值
确定好量化幅度的最大值和最小值
1.3语音信号的μ律压缩
1.3.1量化方法概述
所谓量化就是把抽样信号的幅度离散化的过程。
根据量化过程中量化器的输入与输出的关系,可以有均匀量化和非均匀量化两种方式。
均匀量化时,由于对编码范围内小信号或大信号都采用等量化级进行量化,因此小信号的“信号与量化噪声比”小,而大信号的“信号与量化噪声比”大,这对小信号来说是不利的。
为了提高小信号的信噪比,可以将量化级再细分些,这时大信号的信噪比也同样提高,但这样做的结果使数码率也随之提高,将要求用频带更宽的信道来传输。
采用压缩的量化特性是改善小信号信噪比的一种有效方法。
它的基本思想是在均匀量化前先让信号经过一次处理,对大信号进行压缩而对小信号进行较大的放大。
由于小信号的幅度得到较大的放大,从而使小信号的信噪比大为改善。
这一处理过程通常简称为“压缩量化”,它是用压缩器来完成的。
压缩量化的实质是“压大补小”,使小信号在整个动态范围内的信噪比基本一致。
在系统中与压缩器对应的有扩张器,二者的特性恰好相反。
目前常用的压扩方法是对数型的A压缩律和μ压缩律,其中μ压缩律公式为
(1.1)
图1.1μ律压缩特性曲线
其中x为归一化的量化器输入,y为归一化的量化器输出。
常数μ愈大,则小信号的压扩效益愈高,目前多采用μ=255。
μ律压缩特性曲线如图1.1所示。
1.3.2μ255/15折线压缩律
μ律压缩曲线是连续曲线。
μ值不同,压缩特性也不同。
要设计电路来实现这样的函数是相当复杂的;而且采用非线性量化法时,要用压缩规律所规定的判定值直接和信号相比较,以确定信号所在量化级并直接作相应编码,那是不容易的。
为了使所需数字电路容易实现,就要求相邻的判定值或量化间隔能成简单的整数比(通常为2倍比),而这一要求用平滑和连续变化的非均匀量化律是不容易满足的。
但如果采用若干段折线组成的非均匀量化压缩律就很容易实现。
因此,就发展了用折线逼近μ律和A律非均匀量化折线压缩方式。
255/15律折线压缩方式是将μ律曲线分16段做弦,当相邻折线段的段距比值为2时,可以很好地逼近μ=255的μ律压缩曲线的特性。
实际上由于在原点两侧的第一条折线都通过原点,斜率相同而对称,所以合成了一条折线,因而实际上总共只有15条折线。
因此,这种折线压缩律就称为μ255/15折线压缩律,如图2所示:
图1.2 μ255/15折线压缩特性
1.3.3μ律压缩编码
一个8比特u=255的码子有一个符号比特、一个3比特段代码和一个4比特的电平量化值串联而成。
在发送以前,所有比特是取反的,所以一个正书将有带“1”的符号比特。
在决定输入是属于哪一段以前,原始整数的符号先不考虑,一个偏移量33加到该整数的绝对值上。
偏移量限制最大的输入为8159,并减小最小步长至2/8159。
偏移量简化了每一段两个短点的计算。
寻找所在段代码是借助于检测偏移输入模值的最有效“1”位置,而量化值是由跟在它后边的4个比特组成。
从线性到u律压缩转换如下表所说明,压缩后的码子组成:
比特0~3表示量化值,比特4~6表示段值,压缩后的码子符号放在比特7。
语音采集和播放芯片采用的是TI公司生产的TLV320AIC23B,TLV320AIC23B的模数转换(ADC)和数模转换(DAC)部件高度集成在芯片内部,芯片采用8k采样率,单声道模拟信号输入,双声道输出。
TLV320AIC23具有可编程特性,DSP可通过控制接口来编辑该器件的控制寄存器,而且能够编译SPI,I2C两种规格的接口。
DSP采用I2C口对TLV320AIC23的寄存器进行设置。
当MODE=0时,为I2C规格的接口,DSP采用主发送模式,通过I2C口对地址为0000000~0001111的11个寄存器进行初始化。
I2C模式下,数据是分为3个8b写入的。
而TLV320AIC23有7位地址和9位数据,也就是说,需要把数据项上面的最高位补充到第二个8B中的最后一位。
MCBSP串口通过6个引脚CLKX,CLKR,FSX,FSR,DR和CX与TLV320AIC23相连。
数据经MCBSP串口与外设的通信通过DR和DX引脚传输,控制同步信号则由CLKX,CLKR,FSX,FSR四个引脚实现。
将MCBSP串口设置为DSPMode模式,然后使串口的接收器和发送器同步,并且由TLV320AIC23的帧同步信号LRCIN,LR2COUT启动串口传输,同时将发送接收的数据字长设定为32b(左声道16b,右声道16b)单帧模式。
表1.2 μ律二进制编码表
压缩前的码子
丢弃的比特数
压缩后的码子
偏置的输入(模值)
段值、量化值
比特:
1211109876543210
比特:
6543210
00000001abcdx
1
000abcd
0000001abcdxx
2
001abcd
000001abcdxxx
3
010abcd
00001abcdxxxx
4
011abcd
0001abcdxxxxx
5
100abcd
001abcdxxxxxx
6
101abcd
01abcdxxxxxxx
7
110abcd
1abcdxxxxxxxx
8
111abcd
2TMS320C5X的硬件结构
2.1C55XCPU
C55X有1条32位的程序数据总线(PB),5条16位数据总线(BB、CB、DB、EB、FB)和1条24位的程序地址总线及5条23位地址总线,这些总线分别与CPU相连。
总线通过存储单元接口(M)与外部程序总线和数据总线相连,实现CPU对外部存储器的访问。
这种并行的多总线结构,使CPU能在一个CPU周期内完成1次32位程序代码读、3次16位数据读和两次16位数据写。
C55X根据功能的不同将CPU分为4个单元,指令缓冲单元(I)、程序流程单元(P)、地址流程单元(A)、和数据计算单元(D)。
读程序地址总线(PDA)上传送24位的程序代码地址,由读程序总线(PB)将32位的程序代码送入指令缓冲单元进行译码[1]。
2.2指令缓冲单元(I)
C55X的指令缓冲单元有指令缓冲队列IBQ和指令译码器组成。
在每个CPU周期内,I单元将从程序数据接收的4B程序代码放入指令缓冲队列,指令译码器从队列中取6B程序代码,根据指令的长度可对8位、16位、24位、32位和48位的变长指令进行译码,然后把译码数据送入P单元、A单元和D单元去执行。
2.3程序流程单元(P)
程序流程单元有程序地址产生电路和寄存器组凑成。
程序流程单元产生所有程序空间的地址,并控制指令的读取顺序。
程序地址产生逻辑电路的任务是产生读取空间的24位地址。
一般情况下,它产生的是连续地址,如果指令要求读取非连续地址的程序代码时,程序地址产生逻辑电路能够接收来自I单元的立即数和来自D单元的寄存器值,并将产生的地址传送到PAB。
在P单元中使用的寄存器分为5种类型。
●程序流寄存器:
包括程序计数器、返回地址寄存器和控制流程关系寄存器。
●块重复寄存器:
包括块重复寄存器0和1(BRC0、BRC1)BRC1的保存寄存器(BRS1)、块重复起始地址寄存器0和1以及块重复结束地址寄存器0和1。
●单重复寄存器:
包括单重复寄存器和计算单重复寄存器。
●中断寄存器:
包括中断标志寄存器0和1、中断使能寄存器0和1以及调试中断使能寄存器0和1。
●状态奇存期:
包括状态寄存器0,1,2和3。
2.4地址程序单元(A)
地址程序单元包括数据地址产生电路、算术逻辑电路和寄存器组构成。
A单元包括一个16位的算术逻辑单元,它既可以接收来自I单元的立即数也可以与存储器、I/O空间、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信。
A单元包括的寄存器有以下几种类型。
●数据页寄存器:
包括数据页寄存器和接口数据页寄存器;
●指针:
包括系数数据指针寄存器、堆栈针寄存器和8个辅助寄存器;
●循环缓冲寄存器:
包括循环缓冲大小寄存器、循环缓冲起始地址寄存器;
●临时寄存器:
包括临时寄存器。
2.5数据计算单元(D)
数据计算单元由移位器、算数逻辑电路、乘法累加器和寄存器组构成。
D单元包含了CPU的主要运算部件。
D单元移位器能够接收来自I单元的立即数,能够与存储器、I/O单元、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信,此外,还可以向D单元的ALU和A单元的ALU提供移位后的数据。
移位可以完成以下操作:
●对40位的累加器可以完成向左最多32位的移位操作,移位数乐意从零食寄存器读取或由指令中的常数提供;
●对于16位寄存器、存储器或I/O空间数据可完成左移31位或32位的移位操作;
●对于16位立即数可完成向左移最多15位的移位操作。
3μ律语音信号压缩设计过程
3.1设计思路
将接收到的语音信号进行模/数转换后将波形输入缓冲区,使用DSP芯片音频处理程序(输入16位线性样值,输出8位μ律样值)后,将波形输出缓冲区,经过音频信号数/模转换,最后通过扬声器播放出压缩后的语音信号。
3.2设计步骤
图3.1设计流程图
4μ律语音信号压缩的CCS实现
4.1简述CCS环境
CCS,即CodeComposerStudio,是TI公司在1999年推出的一个开放、具有强大集成开发环境。
它最初是由GODSP公司为TI的C6000系列DSP开发的。
在TI收购了GODSP后,将CCS扩展到了其它系列。
现在所有TI的DSP都可以使用CCS进行开发,但是其中的DSPBIOS功能只有C5000和C6000的CCS中才提供。
以前的DSP软件开发都是在一个分散的开发环境下进行,程序的编写、代码的生成以及调试等都是要通过命令来完成,类似于以前的DOS,十分烦杂。
而CCS的出现是DSP开发软件的一次革命性的变化。
CCS主要由代码生成工具、CCS集成开发环境、DSPBIOS和API函数以及RTDX组成。
4.2CCS配置
击桌面图标的“setupCCStudiov3.1”图标,运行CCS设置程序,如图5.1所示:
点击Add→Save&quit完成设置。
图5.1用标准配置文件设置系统配置
4.3CCS环境中工程文件的使用
在CCS集成环境下开发汇编程序或者C/C++程序,首先要建立一个工程项目文件(*.pjt),再向工程项目文件中添加汇编程序源文件(*.asm),C/C++源文件(*.c)和链接命令文件(*.cmd),并设置工程项目选项。
下面分别进行介绍建立工程文件,单击Project→New命令,系统将弹出如图所示的对话框,在该对话框中输入项目文件名,如fir单击“完成”系统就会创建一个名为fir.pjt的工程项目文件如图5.2所示。
图5.2创建新的工程项目文件对话框
选择File→New可打开一个新的编辑窗口。
在新窗口中输入源代码。
选择File→Save,在出现的对话框中输入一个文件名,并选择一个扩展名(C源代码选择*.c,汇编源代码选择*.asm),然后单击保存将源程序保存。
添加文件:
单击Project→AddFiletoProject命令然后会弹出如图5.3所示的对话框,单击打开完成对文件的添加。
图5.3向工程项目中添加文件对话框
4.4编译链接和运行目标文件
对程序进行编译:
执行Project→Compile命令就可以对当前的汇编程序进行编译生成.obj文件。
如果程序存在语法错误,那么就会在下面的编译链接信息框中显示错误信息。
根据错误提示,读者可对程序进行修改[2]。
对程序进行编译链接执行Project→Build命令,就可以对当前的项目文件同时进行编译,汇编和链接操作,并生成与工程项目名称相同的可执行的.out文件。
如果有错误信息,则会在“编译链接”信息框中显示。
也可以执行Project下的buildAll命令,所有项目中的文件重新编译,汇编和链接,生成.out文件。
单击主菜单“File”中“LoadProgram”选项,在对话框中,在CCS安装目录下,找到构建该工程的Debug目录,选择构建生成后的.out文件,并打开CCS装载完毕后,该“*.out”文件到目标dsp之后,会自动弹出“Disassembly”窗口如图5.4所示。
图5.4CCS调试程序时出现的视窗加工程界面
结果分析
CPU寄存器观察窗口
在程序正常运行,能够对语音信号进行压缩处理。
在现代通信领域中,对语音信号的压缩方面有很大的发展前景,因此,应该对该课题在做深入的研究。
该程序是对语音采集程序和16位/8位u律线性互换程序嵌套。
在有些语句上还有不和理的地方,有待于修改。
参考文献
[1]汪安民,程昱,徐宝根.DSP嵌入式系统开发典型案例.人民邮电出版社,2007
[2]樊昌信,曹丽娜.通信原理.北京:
国防工业出版社,2006.2
[3]王金龙,沈良,任国春,蔡跃明,陈瑾,吴启晖.无线通信系统的DSP实现.人民邮电出版社,2002.4
[4]TMS320C55XDSPMnemonicInstructionSetReferenceGuideSORU374G[Z].TexasInstruments,2002
[5]TMS320C55XDSPAssemblyLanguageToolsUser’sGuideSPRU280H[Z].TexasInstruments,2004
致谢
本次课程设计我们学会了DSP基本的原理结构、芯片及其DSK开发板的使用,并利用编写了本次μ率语音压缩存储的程序,对语音压缩的基本原理也有了一定的了解。
课程设计中我们选择了较为简单的C语言而没有选择繁杂的汇编语言,但是由于以前没有给PC以外的平台编写程序的经验,给涉及硬件的程序编写带来了困难。
通过阅读TI公司的例程和相关的文档,我们才逐步掌握了DSP编程的方法。
课程设计中使用了TI的CCS集成开发工具,给整个课程设计带来了极大的便利,学会了CCS使用后,整个程序的设计、编辑、载入都可在一个集成环境下完成,而不用去输入繁杂的DOS提示符命令。
作为一名大四的学生,我觉得能做类似的课程设计是十分有意义的。
通过此次设计试验也着重能够学到许多东西。
最后感谢姜阳老师和周锡青老师对我的帮助和指导。
附录软件程序
源文件
CMD文件:
MEMORY
{
PAGE0:
VECS:
origin=0xff80,length=0x80
PROG:
origin=0x2000,length=0x2000
PAGE1:
DATA:
origin=0x4000,length=0x1000
DRAM:
origin=0x5000,length=0x1000
STACK:
origin=0x6000,length=0x1000
}
SECTIONS
{
.vectors:
{}>VECSPAGE0
.text:
{}>PROGPAGE0
.data:
{}>DATAPAGE1
.bss:
{}>DRAMPAGE1
.stack:
{}>STACKPAGE1
}
语音采集模块:
.title"ex12"
BSP.set1;当前使用McBsp1
;McBsp内存映射寄存器
SPSA0.set038h
SPSD0.set039h
DRR10.set021h
DRR20.set020h
DXR10.set023h
DXR20.set022h
SPSA1.set048h
SPSD1.set049h
DRR11.set041h
DRR21.set040h
DXR11.set043h
DXR21.set042h
;McBspSubaddressedRegisters
SPCR1.set00h
SPCR2.set01h
RCR1.set02h
RCR2.set03h
XCR1.set04h
XCR2.set05h
SRGR1.set06h
SRGR2.set07h
MCR1.set08h
MCR2.set09h
RCERA.set0ah
RCERB.set0bh
XCERA.set0ch
XCERB.set0dh
PCR.set0eh
.ifBSP=0
SPSA.setSPSA0
SPSD.setSPSD0
RDRR.setDRR10
RDXR.setDXR10
.endif
.ifBSP=1
SPSA.setSPSA1
SPSD.setSPSD1
RDRR.setDRR11
RDXR.setDXR11
.endif
WR_SUB_REG.macroval,addr;写McBsp控制寄存器
stmaddr,SPSA
nop
stmval,SPSD
nop
.endm
RD_SUB_REG.macroaddr,acc;读McBsp控制寄存器
stm#:
addr:
SPSA
nop
ldmSPSD,acc
nop
nop
nop
.endm
WAITTRX.macro;等待串口中断
WAITR?
RD_SUB_REGSPCR1,A
and#1<<1,A
bcWAITR?
AEQ
.endm
PROGREG.macroprogword
stm#01h,RDXR
WAITTRX
stm#:
progword:
RDXR
WAITTRX
.endm
wait.macro
STM#0008h,AR0
RPT*AR0
NOP
.endm
.mmregs
.global_c_int00
.sect".vectors"
RESETbd_c_int00
stm#2000h,SP
.space19*4*16
BRINT0brecv
nop
nop
BXINT0btrans
nop
nop
.space4*4*16
BRINT1brecv
nop
nop
BXINT1btrans
nop
nop
.space4*4*16
.text
_c_int00
ld#0h,DP
stm#2000h,SP
ssbxINTM
ssbxSXM
st#2491h,SWWSR
st#0ffe0h,PMST
st#0f007h,CLKMD
stm#4000h,AR1
stm#4000h,AR2
mcbsp_init;初始化McBsp串口
rsbxCPL
nop;cpllatency
nop;cpllatency
nop;cpllatency
ld#0,DP
ssbxINTM
ssbxSXM
WR_SUB_REG#0000H,SPCR1
WR_SUB_REG#0200H,SPCR2
WR_SUB_REG#000CH,PCR
WR_SUB_REG#0000H,SPCR1
WR_SUB_REG#0000H,SPCR2
WR_SUB_REG#0040H,RCR1;16BITs
WR_SUB_REG#0004H,RCR2;IgnoreFSafterthef