基于TMS320C64xx的多通道语音编码平台的设计
摘 要:设计一种基于TMS320C64xx DSP阵列实现多路语音编解码的软件平台,以满足不改变软件框架即可实现各种语音编码算法的应用需求。在此软件平台中,采用现代语音编码算法“逐帧处理”的思想设计,优化DSP的HPI接口、McBsp接口的数据处理流程。通过EDMA控制器控制外部数据的接收和发送,不占用DSP的内核开销。该平台具有极高的编码效率和良好的扩展性。
关键词:TMS320C64xx;DSP;语音编码;多通道
中图分类号:TP336.8文献标识码:B
文章编号:1004-373X(2008)22-062-05
Design of Multi-channel Speech Coding Platform Based on TMS320C64xx
WU Zongkui,WANG Xiaoyun
(Nanjing Ednns Digital Technology Co.Ltd.,Nanjing,211100,China)
Abstract:This article describes a TMS320C64xx based multi-channel speech coding software platform design.The platform meets the application requirement that any kind of speech coding algorithm could be performed without changing software structure.Based on progressive frame processing design concept,data processing flow on both HPI and McBsp interfaces are optimized.EDMA controller is used to control external data transmitting and receiving.This approach does not require DSP kernel resources.The platform shows high coding efficiency and good extensibility.
Keywords:TMS320C64xx;DSP;speech coding;multi-channel
1 引 言
现代语音编码算法一般都采用逐帧处理的方式,每收到一帧语音(多个样点)进行1次编码,以利用线性预测和矢量量化等技术去除语音信号之间的短期和长期相关性,尽可能地降低语音编码速率,同时保持较高的重建语音质量(清晰度、可懂度和自然度)。通常这些语音编码算法都很复杂,需要在特殊的器件上才能实时实现,这就要求器件的处理能力足够强,为此有2种选择:一种选择是采用专用集成电路(ASIC),用硬件方式实现语音编解码算法;另一种选择是采用可编程数字信号处理器(DSP),用高级语言或汇编语言编写的算法软件来实现语音编解码。由于软件实现比较灵活,有利于满足不断增加的应用需求,而且随着集成电路工艺的发展, DSP运算能力越来越强,采用DSP来实现语音编码算法越来越普遍。
TMS320C64xx(以下简称64x)是TI推出的功能强大的32位定点DSP,其工作主频可高达600 MHz。64x的内核包含8个功能单元,可同时执行8条指令,因此在600 MHz工作主频下64x DSP的处理能力峰值高达4 800 MIPS。64x DSP采用两级Cache机制,一级指令Cache和一级数据Cache都是16 kB;二级Cache达到1 024 kB,二级Cache也可以作为片内RAM使用,这么大的片内内存空间一般可以保证程序代码和数据都存储在片内内存,确保最快的运行速度。此外,64xDSP还集成了丰富的外设资源,提供了如主机接口(HPI)、多通道缓冲串口(McBSP)等多种类型的接口。为配合这些高速外设的数据传输,64xDSP还包含1个64通道的增强型直接存储器存取(EDMA)控制器。EDMA控制器配置灵活简单,可以十分方便地将DSP配置成一个独立的多通道信号处理系统。正因为以上特点,TMS320C64xx广泛应用于媒体网关、宽带、无线基础设施等需要同时做多路复杂信号处理的场合。
本文介绍的是一种基于64x DSP实现多通道语音编码的框架和方法。
2 系统框架
图1给出了由多片64x DSP构成的多路语音编码系统的整体框架。
该系统由1块主(HOST)处理器和n块64x DSP构成。主处理器通常采用嵌入式高性能微处理器,用于高层协议处理以及对DSP进行控制。DSP作从处理器,用来完成语音编解码算法。单片DSP就可处理几十甚至上百路语音信号。
HOST处理器收取分组网络中的数据包并做拆包处理,提取其中的语音压缩码字并将压缩码字通过HPI接口发给相应的DSP进行解码处理;另一方面HOST处理器要接收DSP送来的语音压缩码字,打包后发送到分组网络中。同时HOST处理器还需要向DSP发送与通道控制、业务有关的命令,比如激活、释放某个通道,告知DSP某个通道采用的算法类型。DSP运行的代码保存在HOST处理器本地存储空间,当系统上电工作后,HOST处理器将DSP代码通过HPI口写入到各片DSP的内存空间中,然后给DSP一个唤醒信号使之启动运行。HOST处理器通过DSP的HPI口与DSP进行双向数据传输,HPI口总线通常挂接在HOST处理器的外部数据存储总线上,这样HOST处理器可以像访问片外数据存储器一样访问DSP的HPI口寄存器。
DSP主要完成多路语音编码和解码运算。通常n块DSP运行相同的代码。DSP通过McBSP口接收时分复用的原始语音信号,当某个通道收齐一帧信号后DSP进行一次语音编码,将编出来的压缩码字加上通道号、业务类型等信息封装成特殊的帧格式并发送到HOST处理器。另一方面,DSP将从HOST接收到的压缩码字进行解码运算,并将解码得到的重建语音从McBSP发送出去。
这里重点讨论DSP侧的实现。
3 接口设计
DSP与外部通信的接口主要包括HPI口和McBSP口。
3.1 HPI接口
HOST处理器与DSP之间的信息交互通过HPI口进行。DSP的EDMA控制器配合HOST处理器完成HPI口读写操作,DSP的内核并不直接与HPI接口打交道。HOST处理器可以透明地访问DSP的所有内存空间。64x的HPI接口总线可以是16位或32位,可根据实际应用的通信流量选择总线宽度。
DSP与HOST处理器逐帧进行通信,帧长固定,每帧都包含帧头部分和载荷部分,帧格式遵循内部约定的协议。例如,对于话音业务帧,帧头可以包括通道号、帧类型指示(指示当前帧是话音帧)和编解码速率等信息,载荷即语音压缩码字。HOST处理器发给DSP的各种命令帧(如激活通道命令、释放通道命令)的帧头部分包括通道号、帧类型指示(指示当前帧是命令帧)和命令ID号,载荷部分则是无用信息。
在DSP内存中设立HPI接收缓冲区和HPI发送缓冲区,采用FIFO格式操作。HOST处理器将从外部网络新收到的话音业务帧和要发给DSP的命令帧写入到HPI接收缓冲区;DSP则将编码后得到的话音压缩码字按规定的帧格式组成HPI话音帧并写入到HPI发送缓冲区。
3.1.1 HPI缓冲区的设置
HPI接收缓冲区和HPI发送缓冲区可以采用相同的环形缓冲区结构,如下:缓冲区含HPIFRAMENUM个HPI缓冲帧,每个缓冲帧长HPIFRAMELEN个字节。HOST处理器与DSP之间以HPI缓冲帧作为单位进行数据传输,1个HPI缓冲帧可以装载1个语音帧或命令帧。用数组描述HPI输入/输出缓冲区为:
Unsigned charHpiRxBuf[HPIFRAMENUM][ HPIFRAMELEN];
Unsigned charHpiTxBuf[HPIFRAMENUM][ HPIFRAMELEN];
另外要为HPI输入缓冲区设立1个HOST写入指针、1个DSP读出指针,指针取值范围为0,1,…,HPIFRAMENUM-1,表明缓冲区将要写入和读出的位置。HOST处理器每向DSP发送数据帧后都要修改HOST写入指针,使之指向下一个要填写的HPI缓冲帧。DSP通过比较DSP读出指针和HOST写入指针是否一致,如果不一致则说明HOST已发来新的HPI帧,DSP读出这些新收到的HPI帧并同步修改DSP读出指针。同理要为HPI输出缓冲区设立一个DSP写入指针和HOST读出指针,HOST处理器根据这两个指针是否一致来判断DSP是否发送了新的信息。HPI输入/输出缓冲区读写操作见图2。
3.2 McBSP接口
DSP通过McBSP口接收和发送多个通道的PCM语音信号。单个McBSP口最多可以接收发送256个通道的时分复用信号。实际上单片DSP能实时处理的通道数是有限的,可根据实际要求激活所需要的通道。McBSP还可以硬件完成PCM A律或μ律压扩。在EDMA控制器的配合下,McBSP可以高效地接收/发送数据。
3.2.1 McBSP缓冲区的设置
为了最大程度地提高效率、降低DSP内核的负荷,在实际中McBSP接收发送数据可以采用DMA即直接存储器访问方式,内存中要发送的的数据由EDMA控制器搬运到McBSP发送寄存器;另一方面McBSP接收寄存器新收到的数据也将由EDMA控制器搬运到内存中适当位置。除了初始化阶段需要配置McBSP口和EDMA控制器的有关参数,CPU并不直接与McBSP接口打交道。CPU只需通过McBSP的输入/输出缓冲区(McbspRxBuf和McbspTxBuf)读写数据即可。McBSP输入/输出缓冲区采用三维数组结构,描述如下:
WORD16 McbspRxBuf[MCBSPFRAMENUM] [MAXCHNUM] [CHFRAMELEN];
WORD16 McbspTxBuf[MCBSPFRAMENUM] [MAXCHNUM] [CHFRAMELEN];
McBSP缓冲区设MCBSPFRAMENUM个McBSP缓冲帧,每一个McBSP缓冲帧含MAXCHNUM个通道的时分复用数据,每通道存储CHFRAMELEN个样值(每个样值16位)。单个McBSP缓冲帧的结构见图3。MAXCHNUM是DSP可能同时处理的最大通道数。CHFRAMELEN可以等于语音编码算法本身的帧长度。比如,假如语音编码算法每帧长160个样点(8 kHz采用频率下为20 ms),那么CHFRAMELEN可以取160。不过因为McBSP缓冲帧的“粒度”越精细就越有利于上层软件采取措施降低通信时延,这里建议CHFRAMELEN取值小于算法帧长,比如算法帧长为160的情况下CHFRAMELEN可以取值80或40。假如要同时运行多种算法且各种算法的帧长不尽相同,那么CHFRAMELEN可以取所有算法帧长的公约数。
为了实时实现,McBSP输入/输出缓冲区为每个通道分配的空间(即MCBSPFRAMENUM*CHFRAMELEN个样点)应该不小于算法帧长的3倍。
一般,语音编码算法要求的输入原始语音和解码器输出的重建话音通常是16位线性格式。为了节省CPU运算资源,这里由McBSP硬件来完成语音样点在16位线性格式与8位PCM格式之间的变换,所以缓冲区由16位字构成,这样语音编解码算法可以直接输入/输出线性语音,不用再由软件实现PCM压扩变换。当然,这种策略也使得McBSP输入/输出缓冲区增大了1倍。
程序在初始化阶段要设置McBSP的工作方式,配置EDMA控制器使其自动从McBSP接收和发送数据。对McBSP的设置通过修改几个控制寄存器来完成,EDMA控制器的配置相对更复杂一些。
3.2.2 EDMA控制器的设置
64x EDMA各通道的工作方式由EDMA参数表(PaRAM)设定,EDMA参数表占2 kB空间,共有84个EDMA参数项,每项6个WORD32(合24 B)。每个EDMA事件用一个或多个链接(Link)起来的参数项表示。EDMA参数项描述了对应的EDMA通道传输参数,其内容如图4所示。
图4中各字段的含义如下:
(1) Options(OPT):传送配置选项,包括:EDMA事件优先级、数据大小、中断使能、Link方式使能等;
(2) SRC Address(SRC):数据源地址;
(3) Element Count (ELECNT):一帧或一个阵列中数据单元的个数;
(4) Array/frame count(FRMCNT):帧的个数(对一维传送而言)或阵列的个数(对二维传送而言);
(5) DST Address(DST):数据传向的目的地址;
(6) Element Index (ELEIDX):数据单元索引(只用于一维传送);
(7) Frame/Array Index (FRMIDX):帧/阵列索引;
(8) Element Count Reload (ELERLD):重新装载的数据单元个数;
(9) Link Address (LINK):被链接的参数RAM的地址;
McBSP口收发数据占用2个EDMA通道,一个负责将McBSP接收寄存器Rx的数传送到McbspRxBuf;另一个负责将McbspTxBuf中的数据传送到McBSP的发送寄存器Tx。
对McBSP接收EDMA通道而言,EDMA参数项中源地址(SRC)参数就是该McBSP口接收寄存器Rx的地址,源地址固定不变;目的地址(DST)参数是McBSP接收缓冲帧的起始地址,EDMA传输的目的地址按元素地址偏移(ELEIDX)变化,这里ELEIDX等于2×CHFRAMELEN,即McBSP接收缓冲帧中通道1的第一个样点与通道0的第一个样点之间的地址偏移。Element Count参数等于MAXCHNUM,Frame Count参数等于CHFRAMENUM-1。Frame Index参数等于( 1 - (MAXCHNUM-1)×CHFRMAENUM )×2,即McBSP接收缓冲帧中通道0的第2个样点与通道MAXCHNUM-1的第1个样点之间的地址偏移。
对McBSP发送EDMA通道而言,Destination Address参数就是该McBSP口发送寄存器Tx的地址,Source Address参数是McBSP接收缓冲帧的起始地址。其余Element Count,Element Index,Frame Count以及Frame Index等参数与McBSP接收EDMA通道设置相同。
与HPI缓冲区相似,McBSP缓冲区也要设置读写指针指向不同的McBSP缓冲帧。由于McBSP缓冲区实际上划分为MAXCHNUM个通道,且各个通道之间具有独立性,它们的承载的业务可能不一样,激活和释放的时间也各不相同,因此McBSP缓冲区读写指针设置与HPI缓冲区略有不同。对McBSP接收缓冲区来说,需要设置1个EDMA写指针表示EDMA控制器正在往哪个McBSP接收缓冲帧搬运数据。
EDMA写指针的初始值为0,以后EDMA控制器每消耗1个EDMA参数项(也就是写满了1个McBSP接收缓冲帧)就会产生1次EDMA中断,在中断服务程序中修改EDMA写指针,使之指向下一个McBSP接收缓冲帧。另外为每个通道设立一个CPU读指针表示该通道将要读取哪个McBSP接收缓冲帧。同理,McBSP发送缓冲区需要设置一个EDMA读指针表示EDMA控制正在读取哪个McBSP发送缓冲帧,另外为每个通道设立一个CPU写指针表示该通道将要往哪个McBSP发送缓冲帧写入待发送的数据。
McBSP接收缓冲区EDMA写指针和McBSP发送缓冲区EDMA读指针为所有通道共同使用。McBSP缓冲区的读写指针取值范围为0~MCBSPFRAMENUM-1。图5显示了某个通道(i通道)读写McBSP缓冲区数据的示意图。
3.2.3 EDMA中断服务程序
EDMA控制器每填满1个McBSP接收缓冲帧就会产生1次EMDA中断,进入EDMA中断服务程序;同样,EDMA控制器每发送完1个McBSP发送缓冲帧也会产生1次EDMA中断,进入EDMA中断服务程序。在EDMA中断服务程序中需要先确认激发当前中断的是哪个EDMA事件,这是通过查询EDMA通道中断悬挂寄存器CIPR的相应位来获知的。在本应用中,EDMA中断服务程序主要完成修改McBSP接收/发送缓冲区的读写指针功能,上层软件将查询读写指针的间隔来激活不同的功能模块。由于缓冲区是环形结构,故指针的修改含有取模运算。
EDMA中断服务程序流程图见图6所示。
4 软件设计
软件部分分成3层,即底层通信模块、调度模块和上层业务模块,见图7所示。
底层通信模块即EDMA中断服务程序,主要为上层软件(调度模块)提供McBSP接口的接收/发送状态。有些实时性要求严格的任务(如McBSP接收/发送缓冲区的流量控制)也应该在底层通信模块完成。
上层业务模块执行语音编解码算法。调度模块负责在系统上电初期初始化各通道状态以及其他全局变量、设置McBSP和EDMA控制器工作方式;在运行过程中监控各个通道的状态,处理HOST处理器发来的命令,为语音编码/解码算法提供软件接口适配。
5 结 语
本文提出了一种基于TMS320C64xx DSP实现多路语音编解码的系统框架,重点说明HPI接口和McBSP接口的设计方案。在这种接口设计方案下,数据的接收和发送由EDMA完成,不占用DSP的内核开销,具有极高的效率。同时该系统具有很好的扩展性,在此平台上可以运行多种语音编解码算法。
参考文献
[1]Texas Instruments Incorporated.TMS320C6000 DSP Multi-channel Buffered Serial Port(McBSP) Reference Guide.2004.
[2]Texas Instruments Incorporated.TMS320C6000 DSP Enhanced Direct Memory Access (EDMA) Controller Reference Guide.2000.
[3]王剑峰,马艳萍,刘云.McBSP在语音信号处理中的应用与实现.微计算机应用,2006,27(3):349-351.
[4]周敬利,赵冕,郭红星.G.729语音编码器在DSP上的实时实现.微处理机,2007,28(4):1-3.
[5]郭芙蓉.基于DSP的语音编码系统设计.信息技术,2008,32(2):109-112,117.
[6]张丹红,游珍珍.DSP的多领域应用研究.计算机技术与发展,2006,16(3):206-107,210.
[7]姚天任.数字语音处理.武汉:华中科技大学出版社,2003.
[8]陈华,关宇东,王健.一种短波通信中基于DSP的低速率语音编码技术.应用科技,2007(8):9-13.
[9]杨永超,付中华,蒋冬梅.基于DSP的实时语音检测的设计与实现.计算机应用,2008,28(2):491-493,498.
[10]张刚,史忠科.基于DSPs C6000系列的异步串行数据传输.工业仪表与自动化装置,2007(4):56-58,61.
[11]高秀娟.TMS320C6000系列DSP的软件优化技术.单片机与嵌入式系统应用,2007(4):22-24,28.
[12]余建康,来五星,史铁林.TMS320C6711 DSP异步串行通信的研究与实现[J].机械与电子,2006(1):38-40.
作者简介 吴宗魁 1976年出生,工程师。研究方向为多媒体通信,嵌入式系统开发。
王晓耘 1973年出生,工程师。研究方向为集成电路应用设计。