基于XDAIS标准G.729A算法的VoIP语音网关设计
2014-09-10张云勇燕飞
张云勇+燕飞
针对VoIP交换机语音网关的需求,实现了基于XDAIS标准的G.729A算法。结合TI DSP处理器C55x的特点对算法进行优化,实现单片TMS320VC5510中12路语音编解码,在此基础上完成了支持96路话音的VoIP语音网关的设计,并已成功应用到多种型号的军用语音交换机中。
DSP XDAIS G.729A VoIP 语音网关
Design of VoIP Voice Gateway Based on G.729A Algorithm of XDAIS
ZHANG Yun-yong1, YAN Fei2
(1. China Electronics Technology Group Corporation No.7 Research Institute, Guangzhou 510310, China;
2. Sichuan Electric Vocational and Technical College, Chengdu 610072, China)
The G.729A algorithm based on XDAIS is realized to satisfy the demands for the voice gateway of VoIP switch. The algorithm is optimized combined with C55X platform of TI DSP processor to realize 12-channel voice encoding and decoding in a single TMS320VC5510. Based on this result, a VoIP voice gateway supporting 96-channel voice is completed, and it has applied to military voice switches with several types.
DSP XDAIS G.729A VoIP voice gateway
1 引言
随着互联网通信的发展,VoIP(Voice over Internet Protocol,互联网协议的语音承载)技术发展到现在已经相当成熟,其实质是一种利用终端对语音数据进行采集及还原,由IP网络传输分组语音数据包的语音通信技术。语音压缩编码是VoIP技术的重要组成部分,ITU-T(国际电信联盟电信标准化部)定义的G.729、G.723是VoIP的主要编码格式。然而传统的电话交换网络以其话音质量好、延时小等特点仍然不可替代,因此VoIP交换机需要与PSTN(Public Switched Telephone Network,公共交换电话网络)互联。故通常的VoIP交换机需要大容量的语音网关单元实现语音编解码功能。相对于G.729,G.729A进一步降低了算法复杂度,实际应用较广。本文讨论基于TI(德州仪器)公司的DSP(Digital Signal Processor,数字信号处理器)C55x平台上实现XDAIS(eXpressDSP Algorithm Interface Standard,eXpressDSP算法接口标准)架构的G.729A算法及其优化,在此基础上给出了VoIP大容量交换机语音网关的设计方案。
2 XDAIS架构的G.729A算法实现
为了便于第三方厂商开发通用DSP算法程序,TI制定了XDAIS程序架构。该架构可解决算法模块间资源共享及程序兼容性问题,使得在同一DSP上实现不同算法或相同算法的多通道应用更容易。为了实现G.729A算法在多通道语音网关上的应用,按照XDAIS程序架构对算法进行封装是非常有效的方法。
2.1 XDAIS架构
XDAIS标准架构示意图如图1所示:
图1 XDAIS标准架构示意图[1]
XDAIS标准定义了三层规则:第一层是包含了所有DSP算法编程适用的通用编程规则,如C调用、可重入等;第二层规则使得所有算法可以在单一DSP系统上协调地运行,包括程序的封装、标识、命名、内存管理等;第三层规则与使用的DSP系列硬件资源相关,包括中断、内存、寄存器等。第三层以下是各厂商开发的算法,XDAIS对此不作规定[1]。
符合XDAIS标准的算法必须实现一个标准接口,即IALG接口。该接口提供的功能包括对系统存储资源的管理、算法实例的建立、初始化和终止对象。这些功能体现在一个IALG_Fxns的结构体中,也称V表,在这个结构体中定义了算法接口需要的标准函数,其中除了algAlloc()、a1gInit()和algFree()是必须的外,其它的函数是可选的。algAlloc()实现内存分配;algInit()用来初始化算法实例对象;algFree()在销毁算法实例对象后释放存储空间。除了IALG,XDAIS还要定义一个算法实例接口,该接口包含了算法的实现,是算法接口的一个实例[2]。算法提供者需要在此实例的基础上添加特定的算法代码,完成算法的封装。
2.2 G.729A算法封装
IALG只是一个算法接口框架,具体的算法还要由IALG派生而来。针对G.729A算法,首先实例化以下结构:
typedef struct IG729A_Fxns {
IALG_Fxns ialg;/* IG729A extends IALG */
XDAS_Void (*apply)(IG729A_Handle handle,…);
} IG729A_Fxns;
结构体第一项即是对IALG的一个实例,第二项函数apply()是算法的应用程序入口。endprint
为了区分不同厂商的算法模块,XDAIS规定了算法的命名规则,通常为“
#define IALGFXNS \
&G729A_CETC7_IALG, /* module ID*/ \
NULL, /* activate*/ \
G729A_CETC7_alloc, /* algAlloc*/ \
G729A_CETC7_control, /* control*/ \
NULL, /* deactivate*/ \
G729A_CETC7_free, /* free*/ \
G729A_CETC7_initObj, /* init*/ \
G729A_CETC7_moved, /* moved*/ \
NULL /* numAlloc*/ \
/* module_vendor_interface */
IG729A_Fxns G729A_CETC7_IG729A = {
IALGFXNS,
G729A_CETC7_apply,
};
其中,G729A_CETC7_IG729A即为基于XDAIS的G.729A算法程序框架的一个实例,修改实例中对应的G729A_CETC7_initObj()、G729A_CETC7_alloc()、G729A_CETC7_free()、G729A_CETC7_apply()等函数可以实现程序框架与目标算法代码的连接。
2.3 G.729A算法实现
G.729是ITU-T制定的基于CS-ACELP算法的语音编码标准[3],其编码速率为8kbit/s,是对电话宽带语音信号编码的标准,也是目前应用广泛的VoIP语音数字信号处理标准[4]。
ITU-T提供了基于PC平台的G.729A算法C语言评估代码。但由于评估代码是PC通用的单任务程序,未考虑硬件实现平台、程序效率、多通道应用等因素,因此不能直接使用,需要对程序进行移植。
通常程序移植首先要考虑基本数据类型的兼容。G.729A算法程序代码中用到了三种基本数据类型Word32、Word16及Flag,针对DSP C55x平台需要定义如下:
typedef long int Word32;
typedef short int Word16;
typedef int Flag.
此外,内存资源的使用也是算法移植的关键,这是实现算法多通道应用的必要条件。针对单任务的算法代码,将其中的所有全局变量及静态内存定义成一个结构G729_BUF,这个结构包含了G.729A算法需要的所有存储资源,在算法例化时进行内存动态分配。XDAIS架构中的函数G729A_CETC7_alloc()、G729A_CETC7_free()完成G729_BUF结构的内存分配和释放。
最后,算法移植的最重要内容是实现算法代码和XDAIS架构的接口。这主要涉及函数G729A_CETC7_initObj()和G729A_CETC7_apply(),前者完成算法的初始化,后者完成XDAIS架构算法的接口。
初始化的实现方法是在函数G729A_CETC7_initObj()中添加以下代码:
st=(G729_BUF *)G729A->G729_st_mem;
Init_Pre_Process();
Init_Coder_ld8a();
Init_Decod_ld8a();
Init_Post_Filter();
Init_Post_Process();
变量st是一个G729_BUF结构的全局指针,指向算法例化时在函数G729A_CETC7_alloc()中分配的内存空间;其余调用的函数是G.729A算法的初始化代码。
算法的接口实现方法是在函数G729A_CETC7_apply()中调用G.729A算法的编码及解码函数,包括以下内容:
//编码调用函数
Pre_Process(st->new_speech, L_FRAME);
Coder_ld8a(st->prm);
prm2bits_ld8k_rfc( st->prm, dataOut);
//解码调用函数
bits2prm_ld8k_rfc( dataIn, &st->parm[1]);
Decod_ld8a(st->parm, st->synth, st->Az_dec, st->T2);
Post_Filter(st->synth, st->Az_dec, st->T2); Post_Process(st->synth, L_FRAME);
通过封装的算法代码可以链接成库文件,应用程序调用算法时只需包含库文件和相应的头文件,目标代码直接链接库函数,算法代码不用被再次编译,这保证了模块化设计及算法的一致性。以下是应用程序调用算法的代码实例:
G729A_Handle handle[n];//定义n通道算法句柄
IG729A_Fxns fxns[n];
fxns[n]=G729A_CETC7_IG729A;//例化算法
handle[n]=G729A_create(&fxns[n], NULL);//创建算法
…
G729A_CETC7_apply(handle[n],…);//调用算法
…
G729A_delete(handle[n]);//释放算法(如果需要)
3 G.729A算法优化
按以上方法封装的算法仿真测试需要12.3ms才能完成一帧话音的编解码,而G.729标准规定的话音帧为10ms/帧[3],显然算法效率太低,无法满足实时话音的要求,必须对算法进行优化。
采用汇编代码对C进行替换是常用的程序优化方法,而G.729A算法包含了30多个文件,全部实现替换工作量很大,因此对算法代码进行分析,找出算法中最底层的基本运算函数,由内而外,先从子函数开始优化。由于算法中很多基本算子函数被多次循环调用,是制约程序效率的主要因素,这些函数主要包含在文件BASIC_OP.C中,所以优化的主要内容就是对这个文件中的基本算子函数进行全汇编替换。
除了编程优化外,编译选项的优化也是很重要的。以下编译选项对程序效率有较大影响,需要在CCS程序工程中添加这些选项[5]:
-o3:最高的优化级别,能显著提高程序效率;
-pm:程序级优化;
-op2:调用优化,此选项要避免在汇编程序中调用C中的函数和全局变量;
-oi100:编译器自动内联小于100行的函数。
通过以上优化措施,程序效率可达到0.83ms/帧,占用DSP动态存储空间4.6kB/通道。TMS320VC5510工作主频为200M,可以算出优化后的算法编解码一帧需要CPU处理能力为16.7(mega cycles)/s。
4 VoIP语音网关设计
VoIP网络通常采用G.729A话音编码,为了实现VoIP终端和其它话音网络(如PSTN、移动电话等)互通,需要在VoIP交换机中实现语音网关来完成G.729A话音到PCM(Pulse Code Modulation,脉冲编码调制)话音的转换。VoIP语音网关的实现原理如图2所示。
网络处理器为Freescale公司的MPC8280,完成IP网络及话音控制功能;DSP为TMS320VC5510,实现G.729A算法;FPGA为Altera公司的EP1C3,完成DSP的McBSP接口到2M话音群的接入。
从VoIP网络来的话音帧由网络处理器通过MPC8280的Local Bus(本地总线)和DSP的HPI(Host Port Interface,主机接口)送给DSP进行解码,解码后的PCM话音通过McBSP给FPGA完成2M话音群的时隙插入,网络处理器通过MPC8280的MCC从2M群提取话音。反之为编码的信号流程。
根据以上原理设计的VoIP语音网关单元包含了16片DSP,完成了96通道的G.729A语音编解码,话音清晰可懂。根据目前应用结果,证明了基于XDAIS标准G.729A算法的高效、可靠及易扩展性,达到了设计的预期效果。
5 结束语
本文基于XDAIS架构的G.729A算法解决了在同一DSP处理器上实现多路G.729A算法的问题,并对算法进行了优化,理论上可实现一片TMS320VC5510上12通道的G.729A编解码。标准的XDAIS架构使得算法移植性强,很容易将算法应用到其它设备中,缩短产品的开发周期。VoIP语音网关的实现使得这一算法得到了实际应用,目前该语音网关已应用于多种型号的军用交换机中,并且运行稳定。
参考文献:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友传,等. TMS320DSP算法标准(XDAIS)及参考构架RF5综述[J]. 舰船电子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 浅谈VoIP技术中的语音编码技术及其在DSP上的实现[J]. 经营管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint
handle[n]=G729A_create(&fxns[n], NULL);//创建算法
…
G729A_CETC7_apply(handle[n],…);//调用算法
…
G729A_delete(handle[n]);//释放算法(如果需要)
3 G.729A算法优化
按以上方法封装的算法仿真测试需要12.3ms才能完成一帧话音的编解码,而G.729标准规定的话音帧为10ms/帧[3],显然算法效率太低,无法满足实时话音的要求,必须对算法进行优化。
采用汇编代码对C进行替换是常用的程序优化方法,而G.729A算法包含了30多个文件,全部实现替换工作量很大,因此对算法代码进行分析,找出算法中最底层的基本运算函数,由内而外,先从子函数开始优化。由于算法中很多基本算子函数被多次循环调用,是制约程序效率的主要因素,这些函数主要包含在文件BASIC_OP.C中,所以优化的主要内容就是对这个文件中的基本算子函数进行全汇编替换。
除了编程优化外,编译选项的优化也是很重要的。以下编译选项对程序效率有较大影响,需要在CCS程序工程中添加这些选项[5]:
-o3:最高的优化级别,能显著提高程序效率;
-pm:程序级优化;
-op2:调用优化,此选项要避免在汇编程序中调用C中的函数和全局变量;
-oi100:编译器自动内联小于100行的函数。
通过以上优化措施,程序效率可达到0.83ms/帧,占用DSP动态存储空间4.6kB/通道。TMS320VC5510工作主频为200M,可以算出优化后的算法编解码一帧需要CPU处理能力为16.7(mega cycles)/s。
4 VoIP语音网关设计
VoIP网络通常采用G.729A话音编码,为了实现VoIP终端和其它话音网络(如PSTN、移动电话等)互通,需要在VoIP交换机中实现语音网关来完成G.729A话音到PCM(Pulse Code Modulation,脉冲编码调制)话音的转换。VoIP语音网关的实现原理如图2所示。
网络处理器为Freescale公司的MPC8280,完成IP网络及话音控制功能;DSP为TMS320VC5510,实现G.729A算法;FPGA为Altera公司的EP1C3,完成DSP的McBSP接口到2M话音群的接入。
从VoIP网络来的话音帧由网络处理器通过MPC8280的Local Bus(本地总线)和DSP的HPI(Host Port Interface,主机接口)送给DSP进行解码,解码后的PCM话音通过McBSP给FPGA完成2M话音群的时隙插入,网络处理器通过MPC8280的MCC从2M群提取话音。反之为编码的信号流程。
根据以上原理设计的VoIP语音网关单元包含了16片DSP,完成了96通道的G.729A语音编解码,话音清晰可懂。根据目前应用结果,证明了基于XDAIS标准G.729A算法的高效、可靠及易扩展性,达到了设计的预期效果。
5 结束语
本文基于XDAIS架构的G.729A算法解决了在同一DSP处理器上实现多路G.729A算法的问题,并对算法进行了优化,理论上可实现一片TMS320VC5510上12通道的G.729A编解码。标准的XDAIS架构使得算法移植性强,很容易将算法应用到其它设备中,缩短产品的开发周期。VoIP语音网关的实现使得这一算法得到了实际应用,目前该语音网关已应用于多种型号的军用交换机中,并且运行稳定。
参考文献:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友传,等. TMS320DSP算法标准(XDAIS)及参考构架RF5综述[J]. 舰船电子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 浅谈VoIP技术中的语音编码技术及其在DSP上的实现[J]. 经营管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint
handle[n]=G729A_create(&fxns[n], NULL);//创建算法
…
G729A_CETC7_apply(handle[n],…);//调用算法
…
G729A_delete(handle[n]);//释放算法(如果需要)
3 G.729A算法优化
按以上方法封装的算法仿真测试需要12.3ms才能完成一帧话音的编解码,而G.729标准规定的话音帧为10ms/帧[3],显然算法效率太低,无法满足实时话音的要求,必须对算法进行优化。
采用汇编代码对C进行替换是常用的程序优化方法,而G.729A算法包含了30多个文件,全部实现替换工作量很大,因此对算法代码进行分析,找出算法中最底层的基本运算函数,由内而外,先从子函数开始优化。由于算法中很多基本算子函数被多次循环调用,是制约程序效率的主要因素,这些函数主要包含在文件BASIC_OP.C中,所以优化的主要内容就是对这个文件中的基本算子函数进行全汇编替换。
除了编程优化外,编译选项的优化也是很重要的。以下编译选项对程序效率有较大影响,需要在CCS程序工程中添加这些选项[5]:
-o3:最高的优化级别,能显著提高程序效率;
-pm:程序级优化;
-op2:调用优化,此选项要避免在汇编程序中调用C中的函数和全局变量;
-oi100:编译器自动内联小于100行的函数。
通过以上优化措施,程序效率可达到0.83ms/帧,占用DSP动态存储空间4.6kB/通道。TMS320VC5510工作主频为200M,可以算出优化后的算法编解码一帧需要CPU处理能力为16.7(mega cycles)/s。
4 VoIP语音网关设计
VoIP网络通常采用G.729A话音编码,为了实现VoIP终端和其它话音网络(如PSTN、移动电话等)互通,需要在VoIP交换机中实现语音网关来完成G.729A话音到PCM(Pulse Code Modulation,脉冲编码调制)话音的转换。VoIP语音网关的实现原理如图2所示。
网络处理器为Freescale公司的MPC8280,完成IP网络及话音控制功能;DSP为TMS320VC5510,实现G.729A算法;FPGA为Altera公司的EP1C3,完成DSP的McBSP接口到2M话音群的接入。
从VoIP网络来的话音帧由网络处理器通过MPC8280的Local Bus(本地总线)和DSP的HPI(Host Port Interface,主机接口)送给DSP进行解码,解码后的PCM话音通过McBSP给FPGA完成2M话音群的时隙插入,网络处理器通过MPC8280的MCC从2M群提取话音。反之为编码的信号流程。
根据以上原理设计的VoIP语音网关单元包含了16片DSP,完成了96通道的G.729A语音编解码,话音清晰可懂。根据目前应用结果,证明了基于XDAIS标准G.729A算法的高效、可靠及易扩展性,达到了设计的预期效果。
5 结束语
本文基于XDAIS架构的G.729A算法解决了在同一DSP处理器上实现多路G.729A算法的问题,并对算法进行了优化,理论上可实现一片TMS320VC5510上12通道的G.729A编解码。标准的XDAIS架构使得算法移植性强,很容易将算法应用到其它设备中,缩短产品的开发周期。VoIP语音网关的实现使得这一算法得到了实际应用,目前该语音网关已应用于多种型号的军用交换机中,并且运行稳定。
参考文献:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友传,等. TMS320DSP算法标准(XDAIS)及参考构架RF5综述[J]. 舰船电子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 浅谈VoIP技术中的语音编码技术及其在DSP上的实现[J]. 经营管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint