dsp语音信号压缩A律.docx

上传人:b****6 文档编号:9280977 上传时间:2023-02-04 格式:DOCX 页数:19 大小:216.64KB
下载 相关 举报
dsp语音信号压缩A律.docx_第1页
第1页 / 共19页
dsp语音信号压缩A律.docx_第2页
第2页 / 共19页
dsp语音信号压缩A律.docx_第3页
第3页 / 共19页
dsp语音信号压缩A律.docx_第4页
第4页 / 共19页
dsp语音信号压缩A律.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

dsp语音信号压缩A律.docx

《dsp语音信号压缩A律.docx》由会员分享,可在线阅读,更多相关《dsp语音信号压缩A律.docx(19页珍藏版)》请在冰豆网上搜索。

dsp语音信号压缩A律.docx

dsp语音信号压缩A律

语音信号压缩(A律)

绪论

语言是人们最重要的交流工具,语音信号处理是语音学和数字信号处理相结合的交叉学科,同时又与心理声学、语言学、模式识别和人工智能等学科相联系。

既依赖这些学科的发展,又可以促进这些学科的进步。

近年来,随着多媒体信息技术和网络技术的高速发展,数字语音压缩技术的应用领域越来越广泛,尤其在可视电话、IP网络电话、数字蜂窝移动通信、综合业务数字网、公共交换电话网和话音存储转发系统等领域中,需要在保证语音一定质量的前提下尽可能降低其编码比特率,便于在有限的传输带宽内让出更多的信道用于传送图像、文档、计算机文件和其他数据流。

本文通过研究A律压缩算法的应用,来实现语音信号的压缩。

近年来,DSP技术在我国也得到了迅速的发展,不论是在科学技术研究,还是在产品的开发等方面,在数字信号处理中,其应用越来越广泛,并取得了丰硕的成果。

数字滤波占有极其重要的地位。

一个完备的语音信号处理系统不但要具备语音信号的采集和回放功能,而且更重要的是要能完成复杂的语音信号分析和处理处理算法,通常这些算法运算量大,而且又要满足实时或准时的快速高效处理要求,因此需采用高速DSP芯片,另外,在要求系统满足较好的通用性的同时,针对不同的应用和不断出现的新的处理方法,还要使系统便于功能的改进和扩展。

为此,我们以PC机为主机,以TMS320C50为信号处理核心设计了该系统,TMS320C50是美国TexasInstrument公司的16位定点DSP产品,它包括改进的哈佛结构,高性能CPU,片内存储器,在外围接口以及一套高效的泄编指令集,计算速度可达40Mips且性能价格比较好。

1语音信号压缩(A律)课程设计的目的及设计任务

1.1课程设计的目的

本设计的目的在于通过使用DSP的程序设计完成对语音信号的压缩,既可以通过软件实现,也可以通过硬件实现。

进行程序的设计,并在CCS软件环境下进行调试,同时也加深学生对数字信号处理器的常用指标和设计过程的理解。

1.2课程设计任务

1.完成语音信号采集;

2.对语音信号进行A律压缩;

3.传输压缩后的信号。

2TMS320C55X的硬件结构

2.1C55X的CPU体系结构

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位的程序代码送入指令缓冲单元进行译码。

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)

地址程序单元包括数据地址产生电路、算术逻辑电路和寄存器组构成。

数据地址产生电路能够接收来自I单元的立即数和来自A单元的寄存器产生读取数据空间的地址。

对于使用间接寻址模式的指令,有P单元向DAGEN说明采用的寻址模式。

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语音信号压缩(A律)简介

而作为语音信号处理的主要应用分支之一的语音压缩,又称为语音编解码,通过减少语音信号的冗余度和利用人耳掩蔽等特性实现数据压缩,目的是有利于存储、数字传输,节省带宽。

像ITUG.7xx、AMR等都是指语音编码的标准,GSM、3G手机中的语音通信以及电话录音等都离不开语音编码。

虽然现在硬盘空间越来越大,网络带宽也越来越宽了,但还是有必要进行语音压缩。

这是因为,以前考虑存储设备和网络的成本,需要将语音信号压缩到很低码率才能传输,同时语音质量也相应变差了,后来硬盘便宜了,网络宽了,大家更关注语音质量了,因此语音信号压缩的码率提高了,再后来又出现了宽带语音编码、多声道语音编码、超宽带语音编码等等。

其实,最后它依赖于客户的需求和实现成本的权衡,在有些领域,如玩具、字典、学习机等更关注存储器的成本,同时希望语音质量能够尽可能的好;有些领域,如电话录音、视频监控等,会更注重语音质量或者说也没有必要过分压缩(语音带宽相比视频带宽根本不值一提);同时还有一些领域,如卫星通信、军事低码率通信、地下救援通信等特殊应用就需要有较低的码率,是离不开语音压缩的。

4语音信号压缩(A律)原理

PCM(PulseCodeModulation)编码即脉冲编码调制,也就是将模拟信号转换为数码,然后再转换成二进制数字信号的方法。

几种常见的二进制编码格式如下:

表4.1常见的二进制编码格式

量化电平

自然二进制

偏移二进制

2补码

反射二进制

折叠二进制

+7

111

1111

0111

1000

0111

+6

110

1110

0110

1001

0110

+5

101

1101

0101

1011

0101

+4

100

1100

0100

1010

0100

+3

011

1011

0011

1110

0011

+2

010

1010

0010

1111

0010

+1

001

1001

0001

1101

0001

+0

000

1000

0000

1100

0000

-0

――

――

――

――

1000

-1

――

0111

1111

0100

1001

-2

――

0110

1110

0101

1010

-3

――

0101

1101

0111

1011

-4

――

0100

1100

0110

1100

-5

――

0011

1011

0010

1101

-6

――

0010

1010

0011

1110

-7

――

0001

1001

0001

1111

-8

――

0000

1000

0000

――

A律压缩编码压缩码是CCITT(ConsultativeCommitteeforInternationalTelegraphandTelephone)国际电报电话协会最早推出的G.711语音压缩解压编码的一种格式的主要内容。

其中欧洲和中国等国家采用A律压缩解压编码。

A律压缩的数学解析式为:

y={

y={

 式中:

y为输出信号;x为输入信号;A为压缩系数。

   由上式得知,小信号时为线性特性,大信号时近似为对数特性。

这种压扩特性常把压缩、量化和编码合为一体。

A律可用13段折线逼近(相当于A=87.6),便于用数字电路实现。

13段折线的压缩特性如图1所示。

图3.2分段为x取正值时的情况,而x取负值时,压扩特性与x取正值成奇对称,在正8段和负8段中,正1、2段和负1、2段斜率相同,合为一段,所以原来的16段折线变为13段折线。

图4.1A律压缩曲线

图3.3是DSP进行数据压缩解压的简单流程,DSP将传输来的压缩后的数据进行解压成16位或者32位,然后对解压后的数据进行分析、处理;然后将处理后的数据按照要求压缩成8位的数据格式输出到相应设备,供其他设备读取。

 

图4.2DSP进行数据压缩解压的简单流程

表4.2A律数据压缩表

12位码(十进制)

量阶

符号位

段落码(二进制)

段内码(二进制)

0~15

1

0

000

0000~1111

16~31

1

0

001

0000~1111

32~63

2

0

010

0000~1111

64~127

4

0

011

0000~1111

128~255

8

0

100

0000~1111

256~511

16

0

101

0000~1111

512~1023

32

0

110

0000~1111

1024~2047

64

0

111

0000~1111

在进行A律压缩时,对于采样到的12位数据,默认其最高位为符号位,压缩时要保持最高位即符号位不变,原数据的后11位要压缩成7位。

这7位码由3位段落码和4位段内码组成。

具体的压缩变换后的数据根据后11位数据大小决定。

具体的编译码表如表5.2所示。

压缩后的数据的最高位(第7位)表示符号,量阶分别为1、1、2、4、8、16、32、64,由压缩后数据的第6位到第4位决定,第3位到第0位是段内码。

压缩后的数据有一定的失真。

有些数据不能表示出,只能取最近该数据的压缩值。

例如,数据125,压缩后的值为00111111,意义如下:

00111111

 

最终结果为64+4×15=124,实现了压缩。

5CCS概述

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组成。

CCS提供了基本的代码生成工具,它们具有一系列的调试、分析能力。

CCS支持如下所示的开发周期的所有阶段。

图5.1CCS开发周期阶段

CCS提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。

集成可视化代码编辑界面,可以方便地直接编写C、汇编、.h文件、.cmd文件等。

集成代码生成工具,包括汇编器、优化的C编译器和连接器等。

具有完整的基本调试工具,可以载入执行文件(.out),查看寄存器窗口、存储器窗口和变量窗口、反汇编窗口等,支持在C源代码级进行调试。

支持多片DSP联合调试。

断点工具,支持硬件断点、数据空间读/写断点、条件断点等。

探针工具,用于进行算法仿真,数据监视等。

剖析工具,用于评估代码执行的时间。

数据图形显示工具,可绘制时域/频域波形、眼图、星座图等,并可以自动刷新。

提供GEI工具,用户可以根据需要编写自己的控制面板/菜单,从而方便直观地修改变量,配置参数。

6语音信号压缩(A律)软件实现

6.1软件实现步骤

6.1.1准备

设置c55xx软件仿真模式,连接好DSP开发系统,并启动CCS。

6.1.2新建工程

首先新建工程文件xxx,然后将程序写入工程文件中,并保存。

CCS工程界面如图所示:

图6.1

6.1.3编译链接并装载程序

把文件添加到工程中后,再对文件进行编译链接,生成.out文件,然后装载输出文件。

6.1.4设置信号压缩观察窗口

在菜单中选择view---watchwindow,并在watch1窗口中name栏设置观察输出数据,即utemp,并设置为十六进制观察数据。

6.1.5设置断点

在程序有注释断点处设置软件断点。

6.1.6运行并观察结果。

6.2结果分析

运行前:

图6.2

运行后:

图6.3

输入被压缩数据为32,即0000100000,运行后获得压缩之后数据位0x0010h,经验证,数据压缩正确。

7结论

此类压缩是一种最简单的线性位压缩方式,可以将高位的数据压缩成低位的数据,它适用于声音信号的播放和传输系统,但采集和播放音乐信号时采用高位的AD和DA可得到较好的音乐效果,但传输或保存声音信号时,可压缩存储,从而在同样的存储空间上存储较长时间的语音信号,现在很多简单的录音设备就采用这种方式,但A率压缩率不高,而且压缩的失真是固定的,不能通过算法提高,所以在较为复杂的语音设备中应用较少。

参考文献

[1]姜阳,周锡青.DSP原理与应用实验.西安:

西安电子科技大学出版社,2008

[2]TMS320C55XDSPProgrammer’sGuideSPRU376A[Z].TexasInstruments,

2001

[3]TMS320C55XDSPAssemblyLanguageToolsUser’sGuideSPRU280H[Z].TexasInstruments,2004

[4]程佩青,数字信号处理教程第二版,清华大学出版社,2001.8

[5]李利.DSP原理及应用实用技[M].北京:

中国水利水电出版社,2004

 

致谢

感谢校方给予我这样一次机会,让我能够完成一个课程设计,使我在本次课程设计中收获颇丰。

这次课程设计使我对以前学习的理论知识有了一个更好的理解,通过实践让我对DSP运行的CCS5000环境更加熟悉,实现学以致用,同时增强了我的动手能力和实践操作能力,还培养了我独立思考的能力。

在这次课程设计的过程中,我得到了许多人的帮助。

首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多问题,让我能把设计做得更加完善。

在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。

其次,我要感谢帮助过我的同学,本次课程设计同学们互相帮助的精神也让我非常感动。

在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。

在此,谨向指导老师姜阳老师和周锡青老师致以衷心的感谢和崇高的敬意!

最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。

附录(软件程序)

1.信号压缩算法------“Alaw.c”

#include

chari=0;

unsignedintsign,segment,quant,absol;

unsignedintnOutput;

unsignedcharIntToaLaw(intnInput)

{

unsignedinttemp;

unsignedcharcOutput;

absol=abs(nInput);//取绝对值

sign=(nInput>=0)?

0:

1;//符号位

temp=absol<<3;

while

(1)

{

nOutput=temp&0x8000;

if(nOutput)break;//碰到1就退出

temp<<=1;

i++;

if(i==8)break;

}

if(i<8)

{

temp&=0x7800;//保留段内码

quant=temp>>11;//段内码

segment=8-i;//段落码

nOutput=(segment<<4)+quant;}

else

{

temp&=0x7fff;

nOutput=temp>>11;

}

if(sign)

nOutput|=(1<<7);

cOutput=(unsignedchar)nOutput;

returncOutput;

}

2.主程序------“c55_fira.c”

#include

#defineSIGNAL1_F200

#defineSIGNAL2_F640

#defineSALMP_F2000

#defineCOFF_L23

#defineBUF_L256

#definePI3.1415926

inttemp;

unsignedcharutemp;

externunsignedcharIntToaLaw(int);

externintaLawToInt(unsignedchar);

intdata_in[BUF_L];

intdata_out[BUF_L];

intk=0;

voidmain(void)

{

while

(1)

{

utemp=IntToaLaw(32);

temp=aLawToInt(utemp);

data_out[k]=temp;//设置断点

k++;//设置断点

if(k>=BUF_L)k=0;//设置断点

}

}

 

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

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

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

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