东南大学学位论文独创性声明本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得东南大学或其它教育机构的学位或证书而使用过的材料。与我~同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。研究生签名:日期:塑幺纠。东南大学学位论文使用授权声明东南大学、中国科学技术信息研究所、国家图书馆有权保留本人所送交学位论文的复印件和电子文档,可以采用影印、缩印或其他复制手段保存论文。本人电子文档的内容和纸质论文的内容相一致。除在保密期内的保密论文外,允许论文被查阅和借阅,可以公布(包括刊登)论文的全部或部分内容。论文的公布(包括刊登)授权东南大学研究生院办理。研究生签名:盟导师签名:盗亟壶日期:电堡坐⸕䇶≤ඍ#SRORJRRJOH
第一章绪论第一章绪论§1.1现代语音编解码中的相关技术当你想和远方的朋友、家人联系时,如果让你选择一种方法,是选择打长途电话还是写信?打长途电话费钱,写信路途时间太长,不及时,而且不能表达你的心声,于是就会想到电子邮件。电子邮件,作为正在迅猛发展的Intemet的重函的方便和费用低廉。因此,电子邮件在人们的生活中发挥着越来越重要的作用。电话中,人们可以通过语言,充分地表达人们的感情。语言是最贴近生活的交流工具,也最能表达人的思想、意图和情感,比通过文字交流更直接、更亲切,即也传达了人的感情,满足了人们的感情需要,这该多好!顺应这种需求,现在有了语音电子邮件(VoiceMail)。语音电子邮件是将语音用一定的标准压缩编码后用电子邮件进行传输。现今,欧美、台湾、香港的许多企业都在大陆开设工厂及研发机构。考虑到国际长途电话的高昂费用,这些企业希望能利用现有的宽带网络,在企业集团内部实现“零”话费。这时,就需要用到VolP(VoiceoverIP)技术。与IPPhone不完全相同的是,企业网必须注意安全和互通的问题,因此整个系统得加上防火墙等其它的一些设备。现代社会,宽带网络发展迅猛。人们已经不满足于简简单单的语音通信了。越来越多的人希望在传送语音的同时也传输图像。将成为二十一世纪电话产业新主流的可视电话(VideoPhone)通过H.323通讯协议提供相当品质的图像传输。它适用于所有的IP网路架构,包括xDSL、CABLE、LAN等;随着第三代移动通信标准的成熟,它也将应用到无线领域。VideoPhone可以更清楚地传情达意,让人们的沟通没有距离,因此应用十分广泛。远距离教学、视频会议、远端监控等,都属于VideoPhone的应用。以上三种应用都需要用到语音编解码协议。语音编码是利用语音信号的统计特性,解除语音信号的相关性,去掉冗余的信息,从而降低传输码率,提高系统传输与存储的有效性。语音编解码协议有很多,如G.71l、G.722、G.723.1、G728、G729等,在IP网络上的主流应用协议是0.723.1和G.729。出于原有的PSTN(PublicSwitchedTelephoneNetwork,公共交换电话网)使用的是G.711协议【“,为了能和以前的系统兼容,现在的语音设备通常也必须支持G711协议。本文所涉及的语音编解码技术,下面将一一介绍。东南大学硕士论文要应用,正在改变着人们的生活方式,它既有着长途电话的及时,又有着普通信但是,普通的电子邮件又没有电话所具有的功能一语音。俗话说,听话听音,在所谓闻声如见人。因此,如果能够通过电子邮件发送人的声音,既方便,又省钱,第一章绪论1.G711推荐的丢帧隐藏算法G.711协议本身是不分帧的,它采用A律或u律来压缩数据【2l,输出的数据具有64kbpsPCM(PulseCodeModulation,脉冲编码调制)编码方式。在IP网络或者无线网络里,通信是基于“帧”交换的。在这样的分组语音通信中,发送端由于发送容量的限制,或在指定延迟时间内,分组信息帧没有到达接受端缓冲区,从而造成信息的丢失,即分组通信中常见的丢帧现象。此外,在分组交换网络中,由于网络拥塞、传输损耗等同样会引起丢帧。G.711推荐的丢帧隐藏(PLC,PacketLossConcealment)算法是在语音分帧之后,对于已经缺失的语音帧采用基音周期波形重复(PWR,PitchWaveforrnReplication)的方法使声音达到连贯、自然【31。2.G.729的开环基音分析模块IP电话的相关标准主要是H.323协议族。H.323协议在1996年被互联网电—ACELP,ConjugateStructure-AlgebraicCodeExcitedLinearPrediction)的8kbps的语音编码算法[41。G.729可用于各种场合下记录语音的数字监录设备,例如银行、汽车、飞机、轮船等处的语音记录设备,特别是存储设备容量不够大或是需要记录长时间、大数据量的情况。在各种需要重点考虑节省信道的通信应用中,也可以得到广泛应用,例如保密通信、军用特殊信道通信和高成本卫星信道通信等。另外还包括会议电视、可视电话和移动电话,以及其它无线应用等。(3.729的开环基音分析模块是G.729协议的一种重要组成模块,在整个G729协议中算法复杂度较高。由对它的分析可以对G.729的编码有所了解。3.G.723.1与G729协议问的VAD/CNG的参数转换静音抑制,又称语音活动侦测(VAD,VoiceActivityDetection)。静音抑制的目的是从声音信号流中识别和消除长时间的静音期,以达到在不降低业务质量的情况下节省话路资源的作用,它是IP电话应用的重要组成部分。静音抑制可以节省宝贵的传输带宽资源,有利于减少用户感觉到的端到端的时延。使用静音抑制约可节省一半的传输带宽。在实际使用中,如果出现长时间的静默,会使用户感到很不自然。因此实际上发送端常常会在静音期间发送一些分组信息帧,从而生成使用户感觉舒服一些的背景噪声,即所谓的舒适噪声(ComfortNoise)。CNG(ComfortNoiseGenerator,东南大学硕士论文信界,包括Intel、Microsoft等超过100家厂商接受为终端系统的标准。H.323协议提供了基于IP网络(包括Internet)的传送声音、视频和数据的基本标准。G729标准就是其中一个重要的语音压缩编码标准,于1995年提出,并在1996年得到进一步优化改进。G.729语音编码标准是使用共轭结构代数码激励线性预N(cs第一章绪论舒适噪声产生器)算法产生的舒适噪声与实际的背景噪声相匹配,并且有尽可能低的全局传送开销。在编码端,CNG算法使用VAD给出的每~帧的语音活动性判决,然后计算在译码端合成人工噪声所需要的参数。网关是网络中完成将一个基于IP的网络接入电话网的节点,它可在基于IP的网络和电话网之间提供双向的,实时的通信接口。网关通常由媒体网关(MG,MediaGateway)、媒体网关控制(MGC)和信令网关(SG,SignalGateway)组成【5】。其中媒体网关主要负责媒体介质流的映像或转移,即提供不同协议间的转换,如将IP域上的IP流转换为SCN域上的模拟话音、PCM语音、GSM语音等。媒体网关在语音的码流转换方面普遍采用tandem方式【5J,有时也被称为DTE方式(DecodeThenEncode),即先解码再编码。这种方式的优点在于流程清晰,算法成熟,但它也有语音质量受损、运算量大、传输延迟变长的缺陷。近年来,在多媒体语音编码领域,出现了这样的技术,即在不降低音质的前提下,不产生合成语音,也没有对合成语音的二次压缩,而是利用两个协议的某种算法共性,在参数层面直接进行转码。这项技术被称作SmartTranscoding或简称Tmnscoding。G.723.1与(3.729协议问的VAD/CNG的参数转换就是找到两种协议VAD/CNG参数的共性,然后对其进行直接转换。§1.2数字信号处理器与语音编码技术上述语音编解码协议是以数字信号处理为理论基础的。随着DSP芯片的问世及发展,语音编解码协议才有了广泛的应用。§1.2.1语音编码技术【6】语音编码的主要功能就是把语音的采样值编码成少量的比特(帧)。而且,在通信过程产生误码、网络抖动和突发传输时,这种方法必须具有健壮性(Robustness)。在接收端,语音帧先被解码为采样值,然后再转换成语音波形。语音编码的目的,是在给定的编码速率下,使得从解码恢复出的重构语音的质量尽可能高。语音编码主要可分为两种:波形编码和参数编码。波形编码就是根据语音的信号波形导出相应的数字编码形式,令在接收端的解码器能恢复出与输入信号波形相一致的原始语音。波形编码的基本思路是忠实地再现语音的时域波形。为了降低比特率,波形编码会充分利用相邻抽样点之间的相关性,对差分信号进行编码。波形编码的方法简单,有较好的合成语音质量。但它的码率高,当码率低于32kbps的时候音质明显降低。著名的波形编码标准有G.711(64kbpsPCM脉冲编码调制)和G.726(16/24/32kbpsADPCM自适应差分脉冲编码调制)。参数编码的原理和设计思想和波形编码完全不同。它根据对人的发声机理的案南士璺和i+耠呻3第一章绪论分析,着眼于构造语音生成模型,该模型以一定的精度模拟发声者的声道,接收端根据该模型还原生成发声者的语音。编码器发送的主要信息是语音生成模型的参数,相当于语音的主要特征,而并非语音的波形幅值。参数编码器可以有效地降低编码比特率,目前小于16kbps的低比特率语音编码都采用参数编码。表1-1部分语音编码标准算法的性能【71编码标准G.711G72lG728G729G723.1AMR公布年代197219841992199519951999算法名称PCMADPCMLD-CELPCS—ACELPMP—MLQ/ACELPACELP编码类型波形波形参数参数参数参数编码编码编码编码编码编码编码速率(kb/s)64321686.3/5.312.2.4.75编码质量(MOS)4_34.14.04.03.8>4.0编码延时(ms)0.1250.1250.6251537.520算法复杂度12.65022.518.7,20.221.2-37.1(MIPs)表1—1列出了较常用的六种语音编码标准的性能。翻看语音编码书籍或者查阅相关网页都会看到类似的表格。表格里的MOS(MeanOpinionScore)是评判编码质量的主观意见平均得分。表格里的MIPS又是什么呢?即MillionInstructionsPerSecond,每秒百万条指令。它是数字信号处理器的一种重要的指标。下面将对数字信号处理器作简要介绍。§1.2.2数字信号处理器简介【8】8DSP芯片,也称数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号处理算法。根据数字信号处理的要求,DSP芯片一般具有如下主要特点:1.在一个指令周期内可完成一次乘法和一次加法;2.修正的哈佛结构(ModifiedHarvardArchitecture),程序和数据空间分开,可以同时访问指令和数据。以奔腾为代表的通用微处理器,其程序代码和数据共用一个公共的存储空间,这样的结构称为冯’诺依曼结构(VonNeumannArchitecture)。DSP芯片则采用了与之完全不同的存储结构;3.片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;4.具有低开销或无开销循环及跳转的硬件支持:5.快速的中断处理和硬件I/0支持;6.具有在单周期内操作的多个硬件地址产生器;7.可以并行执行多个操作;8.支持流水线(Pipeline)操作,使取指、译码和执指等操作可以重叠进行。东南大学硕士论文第一章绪论§1.2.3数字信号处理器的发展和分类世界上第一个单片DSP芯片是1978年AMI公司发布的¥2811,1979年美国Intel公司发布的商用可编程器件2920是DSPj}:!;片的一个主要里程碑。目前,最成功的DSP芯片当数美国德州仪器公司(TexasInstruments,简称TI)的一系列产品。TI公司于1982年推出了其第一代DSP产品TMS32010,目前已发展到浮点和定点两大类9个分支系列产品,分别满足不同的需要。其发展如图1.1所示。如今,TI公司的一系列DSP产品已经成为当今世界上最有影响的DSP芯片。TI公司也成为世界上最大的DSP芯片供应商,其DSP市场份额占全吐界份额近50%。其它公司如朗讯(Lucent)、Motorola、模拟器件公司(AnalogDevices,简称AD)在DSP芯片市场上也占有一定的份额。现今流行的通信系统通常会包括一块MCU(MicroControlUnit)和一块DSP芯片。MCU主要用来控制;DSP用来做信号处理。出于简化电路的需要,将数字基带电路功能前移以及将MCU、DSP和专用接口芯片集成化,已成当前DSP芯片的发展趋势。TI公司2001年推出的基于DSP的开放式多媒体应用平台(OMAP,OpenMultimediaApplicationsPlatform)就体现了这种趋势,OMAP芯片是专为多媒体业务设计的应用平台。矧I.1TMS320系列的发展从图1.1可以看到,总的来说,DSP:出片可分为定点DSPj出片、浮点DSP芯片两大类。这是根据DSP芯片工作得数据格式来分类的。数据以定点格式工东南大学坝I:论文第~章绪论作的DSP芯片称为定点DSP芯片,如TI公司的TMS320C2000系列,TMS320C5000系列,TMS320C6000系列中的TMS320C62x和TMS320C64x等:数据以浮点格式工作的称为浮点DSP芯片,如TI公司的TMS320c3“4x,TMS320C6000系列中的TMS320C67x等。我们现在使用的芯片主要是TI公司的TMS320C5000系列和TMS320C6000系列,其中TM¥320C5000系列目前包括TMS320C54x系列和TMS320C55x系列两大类。这两类芯片软件完全兼容。TMS320C54x系列是为实现低功耗、高性能而专门设计的定点DSP芯片,主要应用在无线通信等领域。与TMS320C54x相比,C55x具有更低的功耗和更高的性能。由于语音编码技术较为简单,用定点的C54x就够了,如果系统对功耗有特别的要求,可以采用C55x芯片。本文所涉及的DSP实现是以C54x和C55x为实验平台的。TMS320C6000系列主要包括TMS320C62x、TMS320C67x,以及新出的TMS320C64x三类。其中TMS320C62x是TI公司于1997年开发的定点DSP芯片,内部集成了多个功能单元,可同时执行8条指令,其运算能力为2400MIPS,这种芯片适合于图像处理、无线基站、无线PDA、组合MODEM、GPS导航等需要大运算能力的应用场合;TMS320C67x是一种浮点DSP芯片,其运算能力达到1GFLOPS(GigaofFLoWing—pointOperationsPerSecond,每秒十亿次浮点操作),适用于对运算能力和存储量有较高要求的应用场合。TMS320C64x是TMS320C6000系列中最新的高性能定点DSP芯片,其软件与TMS320C62x完全兼容。TMS320C64x采用VelociTI.2结构的DSP核,增强并行的32个通道DMA控制器具有高效的数据传输引擎,可以提供超过2Gbps的持续带宽,它的总体性能比TMs320C62x提高了将近10倍。§1.3论文的主要工作及内容安排本文的主要工作是围绕着分组语音通信的丢帧隐藏技术、G729的实时编解码、G.723.1与G.729协议间的VAD/CNG的参数转换及它们的DSP实现做的。表面上看,这几种技术似乎没有太多联系,但事实上,它们都是当今语音编解码标准中最常用的。由于这些技术的DSP实现牵涉到算法的定点化、DSP芯片的选择等内容,本文也有阐述。总的来说,除了介绍现代语音编解码的几种技术之外,将这些技术投入到实际应用之前的一些有关DSP的研究工作,本文均有所涉及。本文的章节安排如下:第一章绪论。简略介绍了现代语音编解码中的相关技术、语音编码的分类、数字信号处理器的特点和分类等。东南大学硕士论文第一章绪论第二章首先介绍了G.71l推荐的丢帧隐藏算法以及其它的丢帧隐藏技术;然后介绍了DSP系统的设计过程、算法的定点化、DSP芯片的选择、DSP的集成开发环境CCS:最后说明了G.711推荐的丢帧隐藏算法在TMS320C55x上实现的情况。第三章以开环基音分析模块为例描述了语音编解码的相关模块。介绍了G.729的开环基音分析模块及其在5416DSK板上的优化情况。第四章首先介绍了DTX(DiscontinuousTransmission,不连续传输)、VAD、CNG,然后介绍了G.723.1与G.729协议的、,AD/CNG的参数转换的可行性分析及算法研究,VAD/CNG的参数转换在TMS320C55x上的实现情况。东南大学硕士论文第二章分组语音通信的丢帧隐藏技术第二章分组语音通信的丢帧隐藏技术利用分组交换技术同时在网络中传输语音和数据是目前较为活跃的研究领域。在语音IP应用中(voIP),发送端语音信号按固定的时间间隔(通常为lOms)使用一定的编码算法数字化和分帧,然后通过IP网络发送到接受端,进行解码和播放。但IP网络的延迟和堵塞会造成语音帧的丢失。通常情况下,可以用零代替丢帧数据。如果丢帧率超过5%,会严重影响语音质量,就需要一定的丢帧隐藏技术来重建数据。丢帧隐藏技术有两种:一种是基于接受端的;一种是基于发送端和接受端的吲。基于接受端的丢帧隐藏技术有:用舒适噪声或无声信号代替丢失语音帧的数据;重复接受到的最后一组语音信号;采用丢帧前、后正确接受的数据帧信息进行模式匹配;利用丢失的前一帧信号进行基音周期的延拓;或利用前几帧数据进行线性预测以替代丢失的数据。基于发送端和接受端的丢帧隐藏技术明显较上面方法效果好,但同时复杂度也相应地提高。一种做法是发送端在数据流中加入冗余量,如相同的语音帧发送两次,或在发送本帧信号时,外加上一帧信号低码率编码的字符流。也可对语音帧字符流进行前向纠错(FEC,ForwardErrorCorrection)。但这些方法都增加了信号的带宽和编码延迟。不在语音数据中添加冗余量的丢帧隐藏算法,实际上是利用语音信号本身的冗余量。一个典型的方法就是交错发送语音帧,通过对接受帧的插值得到丢失数据。不同的语音编码标准有其相应的丢帧隐藏技术,以减少因丢帧造成的语音质量下降。一些基于码激励线性预测(CELP,CodeExcitedLinearPrediction)的语音编码器都内嵌了丢帧隐藏算法,如G.723.1,G728和G729。而另外一些没有内嵌丢帧隐藏算法的,如采用波形编码技术的G.711,要想改善语音质量就得增加对丢帧的处理。为此,G.711协议附录提供了一种丢帧隐藏算法作为参考,是由ITu—T的第16研究小组提出,在1999年9月通过的一种高质量低复杂度的算法。§2.1ITU推荐的G.711丢帧隐藏算法口儿101首先,介绍一下丢帧隐藏算法的数学基础。语音信号中,短时自相关函数是一个很重要的参数。设Sw0)是一段加窗语音信号,它的非零区间为”=0~(Ⅳ一1)。Sw0)的短时自相关函数R。0)的计算公式‘“1是:东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术∞N-I一1Rw(1)m”∑s。0b。0+f)=2s.(n)s。0+,)(2—1)n=0理论上,短时自相关函数在基音周期的各个整数倍点上有很大的峰值。只要找到第一最大峰值点的位置并计算它与f=0点间隔,就能估算出基音周期。丢帧隐藏算法就是在接收端产生合成语音以弥补丢帧损失的数据。ITU推荐的G.711丢帧隐藏算法采用了基音波形重复的方法。丢失的帧重复上一帧信号一个基音周期的数据,同时采用了“相位匹配”技术保证了原始信号和合成信号之间的平滑过渡,减少了因简单重复数据造成的语音失真。由于语音信号是准平稳的时间序列,尤其对于浊音信号而言,具有一定的准周期性,因此采用丢帧前的语音数据近似丢帧语音数据是合理的。在理想情况下,合成语音与丢失语音具有相同的时域和频域特性,可以保证合成语音是自然的。丢帧隐藏算法的具体做法是:接收到的最新语音数据被保存在基音缓冲区里,用于估计当前语音信号的基音周期,基音周期由(2-1)短时自相关函数计算得到。将最近的一个基音周期和它之前的I/4基音周期数据从基音缓冲区中取出,用于对丢帧数据的补偿。其中前114基音周期数据用于与丢帧前的语音信号进行重叠相加(OLA,OverLapAdd),以保证原始信号和补偿信号间的平滑过渡。补偿数据简单重复取出的基音周期数据,直到全部覆盖了一个信息帧为止,若下一帧数据没有丢失,则再延拓1/4基音周期数据与准确接收的数据进行重叠相加,目的同样是为了保证平滑过渡。重叠相加时可采用三角窗或汉宁窗(实现时多会采用三角窗,因为它比汉宁窗简单些)。若下一帧依然丢失,则多提取一个基音周期的数据用于补偿,最多可提取3个基音周期。信息帧丢失越多,合成语音与实际语音相差就越大。因此,除了第一帧数据外,连续丢失信息帧的数据在补偿时,要有一定的衰减,补偿的信号以每帧20%的速度进行线性衰减,这样若有连续6帧信息丢失,则第6帧补偿信号即为0。、墓篾曩器.0,√L九AkA严^i^,≮弋一/:、。管髻施√V^扎√:L九/◆!A严镰~≯一√:图2.1G.711丢帧隐藏算法图2.1是G.711丢帧隐藏算法演示。图ee;g--行显示有两帧语音数据丢失。输入信号中水平线标识的两段数据用于计算当前语音信号的自相关函数,水平线东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术下的一段曲线即为自相关函数,最大值所表示的延迟为基音周期,输入信号中从垂直线到丢帧数据一段即为一个基音周期的数据。第一个斜线表示一个完整基音周期的前1/4基音周期数据乘以三角窗的上升段,加上丢帧前的最后1/4基音周期数据乘以三角窗的下降段,用以平滑过渡。第二行是一帧数据补偿后的信号。第三行是全部补偿后的信号。第四行是原始语音信号。由图可见,补偿后的信号与原始信号基本保持一致。§2.2其它的丢帧隐藏技术§2.2.1相似波形重叠相加当丢失帧的数据长度增加时,仅仅采用重复一个基音周期数据的方法会导致音质的严重下降。这时,可以采用另一种技术:在实时的条件下调整时域信号波形,同时不改变信号的基音周期以保持原始语音,丢失帧的数据由前几帧语音数据通过时域扩展得到(见图2.2),这种算法称为“相似波形重叠相加”(WSOLA,WaveformSimilaritvOverLapAdd)02】[13】。1黧鬻I鼗麟麟l67)1(’6l【80\\100120i【s】t1鬟阂粼6≮7o10406080100120t【rns】图2.2采用时域扩展的丢帧隐藏技术算法中丢帧数据由前三帧准确接受的数据经过时域调整得到。有关WSOLA算法的详细介绍将在下面说明。首先,解释一下图2.3、图2.4中的符号。k是索引号。t。表示第k个时刻。S。表示第k个时刻用来做重叠相加的帧。X。是吼的起点。三是S。的长度。Y。表示输出的重叠相加波形的起点,是固定的。妙是重叠长度。图2.3详细介绍了WSOLA算法:从接受端解码得到的语音信号不直接送入最后的输出端,保存在输入缓冲区中,取出‘时刻的重叠帧屯,重叠放置在Y。位置上,这样输出端的每一块数据是由两个重叠帧重叠△y长度相加得到,为了保证数据间的平滑过渡,采用汉宁窗Ⅵn]对S。进行加重处理,再与加窗后的上一东南大学硕=E学位论文第二章分组语音通信的丢帧隐藏技术帧S。相加得到最后的输出信号q[n]。等式如下:gM=∑w[n—Y々]-V[n-y女+札】(2—2)k式中w[胛]s0V”g[O,2Ay一1]。输^信号,同xk。1xk蝣1.。眺。瓤.z、。。.。名\IrHJ7一。’,’抓.2yk.1yk图2.3相似波形重叠相加的丢19贞隐藏算法kXk图2.4起始位置Xt的搜索过程每一重叠帧S。的起始位置‰是通过搜索输入缓冲区信号白相关函数的最大值得到,计算白相关函数所使用的两段语音数据见图2.4,其中数据段s’固定,另。一个长度为L的数据段乩的起点在搜索区瓦中变化,自相关函数最大值所对应东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术的位置即为重叠帧S。的起始位置‰。妙、%的长度三和计算自相关函数的数据长度f等参数的选择对保证重建语音信号的音质很重要。一般而言,计算自相关函数的数据长度上应至少包含一个基音周期,以保证准确的合成语音同步,并且£、三满足关系式£≥L12。§2.2.2ANSI推荐的G.711丢帧隐藏算法ANSI(AmericanNationalStandardsInstitute,美国国家标准化组织)的G.711丢帧隐藏算法利用线性预测从前几帧接受信号中估计声道模型和激励信号,以重建丢失的语音数据。这种算法估计丢失语音数据的频谱特征,利用线性预测语音产生模型合成丢失数据。与G.729等标准不同的是,它这种基于线性预测的丢帧隐藏算法只在接受端进行。激励信号通过逆线性预测滤波器得到合成语音。在此标准中,合成语音包含两参数:◆模拟声道模型的线性预测参数;◆包含激励信息的残差信号。这两个丢帧信号的参数的估计是通过对前几帧语音数据进行线性预测分析得到的。图2.5是基于线性预测的丢帧隐藏技术的功能框图。语音缓的语音图2.5基于线性预测的丢帧隐藏技术框图ANSI的丢帧隐藏技术并没有利用丢帧后接收的语音数据实现丢帧信息的重建。因此,在浊音到清音或音素到音素之间的过渡时,这种技术就不能保证语音数据间平滑变化。一项新的研究就利用丢帧后的数据重建丢帧信息。这种算法是对基于线性预测丢帧隐藏技术的改进,采用基于相似波形重叠相加(WSOLA)的时域波形调整技术计算丢失帧的激励信号,其它过程基本保持不变,只是参数设置有所改变,见图2.6。东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术图2.6采用WSOLA后的丢帧隐藏技术框图§2.2.3基于CELP的丢帧隐藏算法的简单介绍G.723.1[14]丢帧数据的重建取决于上一帧的信号类型。如果是浊音,则激励信号为上一G729与G.723相似,重建丢帧数据需要以下信息:(1)合成滤波器参数;(2)自适合成滤波器参数采用上一帧接收数据的滤波器参数,激励信号的类型取决于并且采用上一帧的自适应码本码字,固定码字设为0。而对于非周期信号(清音§2.2.4丢帧隐藏算法的动态在对近期丢帧隐藏算法研究之后,我发现新发表算法的大体框架与上面介绍的类似,只是在局部做了调整和细化。比如:在发送端和接收端都采用基音波形重复㈣;或者在接收端加入较复杂的线性预测‘16】。§2.3G.711推荐的丢帧隐藏算法的DSP实现§2-3.1DSP系统的设计过程[171图2.7所示为一个典型的DSP系统。图中的输入信号可以有各种各样的形式。例如,它可以是麦克风输出的语音信号或是电话线来的已调数据信号,可以是编码后在数字链路上传输或存储在计算机里的摄像机图像信号等。图2.7典型的DSP系统图2.8所示是DSP系统设计的一般过程。东南大学硕士学位论文帧基音周期的周期激励,但有一定的衰减。如果上一帧是清音帧,则激励信号随机产生。如果丢失的数据帧超过3帧,则用静音数据也就是零信号代替。应码本和固定码本增益的衰减;(3)增益预测器的衰减;(4)激励信号的产生。上一帧信号的类型。如果上帧为周期序列(浊音),则本帧激励信号也为周期的,或噪声),本帧激励信号也为非周期的,自适应码字为0,固定码字随机产生。第二章分组语音通信的丢帧隐藏技术图2.8DSP系统的设计流程1.定义系统性能指标在设计DSP系统之前,首先必须根据应用系统的目标确定系统的性能指标、信号处理的要求,通常可用数据流程图、数学运算关系、正式的符号或自然语言来描述。2.根据系统的要求进行高级语言模拟一般来说,为了实现系统的最终目标,需要对输入的信号进行适当的处理,而处理方法的不同会导致不同的系统性能,要得到最佳的系统性能,就必须在这一步确定最佳的处理方法,即数字信号处理的算法,因此这一步也称算法模拟或仿真阶段。例如,语音压缩编码算法就是要在确定的压缩比条件下,获得最佳的合成语音。算法模拟所用的输入数据是实际信号经采集而获得的,通常以计算机文件的形式存储为数据文件。如语音压缩编码算法模拟时所用的语音信号就是实际采集而获得并存储为计算机文件形式的语音数据文件。有些算法模拟时所用的输入数据并不一定要是实际采集的信号数据,只要能够验证算法的可行性,输入假设的数据也是可以的。3.设计实时DSP处理系统实时DSP系统的设计包括硬件设计和软件设计两个方面。硬件设计首先要东南大学硕士学位论文14第二章分组语音通信的丢帧隐藏技术根据系统运算量的大小、对运算精度的要求、系统成本限制以及体积、功耗等要求选择合适的DSP芯片。然后设计DSP芯片的外围电路及其它电路。软件设计和编程主要根据系统要求和所选的DSP芯片编写相应的DSP汇编程序,若系统运算量不大且有高级语言编译器支持,也可用高级语言(如C语言)编程。由于现有的高级语言编译器的效率还比不上手工编写汇编语言的效率,因此在实际应用系统中常常采用高级语言和汇编语言的混合编程方法,即在算法运算量大的地方,用手工编写的方法编写汇编语言,而运算量不大的地方则采用高级语言。采用这种方法,既可缩短软件开发的周期,提高程序的可读性和可移植性,又能满足系统实时运算的要求。4.软硬件调试DSP硬件和软件设计完成后,就需要进行硬件和软件的调试。软件的调试一般借助于DSP开发工具,如软件仿真器、DSP开发系统或硬件仿真器等。调试DSP算法时一般采用实时结果与模拟结果相比较的方法,如果实时程序和模拟程序的输入相同,则两者的输出应该一致。应用系统的其它软件可以根据实际情况进行调试。硬件调试一般采用硬件仿真器进行调试,如果没有相应的硬件仿真器,且硬件系统不是十分复杂,也可以借助于一般的工具进行调试。5.独立系统运行系统的软件和硬件分别调试完成后,就可以将软件脱离开发系统而直接在应用系统上运行。当然,DSP系统的开发,特别是软件开发是一个需要反复进行的过程,虽然通过算法模拟基本上可以知道实时系统的性能,但实际上模拟环境不可能做到与实时系统环境完全一致,而且将模拟算法移植到实时系统时必须考虑算法是否能够实时运行的问题。如果算法运算量太大不能在硬件上实时运行,则必须重新修改或简化算法。§2.3.2算法的定点化【8】1.数的定标在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。这其中的关键就是由程序员来确定数的小数点处于16位中的哪一位。这就是数的定标。通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术的小数了。数的定标有Q表示法和S表示法两种。表2—1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。表2~1Q表示、S表示及数值范围Q表示S表示十进制数表示范围Q15S0.15一l≤X≤0.9999695Q14S1.14—2≤X≤1.9999390Q13S2.13—4≤X≤3.9998779Q12S3.12—8≤X≤7.9997559Q11S4.11—16≤X≤15.9995117Q10S5.10—32≤X≤31.9990234Q9S6.9—64≤X≤63.9980469Q8S7.8—128≤X≤127.9960938Q7S8.7—256≤X≤255.9921875Q6S9.6—512≤X≤511.9804375Q5S10.5—1024≤X≤1023.96875Q4S11.4—2048≤X≤2047.9375Q3S12.3—4096≤X≤4095.875Q2S13.2—8192≤X≤8191.75Q1S14.1—16384≤X≤163835QOS15.0—32768≤X≤32767从表2—1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如:16进制数2000H=8192,用qo表示16进制数2000H=O.25,用q15表示但对于DSP芯片来说,处理方法是完全相同的。从表2—1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,QO的数值范围是一32768至U+32767,其精度为1,而Q15的数值范围为一1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。浮点数与定点数的转换关系可表示为:浮点数(x)转换为定点数(x。):~=(int)x*20(2--3)定点数(%)转换为浮点数(x):x=(float)xq+2一。(2—4)例如,浮点数x=O.5,定标Q=15,则定点数~=∞.5×32768J=16384东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术式中lJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384×2。15=16384/32768=0.5。2.高级语言:从浮点到定点在编写DSP模拟算法时,为了方便,一般都是采用高级语言(如C语言)来编写模拟程序。程序中所用的变量一般既有整型数,又有浮点数。如果要将这样的程序用某种定点DSP芯片来实现,一般需将高级语言浮点算法改写为高级语言定点算法,然后用DSP编译器支持的高级语言或DSP汇编语言实现。下面讨论基本算术运算的定点实现方法。将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标值一样。若两者不一样,则在做加法/减法运算前先进行小数点的调整。为保证运算精度,需使Q值小的数调整为与另一个数的Q值一样大。此外,在做加法/减法运算时,必须注意结果可能会超过16位表示。如果加法/减法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度。加法/减法:设x的Q值为Qx,Y的Q值为Qy,且Qx>Qy,加法/减法结果Z的定标值为Qz,则z2x+yjzq·2一Q;=xq·2一Q1+yq2一‘y=x。2一以+yH.2(_o,-ffy)-2一B=[x。+y口.2(-of吗’].2-0j当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保证运算精度时,则必须保持32位结果。如果程序中是按照16位数进行运算的,则超过16位实际上就是出现了溢出。如果不采取适当的措施,则数据溢出会导致运算精度的严重恶化。一般的定点DSP芯片都设有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值(上溢为7FFFH,下溢为8001H),从而达到防止溢出引起精度严重恶化的目的。乘法:假设x的定标值为Qx,Y的定标值为Qy,乘积z的定标值为Qz,则z=xyj。q.2一乱=。q-Yg-2一(B+q)等Zq=(XqyⅡ)2B一(B+吼’(2—6)东南大学硕士学位论文17第二章分组语音通信的丢帧隐藏技术除法:假设被除数x的定标值为Qx,除数Y的定标值为Qy,商z的定标值为Qz,则z2x/yjzq.2-O:=等j:。:型兰兰:竺(2--7)如2—1_3.程序变量的Q值确定在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。确定变量的动态范围有两种方法:一种是理论分析法,另一种是统计分析法。(1)理论分析法有些变量的动态范围通过理论分析就可以确定。例如:三角函数等等。(2)统计分析法对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地考虑到各种情况。例如,在语音信号分析中,统计分析时就必须采集足够多的语音信号样值,并且在所采集的语音样值中,应尽可能地包含各种情况,如音量的大小、声音的种类(男声、女声)等。只有这样,统计出来的结果才能具有典型性。当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取得比统计值稍大些,使用DSP芯片提供的溢出保护功能等。4.DSP定点算术运算定点DSP芯片的数值表示是基于2的补码表示形式。每个16位数用1个符号位、i个整数位和15-i个小数位来表示。因此二进制数00000010.10100000表示的值为21十2’1+2~=2.625,这个数可用Q8格式(8个小数位)来表示,它表示的数值范围为一128—-127.996,一个08定点数的小数精度为1/256=0.004。虽然特殊情况(如动态范围和精度要求)必须使用混合表示法,但是,更通常的是全部以Q15格式表示的小数或以QO格式表示的整数来工作。这一点对于主要是乘法和累加的信号处理算法特别现实,小数乘以小数得小数,整数乘以东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术整数得整数。当然,乘积累加时可能会出现溢出现象,在这种情况下,程序员应当了解数学里面的物理过程以注意可能的溢出情况。因为DSP定点除法是所有基本运算里最为复杂的,下面着重讨论。其余基本运算较为简单,这里就省略了。在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现。二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位。下面先来说明除法的实现过程。设累加器为8位,且除法运算为10除以3。除的过程就是除数逐步移位并与被除数比较的过程,在每一步进行减法运算,如果能减则将位插入商中。则被除数、除数表示为16进制就是:o叭%011)(1)除数的最低有效位对齐被除数的最高有效位。00001010二QQQ!!QQQ11110010(2)由于减法结果为负,放弃减法结果,将被除数左移一位再减。00010100二QQQ!!QQQ11111000(3)结果仍为负,放弃减法结果,被除数左移一位再减。00101000二QQQ!!QQQ00010000(4)结果为正,将减法结果左移一位后加l,作最后一次减。0010000l二QQQllQQQ00001001(5)结果为正,将结果左移一位加1得最后结果。高4位代表余数,低4位表示商。0001001l即商为(0011)16=(3)lo,余数为(0001)16=(1)10。TMS320系列DSP芯片没有专门的除法指令,但使用条件减指令SUBC可以有效灵活她完成除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。这里每一种考虑都可影响SUBC指令的使用。下面给出分子小于分母情况下的TMS320C55x除法子程序。东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术111VS:AADD舟一1.SP预留暂存单元BCCdivsREtTO—#0如果除数为零,就不用再算了MOVTO,HI(AC0)准备作除法MOVT1,+SP(#00H)RPT#14和下一句一起构成除法SUBC+SP(#00H),AC0MOVACO,TO把结果放在TO里divsRETAADD#1.SPRET这个程序中,分子在TO中,分母在T1中,商存在运算结束的T0单元中,*SP(#00H)为暂存单元。5.非线性运算的定点快速实现在数值运算中,除基本的加减乘除运算外,还有其它许多非线性运算,如对数运算、开方运算、指数运算、三角函数运算等,实现这些非线性运算的方法一般有:(1)调用DSP编译系统的库函数:(2)查表法;(3)混合法。(1)调用DSP编译系统的库函数TMs320c2x/C5x的c编译器提供了比较丰富的运行支持库函数。在这些库函数中,包含了诸如对数、开方、三角函数、指数等常用的非线性函数。在c程序中(也可在汇编程序中)只要采用与库函数相同的变量定义,就可以直接调用。(2)查表法在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。采用这种方法必须根据自变量的范围和精度要求制作一张表格。查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。查表法比较适合于非线性函数是周期函数或己知非线性函数输入值范围这两种情况。(3)混合法◆提高查表法的精度上述方法查表所得结果的精度随表的大小而变化,表越大,则精度越高,但存储量也越大。当系统的存储量有限而精度要求也较高时,查表法就不太适合。这时采用查表结合少量运算的混合法就好多了。混合法是定点化中较常用的一种方法。它是在查表的基础上采用计算的方法以提高当输入值处于表格两点之间时的精度。提高精度的一个简便方法是采用折东南大学硕士学位论文20第二章分组语音通信的丢帧隐藏技术线近似法。混合法适用于在输入变量的范围内函数呈单调变化的情形。后面还将结合具体应用来举例。◆扩大自变量范围对于像对数这样的非线性函数,输入值和函数值的变化范围都很大。因此,适当变换数的表示形式,有助于提高计算的精度。设z是一个大于0.5的数,则x可以表示为下列形式:X=m-2。式中,0.5≤m≤1.0,P为整数。则求x的对数可以表示为:l092@)=l092(聊‘28)=l092(州)+log2(2。)=e+l092(州)也就是说,求X的对数实际上只要求m的对数就可以了,而由于m的数值在0.5~1.0之间,用查表等方法是完全可以实现的。例如:log2(10000)2log2(O.61035×2“)2log2(O.61035)+14=13.2877可见,如果一个数可以用比较简便的方法表示为上面的形式,则求任意大小数的对数都是比较方便的。§2.3.3DSP芯片的选择设计DSP应用系统,选择DSP芯片是非常重要的一个环节。只有选定了DSP芯片,才能进一步设计其外围电路及系统的其它电路。总的来说,不同的DSP系列对应着不同用途。DSP芯片的选择应根据实际的应用系统需要而确定。但是,每个DSP系列里都有很多款芯片,其价格相差甚大。具体选择哪一款,还是值得研究一下的。一般来说,选择DSP芯片时应考虑到如下诸多因素。1.DSP芯片的运算速度运算速度是DSP芯片的一个最重要的性能指标,也是选择DSP芯片时所需要考虑的一个主要因素。DSP芯片的运算速度可以用以下几种性能指标来衡量:(1)指令周期:即执行一条指令所需的时间,通常以ns(纳秒)为单位。如TMS320LC549.80在主频为80MHz时的指令周期为12.5ns;(2)MAC时间:即一次乘法加上一次加法的时间。大部分DSP芯片可在一个指令周期内完成一次乘法和加法操作,如TMS320LC549。80的MAC时间就是12.5ns;(3)FFT执行时间:即运行一个N点FFT程序所需的时间。由于FFT涉及的运算在数字信号处理中很有代表性,因此FFT运算时间常作为衡量DSP芯片运算能力的一个指标;(4)MIPS:即每秒执行百万条指令。如TMS320LC549.80的处理能力为80MIPS,即每秒可执行八千万条指令;东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术(5)MOPS:即每秒执行百万次操作。如TMS320C40的运算能力为275MOPS:(6)MFLOPS..即每秒执行百万次浮点操作。如TMS320C31在主频为40MHz时的处理能力为40MFLOPS:(7)BOPS:即每秒执行十亿次操作。如TMS320C80的处理能力为22.DSP芯片的价格BOPS。DSP芯片的价格也是选择DSP芯片所需考虑的一个重要因素。如果采用价格昂贵的DSP芯片,即使性能再高,其应用范围肯定会受到一定的限制,尤其是民用产品。因此根据实际系统的应用情况,需确定一个价格适中的DSP芯片。当然,由于DSP芯片发展迅速,DSP芯片的价格往往下降较快,因此在开发阶段选用某种价格稍贵的DSP芯片,等到系统开发完毕,其价格可能已经下降一半甚至更多。3.DSP芯片的硬件资源不同的DSP芯片所提供的硬件资源是不相同的,如片内RAM、ROM的数量,外部可扩展的程序和数据空间,总线接口,I/O接VI等。即使是同一系列的DSP芯片(如TI的TMS320C54X系列),系列中不同DSP芯片也具有不同的内部硬件资源,可以适应不同的需要。4.DSP芯片的运算精度一般的定点DSP芯片的字长为16位,如TMS320系列。但有的公司的定点芯片为24位,如Motorola公司的MC56001等。浮点芯片的字长一般为32位,累加器为40位。5.DSP芯片的开发工具在DSP系统的开发过程中,开发工具是必不可少的。如果没有开发工具的支持,要想开发一个复杂的DSP系统几乎是不可能的。如果有功能强大的开发工具的支持,如C语言支持,则开发的时间就会大大缩短。所以,在选择DSP芯片的同时必须注意其开发工具的支持情况,包括软件和硬件的开发工具。6.DSP芯片的功耗在某些DSP应用场合,功耗也是一个需要特别注意的问题。如便携式的DSP设备、手持设备、野外应用的DSP设备等都对功耗有特殊的要求。目前,3.3V供电的低功耗高速DSP芯片已大量使用。7.其它除了上述因素外,选择DSP芯片还应考虑到封装的形式、质量标准、供货情况、生命周期等。有的DSP芯片可能有DIP、PGA、PLCC、PQFP等多种封装形式。有些DSP系统可能最终要求的是工业级或军用级标准,在选择时就需要注意到所选的芯片是否有工业级或军用级的同类产品。如果所设计的DSP系东南大学硕士学位论文统不仅仅是~个实验系统,而是需要批量生产并可能有几年甚至十几年的生命周期,那么需要考虑所选的DSP芯片供货情况如何,是否也有同样甚至更长的生命周期等。在上述诸多因素中,一般而言,定点DSP芯片的价格较便宜,功耗较低,但运算精度稍低。而浮点DSP芯片的优点是运算精度高,且C语言编程调试方便,但价格稍贵,功耗也较大。例如TI的TMS320C2xx/C54x系列属于定点DSP芯片,低功耗和低成本是其主要的特点。而1MS320C3x/C4x/c67x属于浮点DSP芯片,运算精度高,用c语言编程方便,开发周期短,但同时其价格和功耗也相对较高。DSP应用系统的运算量是确定选用处理能力为多大的DSP芯片的基础。运算量d,N可以选用处理能力不是很强的DSP芯片,从而可以降低系统成本。相反,运算量大的DSP系统则必须选用处理能力强的DSP芯片,如果DSP芯片的处理能力达不到系统要求,则必须用多个DSP芯片并行处理。那么如何确定DSP系统的运算量以选择DSP芯片呢?下面我们来考虑两种情况。1.按样点处理所谓按样点处理就是DSP算法对每一个输入样点循环一次。数字滤波就是这种情况。在数字滤波器中,通常需要对每一个输入样点计算一次。例如,一个采用LMS算法的256抽头的白适应FIR滤波器,假定每个抽头的计算需要3个MAC周期,则256抽头计算需要256×3=768个MAC周期。如果采样频率为8kHz,即样点之间的间隔为125-ts,DSP芯片的MAC周期为200ns,则768个MAC周期需要153.6ps的时间,显然无法实时处理,需要选用速度更高的DSP芯片。表2—2示出了两种信号带宽对三种DSP芯片的处理要求,三种DSP芯片的MAC周期分别为200ns、50ns和25ns。从表中可以看出,对话带的应用,后两种DSP芯片可以实时实现,对声频应用,只有第三种DSP芯片能够实时处理。当然,在这个例子中,没有考虑其它的运算量。表2—2用DSP芯片实现数字滤波256抽头LMS每样点允许每样点允许应用采样率采样周每样点允许MAC指令数MAC指令数领域滤波运算量MAC指令数(kHz)期(ps)(MAC数)(200ns)(50ns)(25ns)话音812576862525005000声频44.122.77681134539072.按帧处理有些数字信号处理算法不是每个输入样点循环一次,而是每隔一定的时问问隔(通常为帧)循环一次。例如,中低速语音编码算法通常以lOms或20ms为一帧,每隔10res或20ms语音编码算法循环一次。所以,选择DSP芯片时应该东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术比较一帧内DSP芯片的处理能力和DSP算法的运算量。假设DSP芯片的指令周期为P(ns),一帧的时间为△T(ns),则该DSP芯片在一帧内所能提供的最大运算量为△诉条指令。例如TMS320LC549—80的指令周期为12.5ns,设帧长为20ms,则一帧内TMS320LC549.80所能提供的最大运算量为160万条指令。因此,只要语音编码算法的运算量不超过160万条指令,就可以在TMS320LC549.80上实时运行。§2.3.4CCS集成开发环境【18】1191可编程DSP芯片的开发需要一整套的软、硬件开发工具。通常,DSP芯片的开发工具可以分为代码生成工具和代码调试工具两大类。代码生成工具的作用是将用c语言、汇编语言或两者的混合语言编写的DSP程序编译、汇编并链接成为可执行的DSP程序,代码生成工具主要包括:C编译器、汇编器和链接器等。此外,还有一些辅助工具程序,如文件格式转换程序、库生成和文档管理程序等。代码调试工具的作用则是对DSP程序及系统进行调试,使之能够达到设计目标。TMS320系列DSP芯片的系统集成和调试工具主要有:c/汇编语言源码调试器、初学者工具DSK(DSPStarterKit)、软件仿真器(Simulator)、评价模块EVM(EvaluationModule)、软件开发系统SWDS(SoftWareDevelopingSystem)和仿真器XDS(eXtendedDevelopingSystem)等。后面还将对这些工具做具体介绍。CodeComposerStudio集成开发环境1999年,TI推出了CodeComposerStudio(简称ccs)集成开发环境。CCS的出现是DSP开发软件的一次革命性的变化。CCS把所有的代码生成工具和代码调试工具整合在一起,配合强大的分析调试功能,以一个友好的人机界面为开发人员服务。CCS的功能包括:◆集成可视化代码编辑界面。可直接编写C、汇编、.h文件、.cmd文件等。◆集成代码生成工具,包括汇编器、优化C编译器、连接器等等。◆基本调试工具,如装入执行代码(,out文件),查看寄存器、存储器、反汇编、变量窗121等,支持C源代码级调试。◆支持多DSP调试。◆断点工具,包括硬件断点、数据空间读/写断点,条件断点(使用GEL编写表达式)等等。◆探针工具(probepoints),可用于算法仿真,数据监视等。◆分析工具(profilepoints),可用于评估代码执行的时钟数。东南大学硕士学位论文24第二章分组语音通信的丢帧隐藏技术◆数据的图形显示工具,可绘制时域/频域波形、眼图、星座图、图像等,并可自动刷新(使用Animate命令运行)。◆开放式的plug—ins技术,支持其他第三方的ActiveX插件,支持包括软仿真在内的各种仿真器(只需安装相应的驱动程序)。◆另外,CCS还提供DSP/BIOS工具、GEL工具,并且支持RTDX技术。最后三项工具在DSP编程里相当实用,下面作简要介绍。BIoSDSP/BIOS是CCS提供的一套工具,它本身仅占用极少的CPU资源。理程序、管理硬件中断、调度软件中断、周期函数和idle函数。使用DSP/BIOS编写代码后,CCS可以提供多种分析和评估代码工具,如图形化显示各个线程占用的CPU时间、代码执行时间统计、显示输出信息等。这时,可以方便直观地了解代码各个部分的开销情况。事实上,CCS中的DSP/BIOS工具已经具有实时操作系统(RTOS)的很多功能,如任务的调度管理、任务间的同步和通讯、内存管理、实时时钟管理、中断服务管理等等。RTDXRTDX(Real—TimeDataeXchange,实时数据交换)提供一个实时和连续的可视环境,使开发者能看到DSP应用程序工作的真实过程。RTDX允许系统开发者在不停止运行目标应用程序的情况下在计算机和DSP芯片之间传输数据,同时还可在主机上利用对象链接嵌入(OLE,ObjectLinkingandEmbedding)技术分析和观察数据。这样可以提供给开发者一个真实的系统工作过程,从而缩短开发时间。RTDX可以在DSP/BIOS中使用,也可以脱离DSP/BIOS使用。值得注意的是,目前CCSSimulator不支持RTDX,也就是说RTDX必须在Emulator(硬仿真器)上使用,这就要求有硬件仿真器和DSP目标板。GELGEL(GeneralExtentionLanguage)语言是一种类似于c语言的解释性语言,可用于创建GEL函数以扩展CCS的用途。在实际使用中,只需按照GEL语法创建GEL函数并将其加载到CCS中即可。使用GEL语言可以访问实际的甚至是仿真的目标DSP存储器,还可以为GEL菜单增加新的功能选项,特别是用于定制用户工作区和自动测试时非常有效。有关CCS的更多资料可以参考安装CCS时附带的帮助文档或者TI提供的相关手册(可在幽盟巫:£Q坐下载到)。CCS的帮助还是比较强大的。东南大学硕士学位论文DSP/BIOS提供底层的应用函数接口,可用于支持系统实时分析、使用线程来管第二章分组语音通信的丢帧隐藏技术作为集成开发环境,CCS既支持不接DSP目标板的Simulator,其仅用计算机模拟DSP运算;也支持接DSP目标板的Emulator。这时CCS就要根据不同的硬件型号选择相应类型的软件配置。在CCS中,可以采用下面几种调试器中任意一种或几种对DSP程序进行分析,以保证程序的正确性,提高程序的效率。(1)软件仿真器(Simulator)软仿真器是一个软件程序,使用主机的处理器和存储器来仿真TMS320DSP的微处理器和微计算机模式,从而进行软件开发和非实时的程序验证。在PC机使用这种便宜的软仿真器,就可以在没有目标硬件的情况下做DSP软件的开C编译器所产生的目标代(2)扩展开发系统(XDS)硬件仿真器TMS320扩展开发系统(XDS,eXtendedDevelopmentSystem)是功能强大的全扫描式仿真(Scan-BasedEmulator)是一种独特的、非插入式的系统仿真、提供对内部的寄存器和状态的访问,可完整地观察和控制DSP的运行状况。(3)DSK系列评估工具DSP入门套件(DSK)及评估模块(EVM)是TI或TI的第三方(ThirdParty)为TMS320DSP的使用者设计和生产的~种评估平台。TMS320VC5402DSK是一套性价比很高的DSP入门套件。该DSK包括:一块IOOMHz的TMS320VC5402DSP;64K字(16位),1个等待周期的外部SRAM:256K字FLASH存储器:自带JTAG控制器,用并口与PC机相连;DAA电话线接口;话筒/扬声器音频接口;RS一232异步数据接口:外部扩展予板接口;5VDC电源。为了配合硬件,该DSK中还包括一套DSK版的CCS。§2.3.5丢帧隐藏算法在TMS320C55x上的实现由于在整个系统中丢帧隐藏算法只是一个小单元。从整体功耗的考虑,我选末南大学硕士学位论文上,典型的软仿真速度是每秒几百条指令。发和调试。它使用由TMS320宏汇编器/连接器或ANSI码。由I/O指令的口地址所指定的输入和输出文件来仿真与处理器相连接的I/O器件。可以按用户定义的时间问隔,周期性地设置中断标志,仿真中断信号。在程序执行之前做初始化,设置断点及跟踪模式。程序执行一旦终止,就可以对内部寄存器、程序和数据存储器做检查和修改。也可以显示跟踪寄存器。这个仿真的记录可以做成一个文件,下次再作仿真的时候,运行该文件就可以恢复同样的机器状态。速仿真器,用于系统级的集成与调试。集成调试方法。使用这种方法,程序可以从片内或片外的目标存储器实时执行,在任何时钟速度下都不会引入额外的等待状态。TMS320系列DSP处理器,可以通过片内由单一串口访问的移位寄存器扫描通道,实现扫描式仿真。该扫描通道TMS320硬仿真器可以用来调试C程序、汇编,或两者的混合程序。第二章分组语音通信的丢帧隐藏技术择用TMS320C55x芯片来实现算法。首先,我要在C55x的Simulator上调试算法。1.丢帧隐藏算法的定点化在0,711推荐的丢帧隐藏算法中,由于基音周期估计采用了归一化的互相关函数,即信号的相关值要除以信号能量的开方,因此需要计算1,√瓦。我采用了直接查表加线性插值的方法计算1/√i。注意到能量值E>1,所以0<1/√i<1,为小数,在定点化处理时,我采用16位的短整型数表示,定标为Q15,也就是保留l/√E小数结果的高15位。由于E∈[250,2”一1],不可能为在此范围内所有的数列一张1/√百的表格。因此我们对能量值进行归一化,然后采用直接查表的方法,同时为了增加结果的精度,查表的结果再进行线性插值。归一化处理:E左移一定位(位数用exp表示),保证移位后的数x次高位非0,若移位数为偶数,则E再右移l位,同时将x看作一定标为Q31的小数,3I—exp也就是x+2”=E+2“9,E=x+2,并且可以保证3l—exp为偶数。由于移位时对移位结果的要求和移位数的要求,这样若将x看作一小数,则xe[o.25,1】。E:x+231-e”√E=√x+231-exp(2—8)1—1十1一(31-exp)/2瓶一6‘31一exp为偶数,则31一exp可以被2整除。由以上可知1/√E实际上可以通过1/√x结果的右移(31一exp)/2位得到。由于x的范围不大,因此我们可以为[o.25,1]范围内的数列一张1/√j的表格。z是定标为Q3l的小数,范围在[o.25,1]z间,等价为[(Ox)20000000*2_31,(0x)7FFFFFFF*2_31],取x的高7位作为表格的索引,也就是x的高31--25位,这样x的索引为[OxlO,Ox3F],等价为[16,63],表格的范围即为[16/64,63/64]。为了提高精度,查表的结果再进行线性插值。假设x的二进制表示为0011100§11001011§t…t,其中§是将各位隔开的分隔符,t…t表示最后17位,任意取值。设x1的高7位索引值=z的高7位,其余为0,即xl=0011100§O…0,取x2=0011t01§O…0,这样xl<x<x2,如图2.9所示。东南大学硕士学位论文第--章分组语音通信的丢帧隐藏技术』!!12二丛!型:』!苎!!二』盟x1一x2xl—Xf(x1)一厂(x)=(厂(x1)一,(x2))+—!;!_=二妥(2—9)m)训m)+(,(砣)_,(订)+主焉我们取x—xl的次高8位作为最终结果,这样x2一xl恒等于256x—xl也就是x的b24--b17位的数,在这里为1100101I。xlx删图2.9求解结果的插值运算求解得的f(x)再右移(31-n)/2位,即可得到1/√E的结果。值得注意的是,此时得到的是结果的整型表示,定标为Q15。以下是c模拟程序。A求解I/√E的运算}/shortL_sqrt(10ngvar){shortexp:/}移位数exp*/shortindexi,index2/}索引值{/shortresult:longtmp:序变量的归一化处理,同时保证(31一移位数)为偶数¥/exp=norml(&var):exp=(31一exp)>>1:肛结果的移位数=(31一exp)/2*//%取出最高的7位数,作为查表的索引,b31--b25}/indexl=(short)(var>>25):胁取出b24--b17,作为线性插值的参数{/index2=(short)((var&OxOlF800001)>>17)东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术胁由于查表的索引为[16,63],但表格数组的索引是从O一48的,减去偏移量。丰/indexl=indexl一16:/术线性插值:—:=二兰+(,(x2)一,(x1))¥/XZ—XItmp=(tmp*index2)>>8:/半厂(x)=厂(x1)+.!;i二兰三(厂(x2)一厂(x1))木/XZ—Xltmp=tabsqr[indexl]+tmp:姐旷肛结果右移十/n叫恤nⅪ曲..0pn抛mp叫,豁坤∞血E)2.程序调试为便于编程和调试,我们先用c语言定点化原来的浮点程序并仿真、边修改边测试其效果,觉得满意了再写汇编程序、调试它,拿汇编程序产生的结果与C程序的结果进行对比,不同,再修改调试,直到相同为止。过程见下图。输出1图2.10定点化程序调试图3.用TMS320C55x汇编语言实现丢帧隐藏算法t20]【21】【221TexasInstruments的TMS320C55x是一款功耗低、处理能力强的定点DSP芯片系列。它能与TMs320c54x指令兼容,但是指令效率更高。它的特点包括:先进的电源管理,减少功耗;可配置的IDLE域提供较大的断电灵活性:指令高速缓存减少外存访问和功耗;R叹MAC体系增加并行性和周期效率;外存接口提高性能东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术和系统灵活性;可变指令长度增加代码密度;附加总线和扩充地址增加流量等。C55x时钟高达400MHz,性能最高可达至U800MIPS。不同的DSP芯片有时会提供一些特别的功能、特殊的指令以简化在其上执行的程序。手工汇编程序在DSP上实现时,要注意充分利用这些功能,达到优化的目的。TMS320C55x支持两种并行指令。一种是指令本身就已经指明的称为隐含并行指令,其指令格式以::分隔。另一种是用户自行配置的并行指令,其指令格式以||分隔。用户可按照手册上提供的并行原则组织自己的程序。TMS320C55x支持循环寻址,即支持循环使用某段存储区。只要在程序里设好循环存储区标志位、循环存储区的起始地址及循环存储区长度,DSP寻址时会自动从存储区的尾兜到头。具体用法是把数据区页地址送给AR0寄存器,循环存储区起始地址相对于页的偏移送给BSA01寄存器,存储区长度送给BK03寄存器,相对于循环存储区起始地址的偏移送给ARl寄存器,所以一次寻址由(ARO:循环存储区起始页地址)+(BSAOI:循环存储区起始地址页偏移)+(ARl:循环存储区起始地址的偏移)完成。TMS320C55x还支持ARx寄存器和临时寄存器TX联合寻址,即每次地址指针变化可以是一个16位有符号常数,放在临时寄存器Tx里。例如:丢帧隐藏程序里基音周期的粗略搜索需要每次地址指针变化2个单位,如果把2放入临时寄存器T0中,每次寻址时ARx年FITO联合使用,就可以在一条指令里既完成寻址又完成调整ARx指针的任务。而通常,这项操作需要两条指令才能完成。另外,像归一化操作,由于C55#E编语言里有指令支持,所以在c语言里归一化是一个函数,在汇编里只需要EXPiJN上移位指令即可完成。这时,若再把它做成一个函数,反而增加堆栈的负担。4.程序优化ITU推荐的G.711丢帧隐藏算法一帧数据有80个采样点,采样率为8kHz,因此帧数据时长为10ms。下面是在TMS320C55x上实现其定点算法占用资源的情况。表2—3丢帧隐藏算法占用资源的情况使用项目占用资源备注程序区960words主控程序、PLC等~共所占用的单元数数据区1124words基音缓冲区、全局变量、堆栈等耗费的MIPS3.07MIPS补偿一帧数据需要30672cycle(指令周期),台3.07M!PS在编程时,程序的可读性、运算精度、存储空间的利用等都是需要综合考虑的因素。而在DSP程序里,除去以上诸项,耗费的MIPS是~个关键的指标。它决定着将来系统方案采用哪科t型号的DSP。不同型号的DSP价格相差较大。如果选择失误会影响将来产品的成本,减少产品在市场上的竞争力。因此,优化东南大学硕士学位论文30第二章分组语音强信的丢帧臆藏技术程序以减少耗费的MIPS是一项十分重要的工作。在尽量不影响程序可读性的情况下,适当地牺牲程序空间或数据空间换取耗费较少的MIPS是必要的。这是一种程序优化的思想。经过对程序的深入分析、针对具体语句优化,我发现以一些程序空间和数据空间来换取效率,效果显著。具体分析如下:程序的计算量主要集中在搜索基音周期的函数里。搜索基音周期牵涉到多重循环。如果能优化循环里的指令会大大提高程序的效率。优化主要包括两个方面:(1)搜索基音周期函数中反复调用的两个小函数,采用汇编宏函数(.macro)的形式,虽然增加了程序代码量,但是节约了call、ret这种语句。Call和ret都是多指令周期指令,所以节约这些语句对最后结果影响还是较大的。(2)搜索基音周期的函数要计算相关值,由于考虑到有可能溢出,所以先对数据适当右移,再进行循环乘加操作。改进做法是,在函数的开头开辟了一段临时变量区域,先把要用到的数据右移并放在里面,以后循环计算时只是在这个区域里进行乘加,不再有其它操作。于是,循环由原来的三、四条指令变为现在的一条指令,这样再经过几重循环,就能节约相当多指令了。另外,对于所有语句,只要对运算结果没有影响,能并行的尽量使其并行。有时,为了能使并行语句不冲突,只好调换语句顺序;为了不影响程序的可读性,可以通过多加注释来弥补。现在,丢帧隐藏算法只需花O,97MIPS。下表是改进后的丢帧隐藏算法占用资源的情况。表2—4改进后的丢帧隐藏算法占用资源的情况使用项目占用资源备注程序区1074words主控程序、PLC等一共所占用的单元数数据区1380words基音缓冲区、全局变量、堆栈等耗费的MIPS0.97MIPS补偿一帧数据需要9694cycle,合0.97MIPS5.G.711附录一的进一步研究G.711附录一的最后有下列表格(findpitch和overlapadd函数是整个算法里最耗资源的):表2—5G.711附录一算法的MIPS评估RoutineMACCompareDivSqrtfindpitch()3764864444overlapadd()12101OTotal3885864544表后附有compare花费2个指令周期,divide、sqrt花费10个指令周期。最后花费3885+8642+(45+44)+10=4947指令周期。一帧10ms,则整个丢东南大学硕士学位论文第二章分组语音通信的丢帧隐藏技术帧隐藏算法需耗O.5MIPS。上面的指标是一种建议性的。实际情况千差万别。由于程序定点化采用的方法不同,我着手优化的定点程序开方部分花费较多。经过仔细分析,我认为现在的0.97MIPS已经相当少了。在目前情况下,再优化的可能性很小。在丢帧率是10%和20%的情况下,采用现有的PLC算法听觉效果要大大好于没有PLC的情况。东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现第三章语音编解码的相关模块及其DSP实现§3.1引言嘲如前所述,语音编码主要可分为两种:波形编码和参数编码。波形编码原理较为简单。参数编码根据对声音形成机理的分析,在以重建语音信号具有足够的可懂性的原则上,通过建立语音信号的产生模型,提取代表语音信号特征的参数来编码,而不一定在波形上与原始信号匹配。在频域上这一模型就对应为具有一定零极点分布的数字滤波器,编码器需要发送的就是滤波器参数和一些相关的特征值。由于语音是短时平稳的,即短时间内可以认为声音模型的特征是近似于不变的,所以模型特征参数更新的频度较低,这就有效地降低了编码比特率。参数编码的优点是编码速率低,可以低到2.4kbps甚至以下。其主要问题是合成语音质量差,特别是自然度较低;另外对说话环境的噪声较敏感,需要较安静的环境才能给出较高的可懂度。共振峰声码器和线性预测声码器都是典型的参数声码器。目前,应用较为广泛的是线性预测声码器。参数编码标准中目前较常用的有Q723.1(5.3/6.3kbps)、Q729(8kbps)。如表1—1所述,(3.723.1在5.3kbps时采用MP.MLQ(MultiPulse—MaximumExcitedLinearLikelihoodQuantization,多脉冲一最大似然量化),6.3kbps时采用ACELP(AlgebraicCodePrediction,代数码激励线性预测);Q729采用CS—ACELP。在参数编码中,参数是如何提取,又如何编码进行传输的昵?下面就以Q729的开环基音分析模块为例来具体说明语音的参数编码。§3.2开环基音分析模块㈣从参考文献【51可知,在Q729编解码模块里,开环基音分析模块复杂度较高,因此选取开环基音分析模块为例来说明参数编码过程。图3.1显示了基音分析模块在Q729编码器中所处的位置及与其它模块之间的关系。G.729每I帧语音10ms,一帧又可分两子帧,每子帧5ms。感知加权模块输出子帧的加权语音信号sw(n),sw(n)由下式计算得出,用于寻求语音帧中基音延迟的估算值:1010sw0)=J0)+∑q,扣0一f)一∑qyisw0一i)"=o,…,39(3—1)i=1『_1式中s(n)为语音信号,y。与y:确定了感知加权滤波器w(z)的频率响应,ai东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现是没有量化的LP滤波器系数。厂LL————的流图3.1G729编码器原理为了减小搜寻最佳自适应码本延迟的复杂度,搜寻范围限制在从开环基音分析中所获得的候选延迟丁岛的邻近值。每帧(10ms)进行一次开环基音分析,它使用式(3-1)的加权语音信号sw(n),具体过程为:第一步,在下三个范围内:净1:80,…,143净2:40,…,79卢3:20,…,39寻求相关系数:月以)=芝swobw0一t)(3—2)n=0的三个最大值。并通过下式归一化所得到的最大值R0。),i=1,…,3:东南大学硕士学位论文——肌肛揣㈦,…,,笙三里堡童塑坚坚箜塑薹堡些墨基211壅塑cs吲其中最佳值乙的选取倾向于优先选择低范围的延迟值,可通过对较长延迟对应的归一化相关值进行加权来实现上述优先选择。最佳开环延迟乙按如下步骤确定:乙=^R’阢)=R’“)矿月’O,)≥0.85R’阢)F‰)=F0:)乙=f2/f尺’O,)≥0.85R’k)R1k)=R’以)乙=t3使用将延迟倍数范围分成三部分并支持较小值的上述过程可避免选择基音倍数。经过开环基音分析模块,参数将以子帧为单位,再求闭环基音参数,然后对基音延迟进行编码,再输出。§3.3开环基音分析模块的DSP实现开环基音分析模块在DSP上实现的流程见图3.2。下面的章节将对优化方法、优化结果分别加以阐述。首先,我来介绍一下开环基音分析模块的DSP实现环境。我选择在TMS320VC54l6DSPStarterKit(DSK板)上实现开环基音分析模块。开发软件使用DSK自带的CCS套件。选择5416DSK板作为实验平台主要基于以下考虑:5416DSK板上的C5416DSP芯片有160MIPS的处理能力,相当强大。并且在DSK上的DSP芯片上实现要比在Simulator上实现快很多。因为,在Simulator上,PC模拟DSP的运算,远比DSP效率低。而开环基音分析算法较为复杂,如果东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现在Simulator运行,则花费较长时间,调试效率低下。开环基音分析模块的理论研究l选择DSP实现环境』『寻找开环基音分析模块I拘DSP优化方法,制定优化方案l着手优化开环基音模块l调试程序|.]正确测试模块的优化效果,对比优化前后的系统开销图3.2开环基音分析模块的DSP实现流程TMS320VC5416DSPStarterKit板是用来评估TMS320VC5416DSP芯片的性能的㈤,其主要特点如下:◆TMS320VC5416DSP芯片,具有高达160MHz的主频◆USBJTAG接口控制器◆64K板上RAM◆256K板上FlashROM◆3个扩展接口:存储器接口、外设接口和主机接口◆板上带有IEEE1149.1JTAG接口◆PCM3002立体声音频编解码器使用5416DSK板,可以用USB线与电脑主机相连,通过DSK所带的CCS软件东南犬学硕士学位论文第三章语音编解码的相关模块及其DSP实现将程序代码载入DSK板上的程序存储器并运行,运行时可以通过相应的软件工具观察DSK板的状态。§3.3.1开环基音分析模块的优化方法G.729提供定点化了的C代码。通过5416DSK自带的CCS测算,开环基音分析模块要花费53.25MIPS。很明显,它没有充分利用DSP的资源,效率很低。因此,程序需要优化。优化分两种:一种是基于算法的,就是采用更为简单的算法;另一种是基于程序本身的。本文只考虑基于程序本身的优化。DSP的汇编语言是专为DSP设计的,它可以充分发挥DSP的硬件效能。并且,54系列的C编译器效率是相对较低的。因此,要想做到程序的完全优化,就必须将程序全部汇编,但是也带来较大的工作量。目前,我采用以函数为基本单位模块化的优化方法,即逐个找出系统开销最大的那些函数模块,对它作汇编优化。我使用CCS的Profiler来分析程序各主要模块所耗费的指令周期数,分析每次执行该模块所耗费的指令周期数和该模块在一帧语音的处理过程中被调用了多少次,两者相乘得到在处理一帧数据的过程中这个模块总共耗费的指令周期数。根据这个统计数据,按从大到小的顺序,逐模块地进行汇编优化。经过Profiler分析找到待优化的目标函数后,对该函数代码段进行手工汇编。对这段汇编代码的要求有两点:一是为程序的其它部分提供正确的接口,也就是说要能正确的获取输入和输出,完成被替代的C程序所作的工作,同时又不影响程序其它部分的执行——这是优化的基本要求;二是能充分发挥DSP硬件运算性能,减小系统开销——这是优化的目的所在。由于优化牵涉到c和汇编语言的混合编程问题,下面将对C语言和汇编语言的混合编程方法作一介绍。1.C语言和汇编语言的混合编程方法【”】用c语言和汇编语言混合编程方法主要有以下三种:f1)独立编写c程序和汇编程序,分开编译或汇编,形成各自的目标代码模块,然后用链接器将c模块和汇编模块链接起来。(2)对C语言进行编译,生成相应的汇编程序,然后对汇编程序进行手工优化和修改。(3)直接在C语言程序的相应位置嵌入汇编语句。我主要采用了第一种编程方法。第一种方法会出现C模块与汇编模块相互访问的情况,下面对其规则加以介绍。2.独立的c和汇编模块接口在编写独立的汇编模块的过程中,最重要的是必须遵守TMS320C54x定点C东南大学硕士学位论文37第三章语音编解码的相关模块及其DSP实现编译器所定义的函数调用规则和寄存器使用规则。遵循了这两个规则就可以保证所编写的汇编模块不破坏C的运行环境。C模块和汇编模块可以相互访问各自定义的函数或变量。在编写独立的汇编程序时,必须注意以下几点:(1)不论使用C编写还是用汇编编写的函数,都必须遵循寄存器使用规则。(2)必须要保护函数要用到的几个特定寄存器。这些特定寄存器包括:AR0(FP),ARI(SP),AR6,ART。其中,如果SP正常使用,则不必明确加以保护。其它寄存器则可以正常使用。(3)中断程序必须保护所有用到的寄存器。(4)当在汇编语言中调用C函数时,以逆序方式将参数压入堆栈,第一个参数被放入累加器中。(5)调用C函数时,C函数只保护几个特定的寄存器,而对于其它寄存器,c函数是自由使用的。(6)长整型和浮点数在存储器中存放的顺序是低位字放在低地址,高位字放在高地址。(7)如果函数有返回值,则返回值存放在累加器A中。(8)汇编模块不能改变由C模块产生的.cinit块,如果改变其内容则会引起不可预测的结果。(9)编译器在所有的标识符(函数名,变量名等)前要加一个下划线“”。因此,编写汇编语言程序时,必须在C程序可以访问的所有对象前加“”。对于仅用于汇编语言模块中的标识符,应不得用下划线…开头。(10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。同样,如果在C程序中定义的对象或函数需要在汇编程序中访问或调用,在汇编程序中也必须用.global指令定义。对上面的第二点,在实际调试过程中,我发现只要调用函数没有用到的寄存器,子程序不保护也是可以的。保险做法是按照上面的规则保护寄存器。定点c编译器规定了一组严格的函数调用规则。除了特殊的运算支持函数之外,任何调用C函数或被C函数调用的函数都必须遵循这些规则,否则,就会破坏C环境,造成不可预测的后果。(1)参数传递将参数传递给一个C函数时,必须遵循以下规则:1)参数调用前将参数压入运行堆栈。2)以逆序传递参数。右边的函数先压栈,左边的后压栈。其中第一个参数放入累加器A中进行传递。3)如参数是长整型,则低位字节先压栈,高位字节后压栈。4)对于TMS320C54x,若参数中有结构形式,则调用函数给结构分配空间,东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现其地址通过累加器A传递给被调用函数。(2)被调用函数的执行流程被调用的函数必须执行以下任务:1)如果被调用的函数修改了寄存器(如ARl、AR6和AR7),则必须将它们压栈进行保护。2)被调用的函数需要分配内存用于建立局部变量和参数区。这是通过将sP减去一个常数来实现的,常数按以下方法来计算:常数=局部变量长度+参数区中调用其它函数的长度3)被调用函数执行程序。4)如果函数返回一个值。被调用函数将其放入累加器A中。如果函数返回的是结构,则被调用函数将其复制到累加器A指向的内存块中。5)被调用函数sP加上第二步确定的常数来恢复帧和参数区。6)被调用函数恢复所有保存的寄存器。7)被调用函数返回。结合上述规则请见图3.3对函数调用模型的解析。DSP的栈是向上增长的。当调用者准备调用一个函数时,它首先要将待传递的参数压栈存储:将第一个参数放入累加器A,其余参数从当前的栈顶起,逆次放入栈空间中。随即调用开始,堆栈向上增长,增长的部分用于存储函数返回的地址。以后控制权交给被调用者,被调用者首先在栈中为自己分配一段堆栈空间,这个空间包含两个部分,一部分是存放局部变量的空间,另一部分是向它的子函数传递参数的空间。而在一个被调用函数执行完毕时,它将返回值(如果有的话),放在累加器A中,随后收回为自己分配的空间,再从栈顶弹出返回地址,根据这个地址返回调用者,继续程序的执行。下面举一个例子来说明:函数Mpz3216的功能是计算一个32位数乘以一个16位数,把结果放在累加器里返回。因为DSP汇编语言里没有32位直接乘16位的指令,因此需要用函数分步实现之。该函数C语言代码如下:Word32Mpy_32—16(Wordl6hi,Wordl6lo,Wordl6n)//32位数用2个16位分别表示<Word32L_32;L32=Lmult(hi,n)://先计算高位相乘的结果L322L_mac(L32,mult(10,12),1);//再把低位相乘和高位相乘的结果相加return(L32);东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现,现在用汇编语言实现该函数:.global——Mpy_32——16_Mpy_32_16:SSBXFRCT;置小数乘法位,Q15+Q15=Q31SSBXSXM:置符号扩展位LD+(8h),T;把A的内容移到T里为乘法作准备MPY2h.A:(hi+n)—>A的高16位LDlh,TMPY2h.B:(10十n)—>B的高16位SFTAB.#.16:B右移16位,为加做准备ADDB,撑1,ARSBXSXM;清除符号扩展位RSBXFRCT;清除小数乘法位RET:结果放在A里返回另外,如果使用到了程序扩展区,在调用予函数时,子函数入口地址将由一个word变成两个words,要存放XPC及Pc。这样,混合编译时,得注意nearcall和nearret变成了farcall和farret。并且,访问随堆栈传递的参数也与near时略有不同。低低爨·一SP局部帧返回地址·一SP返回地址参数2参数2..参数n圆累加器A参数n圈累加器^向勰霆局勰霆图3.3DSP的函数调用模型东南大学硕士学位论文苎三里堕重塑塑堡堕塑茎堡堡墨墨里婴壅墨3.使用CCS内部函数优化从参考文献【24]得知,可以利用CCS的c/c++编译器的内部函数(Intrinsics)对程序进行优化‘241。具体的内部函数见表3—1。内部函数的使用和C语言中一般函数的使用方法相同,可以像任何正常函数那样调用程序中的C变量。按规定内部函数前面带有下划线。表3—1C54xC/C++编译器的内部函数(Intrinsics)内部函数名对应的汇编指令int—sadd(intsrcl,intsrc2)ADDlong—lsadd(10ngsrcl,longsrc2)ADDint—ssub(intsrcl,intsrc2)SUBlong—lssub(10ngsrcl,longsrc2)DSUBint—smpy(intsrcl,intsrc2)MPYAlong—lsmpy(intsrcI,intsr02)MPYlong—smac(10ngsrc,intopl,intop2)MAClong—smas(10ngsrc,intopl,intop2)MASint—abs(intsrc)ABSint—abss(intsrc)ABSlong—labs(10ngSFC)ABSlong—labss(10ngsrc)ABSint—sneg(intSrC)NEGlong—lsneg(10ngsrc)NEGInt—smpyr(intsrcl,intsrc2)MPYRint—smacr(10ngsrc,intopl,intop2)MACARJnt—smasr(10ngsrc,intopl,intop2)MASARint—norm(intsrc)EXPint—lnorm(10ngsrc)EXPint—rnd(10ngsrc)RNDorADDInt—sshl(intsrcl,intsrc2)SFlnlong一1sshl(10ngsrcl,intsrc2)SFTAint—addc(intsrcl.intsrc2)ADDCint—subc(10ngsrcl,intsrc2)SUBB下面就以mult0为例,说明一下使用内部函数优化的效果。函数的声明替换在头文件中如下实现:东南大学硕士学位论文墨三里堡童塑塑塑塑塑羞堡堡丝基旦翌!塑L——————————一IIWordl6mult(Wordl6varl,Wordl6var2)_}}definemult—smpy原来的基础运算集中,mult0函数的定义如下:Wordl6mult(Wordl5varl。Wordl6Var2)FR心E一5{wordl6vatout:NOPWord32L—produit;STLA,OhLDroduit=(Word32)varl}(Word32)vat2:LD6h.TNoPMPYOh,ADSTA,2hLproduit=(L_produit&(Word32)Oxffff8000L)>>15SSBXSXMLDA,0,BLD8000h,0,AANDB,0,ASFTAA,8,ASFTAA,一8,ASFTAA.一15,ADSTA,2hif(Lproduit&(Word32)OxOOOlOOOOL)LOA,0,BLD#1h,16,AANDB,0,ASFTAA。8,ASFTAA,一8,ABCL4.AEQL_produit=L_produitI(Word32)Oxffff0000LLD#Offffh,16,AORB,0,ADSTA,2hvarout=sature(L_produit)L4:DLD2h.ACALLsaturereturn(var_out):)FRA^lE5实现的是两个16位数的乘积,然后左移15位,进行16位饱和处孚后,。苎到一个16位的积,并且mult(一32768,一32768)=32767。上面的程序中,左边东南大学硕士学位论文42第三章语音编解码的相关模块及其DSP实现是C语言的描述,仅第一条语句是进行乘法运算,后面的则是进行移位操作,符号位的扩展以及饱和处理。观察右边对应的CCS编译出来的汇编语言,先开辟l临时变量空间,通过堆栈取得参数,然后一步一步进行运算,最后返回结果等等。测试中,执行这条指令,花费了82个指令。而使用内部函数后,虽然看起来也是函数的调用,但是通过显示编译后的汇编程序,就有很大区别了。RSBX0VMSSBXSXMSSBXFRCTLD2h,16,ASSBXOVMNUHMPYA1hSTHB,5h执行这条指令,只要8个指令。事实上,通过设置状态寄存器中的SXM位,可以在移位时自动进行符号位扩展。设置OVM位,可以实现溢出时饱和处理。设置FRCT位,可以使得在进行乘法后自动左移一位。这在小数乘法中是必需的,用于消除冗余的符号位。最后,对乘法结果用STH指令取高16位结果,就得到了正确的乘积。另外,使用内部函数也无需函数调用时所需的参数压栈、开辟临时变量、保存中间结果和调用返回的操作,进一步的减少了指令的数量。但是,并不是所有的基础函数都能用相应的内部函数代替,凡是涉及到长移位的时候,就有可能产生错误。这样的函数有L_shl0,L-shr()和Lshrr0。具体的原因也是在分析了编译后的程序才发现的。在编译后实际执行时,移动的位数是放在累加器移位寄存器ASM中的,而ASM只有5位长度,格式为2的补码,这意味着其数值范围是从一16到15。而长移位的操作数是32位的数,移动的位数显然会超出ASM的范围。假如,需要移动16位,二进制值为10000B,但是对于ASM寄存器来说,这个数表示的是一16,这样就会产生错误。基础运算集中,有一些函数是没有对应的内部函数的。优化这些函数,就需要手工汇编改写。4.使用手工汇编优化TMS320C54x的优化方法可以分为两类,一类是C语言的通用优化,另一类是DSP芯片的特定优化。对于通用优化,优化的范围主要有:(1)简化表达式:(2)数据流优化;(3)删除公共子表达式和冗余分配;(4)优化跳转;(5)简化控制流;(6)优化与循环有关的变量;(7)将循环体内计算值不变的表达式移东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现至循环体前;(8)运行支持库函数的行内扩展;等等。对于DSP芯片的特定优化,优化范围主要有:(1)高效地使用寄存器;(2)自动增量寄存器寻址方式;(3)使用块重复;(4)使用并行指令;(5)使用延迟跳转;等等。在实际应用中,大量采用混合编程的方法编写DSP应用程序。如果采用C优化编译的方法,那么转换后的汇编可读性差,会对汇编部分的编程带来很大的麻烦。因此我们往往不采用C优化编译,而采用手工优化编译汇编的方法。当使用手工对汇编进行优化时,需要注意以上的优化思想。其中,最重要的就是采用循环优化、圆周循环寻址、并行指令和乘累加等。事实证明,采用这些优化方法可以大大提高程序的运行效率。手工汇编程序时需遵循前面所述的规则。§3.3.2开环基音分析模块的优化结果表3-2给出了经过汇编优化的函数模块优化前后耗费指令周期数的对比。分析优化的结果可以看出,模块中循环的规模越大,进行饱和处理、小数乘法左移等基本操作的次数越频繁,优化的效果就越明显。表3-2手工汇编函数效果统计函数名C程序开销汇编程序开销优化比例divs1478lg1.29%99131313%LExtract328154.57%L_comp14953.36%Mpy一32607132.56%klpy_32—16276124.35%Div323845691.79%Random57981.38%Acorr5285794332O.82%Lagwln108321931.78%Levinson15948651083.20%Lsp_pre—sel67036118647278%Pred1t327362271842.63%Lsp_二selectl12503637192.97%Lsp—select212509037933.03%Synfii6984214282.04%CarhX13547533772.49%根据第二章的方法,比较定点C代码和混合代码的输入输出,如果没有差异,可以认为混合代码“基本”正确。只有在测试了所有有代表性的输入参数之后,才可以认为混合代码完全无误。最后,开环基音分析模块的优化结果如表3-3所示。由于还不是全优化,程东南大学硕士学位论文第三章语音编解码的相关模块及其DSP实现序空间和数据空间肯定不是最优的。这里就不再列出了。表3-3优化前后系统开销对比l编码优化前耗费的指令周期优化后耗费的指令周期53.25MIPSl程序3.40MIPS东南大学硕士学位论文第四章G,723.1与G729协议问的VAD/CNG的参数转换第四章G。723.1与G。729协议间的VAD/CNG的参数转换§4.1参数转换的可行性分析及算法研究n7¨2印瞳63§4.1.1不连续传输(DTX)在移动通信、卫星通信等应用场合,通常采用不连续传输(DTX,DiscontinuousTransmission)的工作模式。DTX工作模式是指当语音存在时,以正常的速率进行传输:而在无话时,不传输任何信息或以较低的速率传输背景噪声的信息。在DTX的工作模式中,可能出现的问题是语音切断,这是由于语音活动侦测(VAD)算法将语音误判为噪声的结果。出现这种情况时,就会造成语音质量的降低。语音活动侦测器的设计目标就是尽量降低语音切断的概率,同时也要减少将噪声误判为语音。语音切断会降低整个系统的通信质量,而较高的语音活动率会增加功率输出,降低信道利用率。所以DTX必须要有可靠准确的VAD判决。图4.1,(a)、4.1。(b)分别为DTX发送端和接收端的示意图。图4.1.(a)DTX发送端简图————_一语音和sID帧替换DTX控堕童些壁,l语音志码器I制器SID信息.I—————一舒适噪声产生图4.1.(b)DTX接收端简图东南大学硕士论文第四章G.723.I与G729协议问的VAD/CNG的参数转换典型的发送端包括语音编码器、VAD判决和由VAD输出控制的通道开关。当检测到输入信号是语音时,VAD激活编码器:检测到输入信号是无话时,VAD切断编码器。为了在接收端产生与输入端相仿的舒适噪声(CN),发送端一般要将背景噪声的信息传送到接收端,通常可每隔N帧传送一次背景噪声信息。在接收端,当VAD标志显示当前帧为语音时,解码器正常合成产生语音;如果当前帧为无话时,则有两种情况:如果发送端没有传送本帧背景噪声,则采用业已存在的背景噪声信息产生舒适噪声;而如果发送端传送本帧背景噪声的信息,则接收端原来的噪声参数被新的噪声参数所替代,并产生舒适噪声。图4.1一(b)中,帧标志用于指示本帧数据是否可用,如果本帧数据由于信道误码造成不可恢复,则接收端可采取用上帧数据替代、参数平滑或输出静音等方法予以处理;SID(SilenceInsertionDescriptor,静音插入描述帧)为静音指示。需要指出的是,在有些通信场合,发送端不传送背景噪声信息,此时接收端可根据需要产生合适的舒适噪声。§4.1.2语音活动侦测语音活动侦测是一种检测输入信号是否为语音的技术。这项技术在很多方面具有用途,如语音编码、语音识别、回波抵消、噪声抵消、语音合成等。目前,VAD主要应用在语音通信应用领域,如可变速率语音编码、不连续传输和数字语音插空等。据统计,在典型的电话交谈中,有话区间所占的时间比例大约为40%。无话区间(包括静默区间和背景环境噪声)所占的时间比例大约为60%。由于背景噪声本身携带的信息较少,因此在语音数字通信中,没有必要对背景噪声进行与语音相同速率的编码。提高通信系统效率的一种直接方法就是采用语音活动侦测技术。采用语音活动侦测对系统输入信号进行分析,如果输入信号检测为语音,则系统对输入信号进行全速率编码,并将编码数据发送到信道传输;如果输入信号检测为无话,则系统对输入信号不编码或采用很少比特编码,只发送表示无话的标志数据或发送少量代表背景噪声信息的数据。在输出端,可以根据发送端发送出来的背景噪声信息产生舒适噪声,如没有噪声信息,也可直接产生舒适噪声。采用VAD不仅能够提高通信效率,而且还可以降低手持设备的平均功率,在移动通信、微波、卫星和散射等通信方式中节省带宽。可见,语音活动侦测技术在语音通信应用中具有重要作用。语音活动侦测技术已经在多种语音编码标准中得到应用,如GSM移动通信系统、ITu—T标准G.729B、第三代通信系统等。下面介绍语音活动侦测的基本原理。基于帧的语音活动侦测的原理如图4.2所示。东南大学硕士论文第四章G723.1每G.729枷议阐的VADICNG的参数转换嘲4.2VAD的原理框图输入信号经过预处理爱豹臻号犊一方疆送魏特薤疆墩模块提取特惩参数,始娥孵能量、过零率、LPC参数等。弱~方掰送爨门限计算模块,诗算参数判决fj酝(一黢德猛下,门隈惫平嚣鑫逡疲调整),嚣螽经过VAD中润翔决霞,霉经避VAD瓣裁决终正,最嚣爨决褥蠢巍弩l袋麓有话透是无话。一簸清凝下,绸滋接施深用拖犀延迟保护方案,即有落剡决峻聪懿N顿无话仍然判决为蠢活,以避纨低能螫的清音峻判为噪声帧,遮爨N一般可取3~lO。语音活动侦测是DTX最熏骤的组成部分。一般情况下,VAD算法潦予以下假设:1.语音是短时平稳信号,=擞一段时间(例如20~30ms)后频谱就会变化;2.在相当长的时间内,背撩嗓声频谱怒平稳的,并随着时问缓慢地变化;3。诱音信号电平通常高于背景噪声媳平。在上鞭静霰设}圭况下,VAD冀法检测无话区润,并同对嚣分有话和无话精凝下豹骛爨噪声。在营最礤声魄乎缀低豹遴癌系绫中,~个篱摹豹绩号魏爨}l羧羧可以鼹寒捡测无诿区阗。毽囊在一个黉焱碟声魄乎较褰,并羹不叛变纯熬邋整系统中,遴遂一个篱单翡髓量门隈国数怒不可能区分蒂噪语音秘背景曝声匏。浚然鸷景噪声的电平不断缝改变,因此}1隈斑该能爨适庭调整,敦便对羧入痿号送行准确的分类。…般情况下,门限仅当程凭话区间时才能更新。语音活幼侦测可邋过检测信号的频谱特{正进彳亍,也可分析输入信号是频谱不断变化的语潦还照典肖相对稳态频谱响应的噪声来梭测。此外,借助诸如语音的短时能量、撼音、过搭率、倒谱系数等其它特征参数也有助于有话、无话的判断。拖尾延迟保护(Hangover)语音活动使测能提离通傣系统的有效瞧,毽怒也存在着VAD将裔话罐涮为恶话戮及将无落误粪为骞话豹滂瑷。第一静媾况造蔽语蜜韬凝,瓣惩语蠢憨震璧;翁=耱渗醚会辫酝VAD豹效率。为了减少露话翔为无话嚣导致语音切繇麴獗率,VAD算法一般采霜一个拖尾廷遐绦护税潮。疆遴延迟保护视剿静一般暇瑷怒:滏本顿判为无话时,荠不立蘩将本犊设鬣为无话,两是掇据拖尾延迟僚妒麴长度来设置。如果是在保护长度之内,则仍然将本帧设置为有话,即仍以全谯率传输。聚用拖尾延迟保护机制后,不仅可大大降低有话错判为无话的概率,而且可以避免将字与字之间的短暂间隙也判为无话,从而提高语音的自然度。求离大学碳士论文第四章G.7231与G729协议问的VAD/CNG的参数转换§4.1.3舒适噪声产生(CNG)在实际应用中,当VAD不断地切换发送端时,接收端的背景噪声将呈现跳跃性地变化。这样当发送端为开时,一起传送语音和背景噪声信号:当语音传送完毕,发送端为关时,噪声电平将会降得很低。噪声电平的起伏变化给人的感觉是非常不舒服的,在噪声电平较高的情况下,会降低语音可懂度。解决这个问题的方法是:当发送端为关时,为了准确地在接收端恢复背景噪声,发送端应该周期性地发送平均背景信息到接收端。这种噪声通常称为舒适噪声。舒适噪声产生的一般过程:1.编码端提取用于舒适噪声产生所需的参数,如发送端背景噪声的LP参数(LSF参数,LineSpectralFrequencies)和频谱信息。发送端检测到无话区间时,隔N帧传送这些信息。2.解码端分析接受到的发送端的码字,当接收到SID帧参数(携带舒适噪声信息)时,接收端产生舒适噪声。以上介绍了VAD/CNG的原理,下面将对0.723.1与Q729协议间的VAD/CNG参数转换的可行性进行分析。§4.1.4G.723.1与G.729协议的VAD/CNG参数转换可行性分析第一章已经解释了SmartTranscoding技术,即参数层面的转码技术。图4.3给出了从0.723.1到0.729码流转换的示意图。我需要实现的仅是G.723.1与0.729码流之间的VAD/CNG的参数转换。(3,723.1附录A(下面简化为G723.1A)和0.729附录B(下面简化为0.729B)有关于各自协议的VAD/CNG的具体描述。从描述中可知,VAD模块只输出有话、无话判决,CNG模块根据VAD输出决定是否需要产生SID帧。实际信道上传输的码流是语音编码帧、SID帧和无话帧标志。这里不讨论语音编码帧的参数转换问题。接受到的G.723.1码流SmartG729码流G.729解Transcoding码模块图4.3单向SmartTranscoding示意图由协议可知,无话帧标志仅仅是一个标志位,没有包含任何参数。假设在同样的环境下,两个协议都产生无话帧标志,则它们之间可以对应,其转换是很简单的。考虑到G.723.1以30ms为一帧,0.729以10ms为一帧,在边界上的转换就要仔细分析了。东南大学硕士论文49第四章G723.1与G729协议问的VAD/CNG的参数转换1.无话帧标志的转换从G.723.1的无话帧标志转换为G.729的无话帧标志较为简单,仅简单地将1帧的标志分成3帧的标志就可以了。反向的话,如果连续三帧中有一帧是语音帧,则由语音编码模块处理;如果连续三帧非语音帧中有一帧是SID帧的话,则将其归为SID帧的交换;如果连续三帧都是无话帧标志,则将其转为G.723.1的无话帧标志。图4.4给出了无话帧标志转换的示意图。G.723.IG.72930ms10ms10mslOms无话帧标志无话无话无话帧标志帧标志帧标志图4.4无话帧标志转换示意图2.SID帧的转换根据G.723.1A将当前帧判为SID帧的情况是:如果当前帧是静音区域的第一个非语音帧,则将其判为SID帧。除此,如果当前滤波器和前一个SID帧的区别很大,或者如果当前的激励信号能量和前一个SID帧能量相差很大,则该帧根据Q729B将当前帧判为SID帧的情况是:若当前帧为静音区域的第~个比较,若当前滤波器与先前的SID滤波器有显著的不同,或当前激励的能量与先由此可以看出,在连续三帧G729非语音帧中,只可能有一帧是SID帧。这以转换为一帧G.729的SID帧加上两帧无话帧标志,见图4.5。G.723.1G.72930ms10ms10mslOresSIDl陨SID帧无话无话帧标志帧标志图4.5无话帧标志转换示意图下面通过分析G723.1及G729协议的SID帧的比特组成情况来研究两个协东南大学硕:b论文50被判为SID帧。非语音帧,则将其判定为SID帧。对其它的帧,算法将先前的SID帧与当前帧前SID能量有显著差异,并且从上个发送的SID帧到本帧已经有2帧间隔了,则其为SID帧。样简化了SID帧转换需要考虑的情况。在连续三I帧G729非语音帧中,如果有一帧是SID帧,则将其转换为G723.1的SID帧。反之,一帧G.723.1的SID帧可议间的SID帧是否能转换、该如何转换。表4—1、4—2分别列出了Q723.1及Q729协议的SID帧比特流分配情况。第四章G7231与G729协议间的VAD/CNG的参数转换表4—1G.723.1协议SID帧比特流分配传送字节PARx_By,...1LSPB5...LSP_BO,VADFLAG_B0,RATEFLAG_B02LSP—B13...LSP_B63LSP_B21...LSP_B144GAIN_B5…GAIN_B0,LSP_B23,LSPB22表4—2G.729协议SID帧比特流分配参数描述比特数LSF量化器中交换预测器的序号lLSF量化器的第1阶段矢量5LSF量化器的第2阶段矢量4增益(能量)5由表可见,如果能为(3.723.1与G.729的LSP参数和增益参数找到一种对应关系,则SID帧就可以自由转换了。(1)LSP参数首先,将LSF和LSP的概念区分一下。LSF表示线性频谱频域;LSP是线性频谱对,它是LSF域上的参数。G.729B将SID.LPC(LinearPredictionCoder)滤波器变换到LSF域进行量化。LSF采用两阶段交换预测矢量量化,分别量化为4位和5位。G.723.1A对LSP系数的处理与此完全不同。因此,不可能建立直接的对应关系。实际的转码中,用了图4.6所示的方法,即先对G.729进行解码,解出LSP系数,再用G723.1的编码程序对解出的LSP系数进行编码。G.7图4.6SIDI帧LSP参数转换不恿幽(2)增益参数G723.1A的SID增益量化器是一个准对数量化器。增益的取值范围为【O,352]。量化器将[O,352]分成了3段,段索引为isg=0~2,各段长度为Ⅳ【f嘲216,16,32,相应的分辨率为2,4和8。设待量化的SID增益Gisg啪,j20toⅣ[isg]。1,Gisg[0】为段拈苫的起始值,即o、32或96。关系如下:东南大学硕士论文塑婴皇垒:!量垒垫堡塑塑∑螋鱼塑垒塑堑垫Gisg【,]_G垤【0]+J×2(咿1)(4—1)计算出段索引isg及段内索引‘,后,待传输的增益量化索引为:Glnd,=16×isg+,(4—2)使用下式解码:Q~(G1.d,)=Gt,g[0]+(Glnd,一kGlnd,/16j。)×2酬(4—3)这里Il,表示小于等于x的最大整数。G.729B的SID增益量化器在对数域采用5位非均匀量化,变化范围为.12dB到66dB。在16dB到66dB范围内采用2dB步长;在一4dB到16dB内采用4dB步长:.4dB到.12dB采用8dB步长。由上可见,它们增益量化方法不同。两者之间不是简单的一一对应关系。但是,可以在其增益参数之间建立一个转换表格,则增益参数的转换就变得简单多了。表4—3是根据解码的增益在其取值范围的位置对应关系建立的。表4—3左边是G.723.1到G.729SID帧增益参数的转换,相反的转换见表右边。表4—3G.723.1与G.729协议的SID帧增益参数转换表Q723.1G729G729G723.1SID帧增益参数SID帧增益参数SID帧增益参数SID帧增益参数0x00x00x00x00x10x80x10x00x20xB0x20x00x30xD0x30x00x40xE0x40x00x50xF0x50x00x60x100x60x10x70x110x70x10x80x1l0x80x10x90x120x90x10xA0x120xA0x20xB0x130xB0x20xC0x130xC0x30xD0x130xD0x30xE0x140xE0x40xF0x140xF0x50x100x140x100x60xll0x150xll0x70x120x150x120xA0x130x160x130xC0x140x160x140xF东南大学硕士论文第四章(3.723l与G.729悱议问的VAD/CNG的参数转换0X150x160x150X1l0x160x170x160x140x170X170x170xt70x180X170x180X1B0X190X180x190X200x1A0x180xlA0X230xIB0x180x1B0x270x1C0x180x1C0x2D0x1D0x180xlD0x330x1E0x190x1E0x390xlF0x190x1F0x3F0x200x190x210x190x220x1A0x230x1A0x240x1A0x250x1B0x260x1B0x270x1BOx280x1B0x290x1B0x2A0x1C0x2B0x1C0x2C0x1C0x2D0x1C0x2E0x1C0x2F0x1C0x300x1D0x3l0x1D0x320x1D0x330xID0x340x1D0x350x1DOx360xIE0x370xlE0x380x1E0x390x1E0x3A0x1E0x3B0xlE0x3C0x1F0x3D0x1F0x3E0xlF0x3F0x1F东南大学硕士论文53第四章G.7231与G729协议间的VAD/CNG的参数转换§4.2VAD/CNG参数转换在C55x上的实现考虑到系统的要求,TMS320C55x芯片被用来实现算法。实现过程是:首先,将部分C语言程序汇编化,然后,在C55x的Simulator上调试。通过CCS工具找出参数转换程序中消耗指令数较多的模块,将其进行手工汇编。具体汇编时,C程序和汇编程序的参数传递问题需要小心应付。第三章已经列出了C54的参数传递规则。与C54相比,C55拥有更多的可用寄存器,其传递规则稍有不同。我利用CCS212具的C、汇编的混合显示窗,对C55的参数传递规则进行研究。现总结规则如下:如果输入的数是16位的,则通过Tx传递。最左边参数是TO,然后是T1,依次类推。如果输入的数是3±位的,则通过ACx传递。最左边参数是AC0,然后是ACl,依次类推。如果输入的是指针,则通过ARx传递。最左边是AR0,依次类推。ARx寄存器里的值表示地址指针。返回结果如果是16位的,值就放在T0里;如果是32位的,值就放在AC0里。下面列的四种情况把所有可能出现的状态都包含在内了。情况1.Wordl6add(Wordl6varl,Wordl6var2)varl一>TO,var2一>T1return0->T0情况2.Word32L—mac(Word32L_var3,Wordl6varl,Wordl6var2)L_var3一>AC0,varl一>TO,var2一>T1return0->AC0情况3.Word32L—add(Word32L_varl,Word32L_var2)Lvarl->AC0,L_var2一>AClreturn0->AC0情况4.voidL092__norm(Word32L_x,Wordl6exp,Wordl6+exponent,Wordl6+fraction)L_x->AC0,exp一>TO,exponent一>AR0,fraction·>ARl应用上述规则,将经过手工汇编的程序和C程序整合、调试,在相同的输入下,发现其输出结果与全C程序的一样,证明程序没有错误。根据表4.3写的G.729到G.723.1增益转换的汇编子函数如下。东南大学硕士论文第四章(3.7231与(3.729协议问的VAD/CNG的参数转换一gain729t0723:;G.729的增益即表偏移放在TO里输入AMOV撑gain729t0723,XARl;把增益表的基地址放在XARl寄存器里ADDTO.ARl+ARl,TO;表基地址加上输入偏移值;把表对应的G.723.1的增益读出,放在To里MOVRET;返回最后,图4.7给出了VAD/CNG参数转换及其DSP实现的流程。VAD/CNG理论研究rG.723.1EG.729协议间的VAD/CNG参数转换的可行性分析,如可行,给出转换方案选择DSP实现环境I研究参数转换的DsP优一七方法.制定优化方案【对VAD/CNG参数转换方案做DSP优化|太斗调试程序k厂如正确’’、.、.........................................._/图4.7G.723.1与G.729协议问VAD/CNG参数转换及其DSP实现流程东南大学硕士论文55结束语结束语本文是围绕着现代语音编解码中的相关技术及其DSP实现展开的。本文的第二章介绍了多种当今流行的丢帧隐藏技术,然后就G.71l推荐的丢帧隐藏算法如何定点化,在TMS320C55x上如何实现和优化做了详细介绍,最后还就能否进一步优化做了讨论。本文的第三章介绍了G729的开环基音分析模块及其在5416DSK板上的实现情况,最后给出了优化结果。本文的第四章介绍了G.723.1与G.729协议间的VAD/CNG技术,分析了它们参数转换的可行性,给出了转换方案,最后介绍其在C55x上的实现情况。由于以上技术在DSP上的实现牵涉到DSP芯片的选择等内容,本文也做了相应的介绍。纵观全文,由于个人水平和精力的限制,还有不少工作有待改进。现总结如下:1)G.729的开环基音分析模块在DSP上实现时只是做了部分优化,假如做全汇编优化,优化效果一定比目前要好。但是,这部分工作也需要花费相当的一段时间。2)G.723.1与G.729协议问的VAD/CNG参数转换只是协议码流转换的一个环节。单独对其测试,评判其转换效果比较困难,因此,第四章没有给出其详细测试方案及测试结果。东南大学硕士学位论文——一.一一至重苎墼【1】NGN与PSTN互通没商量,htp://21.参考文献10.6,178/forum/203—/04/forum03—044.htm[21ITU_TRecommendationG.711PulseCodeModulation(PCM)ofVoiceFrequencies,1972[3]李婴,周琳,吴镇扬丢帧隐藏算法及其DsP实现.第十七届南京地区研究生通信年会论文集,2002.12[4】ITU_TRecommendationG729CodingofSpeechat8kbit/susingConjugate.StructureAlgebraic-Code-ExcitedLinear-Prediction(cs.ACELP),Mar1996[51杜涛,AMR语音编码器与G729语音编码器之间的参数直接转换,硕士学位论文,2003[6】6赵力,语音信号处理,机械工业出版社,2003.3[7】Rudkin·S,Grace.A,Whybray.M.WReal-TimeApplicationsontheIntemet,BTjournal,V01.15,No.2,Apr1997[81张雄伟,陈亮,徐光辉DSP芯片的原理与开发应用(第三版),电子工业出版社,2003.2[9]9EjazMahfuz,PacketLossConcealmentforVoiceTransmissionoverIPNetworks,http://www.tsp.ece,mcRill.ca/Theses/2001/MahfozT2001.pdf[10】1TU_TRecommendationG.711一AppendixI,Ahighqualitylow-complexityalgorithmforlossconcealmentwithG.711,Sep1999B.Girod,ANewTechniqueforAudioPacketLossGlobaITelecom.Con£andExhibition(London,uK),pp.48.52,Nov1996B.Girod,ANewErrorConcealmentTechniqueforAudiowithPacketLoss,EuropeanSignalProcessingConference(Trieste,Italy),Sep1996RecommendationG..723.1DualRateSpeechCoderf。rMulthnediaCommunicationsat5.3and6.3kbiffs,Mar1996Aoki,APacketLossConcealmentTechniqueforVolPusingSteganography,2003SymposiumonIntelligentSignalProcessingandCommunicationSystems2003),AwajiIsland,Japan,Dec7--10,2003PacketLossConcealmentforPulseCodeModulation(PCMG.711)Coderconcealmeat.pdf6packet[1I]杨行峻,迟惠生等语音信号数字处理,电子工业出版社,1995【12】H.Sanneck,A.Stenger,K.B.Younes,andConcealment,Proc.IEEEU3]A.Stenger,K.B.Younes,andTransmission[14]ITU_TTransmitting[15]NaofumiInternational(ISPACS[16】Receiver—Basedhttp://www.site,uottawa,ca/~bouchard/publis/SP2004[17]张雄伟,陈亮,杨吉斌现代语音处理技术及应用,机械工业出版社,2003.8[18]张雄伟,陈亮,徐光辉DSP集成开发与应用实例。电子工业出版社,2002f19]彭启琮,李玉柏,管庆DSP技术的发展与应用,高等教育出版社,2002东南大学硕士学位论文参考文献[20】TMS320C55xDSPCPUReferenceGuide,SPRU371C,2000.5[2UTMS320C55xDSPMnemonicInstructionSetReferenceGuidetSPRU374C,2000-6[221TMS320C55xAssemblyLanguageToolsUser’sGuide·SPRU280B,2000·4【23]TMS320VC5416DSKTechnicalReference,SpectrumDigitalInc,Mar2002[24】刘益成TMS320C54xDSP应用程序设计与开发,北京航空航天大学出版社,2002·5【25】ITU.TG.729---AnnexB:AsilencecompressionschemeforG729optimizedforterminalsconformingtoRecommendationV.70,Nov1996[26]ITU.T(3.723-1_一AnnexA:Silencecompressionscheme,Nov东南大学硕士学位论文1996致谢致谢在研究生学习生活即将结束之际,我谨向所有关心和帮助我的师长和同学表示最衷心的感谢。首先,我要感谢我的导师吴镇扬教授。两年半来,吴老师渊博的专业知识、严谨求实韵治学态度和踏实认真的工作作风令我受益匪浅,同时在学习和生活的各方面吴老师也给予了我无微不至的关心和帮助。在吴老师的指导下,我得以顺利完成硕士研究生的科研和论文任务。借此机会,我再一次向吴镇扬老师表示我最诚挚的谢意和深深的敬意。同时,在学习和生活中,我还得到了许多老师、同学热情帮助与支持。在此,我要感谢赵力老师、李娟老师、周琳博士、刘海滨博士、桂苹、江新炼、孙健、王澎、谭红艳、王煜坚等同学,感谢他们给予我的无私帮助、支持和鼓励。我还要感谢0401硕的班主任房芳老师,感谢她对我的关心和帮助。最后,我要感谢我的父亲母亲。每当我懈怠时,父母总是敦促我抓紧时间,早日完成学业。他们的支持是我不断前进的动力。在此,我向他们表示深深的谢意。我想,努力工作实现自己的价值,就是对他们的最好报答。李婴2004年3月东南大学硕士学位论文
因篇幅问题不能全部显示,请点此查看更多更全内容