多制式语音编码及其DSP实现

2019-07-19 15:18发布

摘要:介绍了一种多制式语音编解码器,在单片TMS320VC5409上完成4路语音的全双工通信,并实现G.729a、CVSD、ADPCM算法之间的编码转换,给出了算法的软硬件实现、算法的运算量及所占用的硬件资源。 关键词:多制式语音编解码 TMS320VC5409 G.729a CVSD ADPCM 在各种通信设备中,实时的语音压缩通常在DSP上实现。单一编码算法,由于码率和算法固定,系统的灵活性较差。越来越多的通信服务要求能实现多种、多路编码算法,提供一定范围内的编码速率和编码算法的多种选择,例如软件无线电、IP电话、多媒体终端等。 G.729a是ITU制定的一种高质量的中速率语音编码标准,编码速率为8kbps,目前已在许多通信系统中得到了应用。16/32kbps的CVSD是一种抗信道误码非常好的语音编码算法,在军事通信、宇航通信中得到了广泛的应用。32kbps的ADPCM是一种算法较简单的波形编码,具有良好的话音质量和抗噪性能,在卫星通信、数字话路倍增系统中得到了广泛应用。综合了这三种算法的编码系统,在8kbps~32kbps码率具有较高的灵活性。 由于语音压缩的运算量、存储量和精度要求都不太高,在考虑价格因素的基础上,定点DSP足以胜任语音编解码的要求。本文采用了TI公司的TMS320VC5409定点DSP实现了上述三种语音编解码算法。算法DSP的实现通过了有关测试。其中G.729a和ADPCM采用ITUT有关建议提供的测试序列进行了测试,CVSD按照我国有关标准进行了测试。 本文对以上三种语音编码和TMS320VC5409做简单介绍后,对算法的软件和硬件实现进行介绍,并给出算法所需运算量以及所占用的硬件资源。
      1 DSP芯片和语音编码算法
      (1)TMS320VC5409简介 TMS320VC5409是TI公司生产的一种性价比较高的定点DSP芯片,运算速度为80MIPS/100MIPS。它拥有改进的喻佛结构、一个CPU、片上存储区(32KB的ROM和64KB的DARAM)、片上外设以及专用的指令结构。它具有以下主优点: 1条程序总线和3条数据总线。配合存储区的双操作数读取能力,可以支持单周期,三操作数指令,提高了程序的运行和通用性; ·先进的针对应用设计的CPU硬件逻辑提高了芯片的性能; ·高度专用的指令结构提供了更快的算法实现和更方便的优化; ·片上外设包括3个McBSP(多通道缓冲串口)、一个6通道的DMA控制器、8bit HPI口及锁相环时钟发生器; ·模块化结构方便了快速的后续发展; ·先进的IC处理技术实现了高性能和低功耗,5V静态CMOS技术进一步降低了功耗。
      (2)G.729a算法 G.729是ITU在8kbps速率上的标准,采用“共轭结构代数码来激励线性预测编码方案”(C-ASCELP)算法。这种算法综合了波形编码和参数编码的优点,以线性预测编码技术为基础,采用了矢量量化、分析合成和感觉加权等技术。G.729a只在G.729的基础上减少了一些运算量,保持了兼容性,质量也基本没有下降。
      (3)32kbps ADPCM算法 G726是ITU制定的自适应差分脉冲编码算法标准,有4种速率。在此项目中,使用32kbps的速率。ADPCM算法是一种波形编码,它在PCM编码的基础上引入了预测和差分的概念,仅对实际值民预测值之间的差值进行编码。在编码过程,用过去样点的值对当产点进行预测,并自适应地调整预测系数数,使预测误差很小,从而在降低码率的同时,保持了很高编码质量。
      (4)CVSD(32kbps/16kbps)算法 连续可变分辩率增量调制,是一种1bit的差分波形编码方式。自适用的量阶随信号统计特性的变化而变化,在信号很大动态范围内,可获得最大信噪比。并且易于实现,电路结构简单。 主要技术:三连0/三连1检测,即若检测到码流中有三连0或三连1,则表示信号在骤升或骤降,调整量阶以适应信号变化。
       2 硬件系统
      (1)硬件板介绍 在发端,模拟信号通过前端处理电路和A/D采样,转换成8bit A-law PCM信号。对数PCM信号在TMS320VC5409中转换线性码,并进行压缩编码。输出的G.729a/ADPCM/CVSD编流在信道上传输。 接收端接收到的压缩码流在DSP中被解码成对数PCM信号,再经过D/A变换和用户电路,最终得到模拟话音。其中CPLD用来产生8kHz的帧同步信号,使各硬件芯片之间协同工作。 A/D、D/A部分采用单片MC14557芯片。单路信号的硬件系统框图如图1所示。
      (2)算法的硬件选择 程序定义了两个标志变理flag1、flag2。利用VC5409提供的可屏蔽中断INT0~INT3,在中断服务例程中对2个标志位进行设置,从而控制主程序的跳转。 系统加电后,INT0~INT3其中一个管脚给出中断请求信号,程序执行中检测到哪个中断,就执行该中断对应的编码算法。接着,主程序对IMR寄存器置位以屏蔽这些中断,直至下次系统复位。其中INT0中断在测试中是无编码转换的跳转,但在应用中用于选择32kbps的CVSD算法。表1是算法选择的硬件中断与标志位设置。 表1 算法选择的硬件中断与标志位设置 INT0 直通,无编码转换 flag2=0 flag1=0  INT1 G.729a flag2=0 flag1=1  INT2 16kbps CVSD flag2=1 flag1=0  INT3 32kbps ADPCM flag2=1 flag1=1
      (3)数据流输入和输出 VC5409提供了3个McBSP(Multichannel BufferedSerialPorts),并在其中集成了硬件对数PCM编解码器。串口的双缓冲区发送、三缓冲区接收能保证数据的连续性。收发的数据流字长可以是8、12、16、20、24、32bit,每帧最多可以有128个字。表2是本项目采用的串口配置。 表2 串口配置 串口 数据流 字长(bit) 帧长(word) 读/写控制 同步事件/中断  McBSP0 PCM 8 4×1 DMA REVT/XEVT  McBSP1 G.729a 16 4×1 DMA REVT/XEVT  McBSP2 ADPCM/CVSD 32 2or4×8bit CPU RINT/XINT  对每种算法,4路编解码器都要求全双工工作,因此,对3个McBSP都进行了配置。其中,McBSP0负责PCM码流的收发。PCM码流是4路8bit的A-law信号,因此定义字长为8位;McBSP1收发G.729的码流。G.729分帧编码,帧长10ms,每帧80bit。为了数据能够方便、有效地收,定义串口的字长为16bit,这样,每5个帧同步收全一个G.729帧,共16×5×4(路)=80×4bit。 为了取得数据格式的一致性,方便串口收发码流,对ADPCM和CVSD定义了相同的码流格式,并由McBSP2收发。如图2所示。 32kbpsADPCM每样点用4bit编码,规定其码流为每样点的码字重复2次,即占8bit。4路信号其32bit;16kbps和32kbps的CVSD是每样点2bit和4bit编码,故规定其码流为每比特编码码字分别重复4次和2次,即均占8bit。4路信号也是32bit。
      (4)数据流的传输(串口与存储区) VC5409提供了6个DMA通道,用户可以设置每个DMA通道的源地址、目的地址、一次传输的数据量、同步事件和中断方式等。 表3是本项目中各DMA通道的配置情况。 表3 DMA配置 通道 比特流 源地址 目的地址 缓冲区(字) 中断方式(缓冲区)  DMA2 G.729a(收) DRR11 DM 4×5×2 全满/半满  DMA3 G.729a(发) DM DXR11 4×5×2 全满/半满  DMA4 PCM(收) *1 DRR10 DM 4×1 全满  *2 DRR10 DM 4×80×2 全满/半满  DMA5 PCM(发) *1 DM DXR10 4×1 全满  *2 DM DXR10 4×80×2 全满/半满  DM:数据存储区 *1:对ADPCM/CVBSD编码 *2:对G.729a编码
      (5)数据传输的控制 如图3所示,串行数据流在McBSP的DR管脚接收,DX管脚发送。数据收发由帧同步信号触发。帧同步由CPLD提供,位时钟由外部晶振提供。 串口与存储区之间的数据交换由CPU或DMA控制器完成。接收寄存器DRR满(发送寄存器DXR空)时,串口向DMA发出同步事件(REVT/XEVT)或向CPU发出中断请求(RINT/XINT),智能DMA或CPU数据传输已准备好。 对PCM和G.729码流,串口(McBSP0/McBSP1)的数据读写为DMA方式。 由于G.729采用分帧编码,一次编解码待处理的数据量较大。为了避免DMA读取数据过程中连续码流溢出,设计缓冲区为双倍大小。这2块缓冲区以乒乓方式工作,即DMA传递其中块缓冲区数据时,另一块缓冲区接收来自串口或CPU的下一组数据。由于VC5409的DMA支持缓冲区全满或半满都产生中断的方式,所以只要将这2块缓冲区设计成连续,就可以方便地实现乒乓工作,而不产生数据溢出。 对ADPCM/CVSD码流,由于每次处理的码流长度较短(32bit),故在中断服务例程中由CPU直接读写串口(McBSP2),而不采取DMA方式。
      3 软件系统
      (1)CVSD算法的修正 CVSD是每样点1bit的编码方式,所以32kbps和16kbps的CVSD输出信号分别由32kHz和16kHz采样的PCU信号编码得到。而实际CVSD编码器的输入总是8kHz的采样信号,为了满足算法要求。对输入PCM码流进行插值滤波。 根据插值这理,可以选择低通滤波器无失真地恢复原始信号。为了取得信号质量和运算量的折中,设计了5阶的椭圆型IIR滤波器。 1:2插值(16kbps) 分子多项式系数: [1.02295e-01,1.14533e-01,2.41943e-01, 2.41943e-01,1.45325e-01,1.02295e-01] 每母多项式系数: [1.00000e+00,-1.26125e+00,1.91846e+00,-1.21680+00,6.79321e+01,-1.54358e+01] 1:4插值(32kbps) 分子多项式系数: [4.48200e+02,-6.9309e+02,4.68041e+02,4.6041e+02,-6.9309e+02,4.48200e+02] 分母多项式系数: [1.00000e+00,-3.56926e+00,5.66631e+00,-4.83285e+00,2.20789e+00,-4.2822e+01] 另外,在对编解码后的信号进行频谱测试时,发现在3kHz处,信号的幅度超出要求3db左右。为此在编码端加入了谱调整的模块,使3kHz处频谱下降3db,作为补偿。
      (2)G.729算法的回声抵消模块 G.729算法编码延时为15ms,回声现象比较明显,必须引入加声抵消算法加以抑制。 自适应回声抵消器的一般算法中,所需运算量最大的是更新参数部分。阶数越大,运算量越大。考虑到DSP的性能和算法的运算量要求,采用128阶的自适应滤波器进行回声抵消。 回声抵消模块的输入是当前一帧输入语音信号与以前解码器输出的一阶合成语音。回声抵消器利用解码器输出的合成语音信号对一帧输入信号进行回声抵消,然后将抵消掉回声的一帧输入语音信号提供给编码器作为输入信号。
      (3)存储区的优化 ①由于使用DP寻址,变量名仅指示偏移量;而4路信号分时处理,各路所用变量与程序代码相同,所以可以使用不同页上同名变量,在不混淆各路信号数据存储区的前提下,简化程序存储区大小。 对于ADPCM程序,编解码器的有状态变量各占25字,编解码器都使用的变量占14字。鉴于DP一页有128字,所以可以考虑前两路编解码器变量共用一页存储区;后两路编解码器变量共用一页存储区。这样,2路编解码器的存储量有25×2×2+14=114字<128字,可以存储在同一页上。 为了区分同一页上的2路变量以及同一路的编解码器变量,它们的名称应有不同。因此,编解码的程序模块各需要2个版本,即总的程序存储量=单路程序量×2。 ②对CVSD和ADPCM算法,由于输入输出信号不分帧(逐样点处理),而码流格式又取得了一致,所以可以共享输入输出存储单元。
      (4)代码的优化 TMS320C54xx提供了强大的硬件结构和指令体系以支持基本的数据处理操作。对汇编语言,充分挖掘指令集的潜力,能大幅度降低程序的复杂度,提高运行速度。如:使用乘累加指令MAC、MAS等,在一个时钟周期内实现1次乘法和1次加(减)法;使用DELAY指令,在一个周期内实现变量更新,简化了滤波器的实现;使用循环寻址,对FIR和IIR滤波器只要在主程序中设置一次基地址,降低了开销;使用PRT+MVDD指令,进行块搬移,减少频繁内存读定的开销;使用双字运算指令DADD、DADSUB等指令对32位的变进行操作;使用EXP+NORM指令快速计算定点数的指数和尾数;使用RPT+DSUBT指令高效实现定点数除法;使用RPT+FIRS指令高效实现FIR滤波计算。
      4 实现结果 各算法的复杂度和存储量,实现所用资源。一片VC5409上的硬件资源可以满足算法要求。实际系统的各算法性能也通过了相关的标准测试
0条回答

一周热门 更多>