文中针对Tetra通信系统中采用的ACELP算法,分析了该算法的基本原理,介绍了其算法基于VC++6.0的软件实现过程,重点阐述了ACELP在网络通信中的实现及应用情况。
随着通信技术的快速发展,语音编码技术发展越来越迅速、应用越来越广泛。TETRA(Terrestrial Trunked Radio)集群通信系统是欧洲电信标准协会ETSI制定的数字集群移动通信标准。近几年发展很快,其产品已被包括我国在内的世界多个国家广泛采用。TETRA承载的语音通信业务采用ACELP语音编码算法,该算法是一种改进型的CELP,它继承了传统CELP的主要优点,并克服了其缺点。传统CELP用固定的随机码本来逼近语音信号的余量信号,缺乏灵活性,不能很好地控制码本的频域特性。ACELP采用代数码本结构,不仅降低了码本的存储量和搜索量,还提供了频域控制函数,从而增强了码本的灵活性和多样性,能更好地逼近余量信号,保证了高质量的语音服务。该算法占用带宽较小,其编码速率仅为4.567 kbps,同时编码语音质量高,特别适合多媒体语音通信使用。目前该算法已有许多在嵌入式系统中实现的方案,但由于编译环境以及硬件条件的限制,应用不够灵活方便,因此本文基于Visual C++软件编程技术,采用服务器与客户端网络通信模式,在服务器端采用声卡对语音信号进行实时AD采样,对采样数据进行ACELP语音编码处理,并将编码后数据通过网络实时发送到客户端;在客户端实时接收服务器端发送的语音编码数据并进行软件译码处理,同时将译码后数据采用声卡进行实时播放,从而实现基于ACELP算法的网络语音通信。
1 ACELP语音编译码算法的基本原理
ACELP是一种改进的代数码本激励线性预测算法,该算法要求输入语音信号为8 kHz采样、16比特量化,信号以30 ms分帧,每一帧分为4个子帧,每个子帧7.5 ms,每帧数据编码后为137比特,包括线性预测参数、基音延迟T、最佳码本索引和最佳增益参数。编码器原理框图如图1所示。
图1 ACELP编码原理框图
编码过程主要由短时预测、长时线性预测、码本搜素和增益计算等组成。其中短时预测提取声道滤波器的LPC系数并进行插值和量化;长时线性预测通常分为开环基音分析和闭环基音分析两步,开环基音分析每帧数据(30 ms)处理一次,采用自相关法估算基音周期,按较低基音延迟优先的原则获取基音周期的大致范围,闭环基音分析基于子帧完成,每7.5 ms处理一次,以获取基音周期的准确值;码本搜索和增益计算主要用于计算合适的码本和增益,使重建语音的质量具有更高的清晰度和自然度。
解码过程就是将线性预测参数、基音延迟T、最佳码本索引和最佳增益参数等各个编码参数等从编码比特流中提取出来,重构输出信号和各个滤波器,最后得到重构语音。解码过程以分帧为单位进行。首先将LSP矢量转换为LP滤波器系数,然后通过基音延时查找基音的整数和分数分量,将激励进行解码,对解码后的激励信号通过后基音滤波器送入合成滤波器,得到合成信号。合成信号经过共振峰后滤波器和增益放大单元控制得到语音信号。其ACELP解码原理框图如图2所示。
图2 ACELP解码原理框图
2 ACELP语音编译码算法的软件实现概述
根据ACELP语音编译码算法原理。本文基于VC++6.0软件平台,采用面向对象思想,编制CTetra_ACELP_Cod类和CTetra_ACELP_Dec类分别实现语音信号编、译码。另外,本文采用动态链接库方式对编译码类进行封装,接口简洁,使用方便。
2.1 CTetra_ACELP_Cod编码类
该类为ACELP语音编码类,主要实现对输入该模块的8 kHz采样,16比特量化的语音样点数据流进行编码,类的主要函数定义如下:
其中Init(TETRA_ACELP_COD_PARAM*pCodParam)函数完成编码模块初始化工作,TETRA_ACELP_COD_PARAM结构体参数实时存储编码过程中相关参数。void PreProcess(Word16 signal[],Word16 lg)函数完成待编码语音信号帧的预处理。ACELPCod(Word16 signal[],Word16parm[],TETRA_ACELP_COD_PARAM*pCodParam)函数完成语音编码处理,signal[]参数为待编码的语音样本帧数据,parm[]为编码后参数。Prm2 bi ts(Word16 prm[],Word16 bits[])函数实现编码参数到比特流的转化。
2.2 CTetra_ACELP_Dec编码类
该类为ACELP语音译码类,主要实现对输入该模块编码数据帧(137比特帧长)进行译码处理,输出8KHz采样,16比特量化的语音数据。类的主要函数定义如下:
其中Init(TETRA_ACELP_DEC_PARAM*pDecParam)函数完成译码模块的初始化工作,TETRA_ACELP_DEC_PARAM结构体参数实时存储译码过程中相关参数。Bits2prm(Word16 bits[],Word16 prm[])函数实现137比特帧数据到ACELP编码参数的转化。ACELPDec(Word16 parm[],Word16 synth[],TETRA_ACELP_DEC_PARAM*pDecParam)函数完成编码参数的译码处理。编码参数通过ana数组返回。PostProcess(Word16 signal[],Word16 lg)对合成语音进行后处理工作。
2.3动态链接库封装接口介绍
其中bits为137比特编码比特帧,signal为240*16bits的语音样点数据,pCodParam和pDecParam为编、译码过程中的中间结构体参量。
3 ACELP编译码算法在网络通信中的应用
采用网络服务器、客户端通信模式,将ACELP编译码模块应用到网络语音通信中,最终实现了基于ACELP算法的网络语音通信。具体通信过程为:服务器端采用声卡以8 kHz采样,16比特量化方式对语音信号进行实时采集,对采集到的语音信号每240样点作为一帧送入ACELP编码模块进行压缩编码,压缩后编码数据帧长为137比特,每帧数据进一步封装处理后通过网络实时发送到客户端。客户端通过网络实时接收服务器端编码语音数据包,经ACELP译码处理后实时发送到声卡进行播放处理,从而实现网络语音通信。
3.1语音信号实时采集与播放技术实现
在语音信号实时采集与播放实现过程中,如何实现声卡采集与播放数据的实时性、连续性和可靠性是软件设计的关键所在。在本文软件系统中,通过直接凋用Windows最底层波形音频接口函数,实现声卡的编程控制,系统中采用了多线程多缓冲技术,即在服务器端,声卡采集与语音压缩编码使用不同的工作线程,同时给声卡提供多个用于承载采集数据的缓冲区,在同一时刻部分缓冲区供声卡采集线程装载数据的同时,另外已经装满数据的缓冲区供语音压缩数据处理线程处理,从而使得语音信号采集和压缩编码处理工作同时进行,有效保证了采集数据的连续性和信号处理的实时性。服务器端声卡实时采集原理框图如图3所示。
图3 声卡实时采集原理图
3.2网络通信技术实现
软件系统采用客户/服务器模式和TCP/IP协议,利用Socket套接字编程技术实现数据接收与发送。其中数据接收模块采用VC++的CSo cket类,具体通信过程为:1)程序启动的时候在指定端口创建网络监听套接字,用以监听客户端的连接请求。2)当有客户请求连接时,创建接收套接字与客户端建立连接。3)当有数据需要接收时,CAcceptSocket响应OnReceive消息,调用Receive函数从缓冲里获取客户端传来的数据,实时的交给ACELP译码线程进行译码还原处理。4)当通信结束时,关闭监听套接字和接收套接字并释放资源。数据发送接口采用SOCKET通信技术,为了使系统在实时编码处理的同时及时将编码数据发送到服务器端,软件采用多线程技术;同时为了避免由于待发送数据流不均匀导致的数据帧丢失等情况发生,系统采用了多缓冲机制。主程序编码模块将要发送的编码数据源源不断的向缓冲队列中写,同时发送线程不断的检测缓冲队列中缓冲情况,当有缓冲满时及时进行发送。由于多线程与多缓冲机制的有效使用,使得网络通信能够实时高效的运行。
3.3系统情况介绍
该系统实现了基于ACELP算法的网络语音通信,能够对通信过程中的语音波形样本数据、ACELP编码数据等进行实时存储和网络发送,对通行过程中的波形进行实时显示等。系统运行稳定,延迟较小,语音通信质量较好。图4所示为本文设计的软件系统运行截图。
图4 系统软件运行截图
4结束语
文中研究了TETRA系统采用的ACELP语音编译码算法,在此基础上基于VC++编程技术实现ACELP编、译码软件模块,并采用动态链接库对其进行封装处理,接口简单,使用方便。最后开发相应系统,实现了ACELP编译码算法在网络语音通信中的应用。经实践证明,ACELP算法编码质量高,性能优异,具有较好的应用价值。