基于操作系统和VoIP网关实现网络语音处理平台的软硬件设计

电子说

1.3w人已加入

描述

采用IP网络进行语音通信是一种廉价且方便的通信方式。其目前的技术已经为用户间的通信提供清晰、稳定、低延时的话音质量,同时支持语音、数据、图像的传输和其他多媒体业务。特别对于许多大中型企业来说,由于在各省或不同国家设有机构,每月都会产生巨额的国际、国内长话通信费用,同时由于信息保密的要求,企业往往需要自己构建类似VPN这样的IP通话网络以降低通信成本。这样机构内部会先建立一个自己的电话网络,同时以VPN或其他方式通过IP网连接出去。整个系统可以有效降低企业的运营成本,提高工作的效率。本文所述的网络语音处理平台就是建立在此种方案上,主要通过VoIP网关+模拟话机的方式来实现。其中VoIP网关的主要功能是进行信令处理、以ITU-T提出的H.323协议或IETF提出的SIP协议通信、语音编解码处理等。

1 结构体系介绍

网络语音处理平台的基本工作原理是先将模拟语音信号转为数字信号,再对输入的语音数据编码进行压缩处理,然后在H.323或SIP协议框架的基础上,把这些语音数据分组打包,经过IP网络把数据包送至接收端,接收端再把这些语音数据包串起来,经过解压处理后,恢复成原来的语音信号,从而达到由互联网传送语音的目的。本文将分硬件和软件两部分来讲述网络语音平台的构建。

1.1 硬件部分

整个硬件部分如图1所示。

嵌入式

整个系统包括语音处理部分和网络数据处理两部分,其中语音处理部分又分为FXO和FXS接口电路。FXO接口用于连接PSTN,可模拟电话功能,提供环路关闭功能并检测来话振铃。FXS用于连接POT普通电话机,模拟电话局端交换的功能。

在VoIP网关中,FXS电路是在分组网络上建立去话呼叫与接收来话呼叫的基本接口。在用户端(CPE)应用中,FXS电路存在于网关中,可提供拨号音、电池电流与振铃电压的功能,并检测来自电话的环路关闭。由于该交换功能处于CPE级,因此不必与PSTN建立直接连接。FXS电路包括CODEC与SLIC(用户线路接口电路)两部分。CODEC由ADC与DAC构成。ADC将来自模拟电话的模拟信号转换为可通过VoIP网络传输的数字信号。DAC将数字信号转换为模拟电平,以驱动模拟电话。为了实现4kHz的音频带宽,ADC的采样速率通常约为8kHz。SLIC部分则模拟PSTN电压电平,通过用户线向共电式话机直流馈电,检测电话挂机还是摘机,并生成高达120V的振铃电压,同时提供过压保护(Overvoltage Protection)功能,以防止用户线上的电压冲击或过压而损坏设备。

SLIC芯片采用LEGERITY的LE7947C,在控制器的控制下能模仿电话局局端功能,能对馈电电流进行控制,并提供挂机传输功能,如在电话线路处在On-Hook状态(被呼叫方没摘机时)提供振铃信号。监视用户线通断状态,以检测话机的摘机、挂机、拨号脉冲等用户线信号,转送给控制设备,以表示用户的忙闲状态和接续要求。SLIC芯片控制的方式如表1所示。这些控制信号接到了IXP421的GPIO上,这样由IXP421发出控制信号。控制结果通过引脚的电平值来表示。

嵌入式

其中开路是指当线路出现故障时,模块在内部将TIP和RING线断开。激活是指模块收到摘机信号后(无论作为主叫还是振铃时),首先使模块重新激活,然后开始通话。通话结束后又设为待机状态。如需挂机传输功能,需在振铃1秒(状态值为1)后,将状态值设为3(即011),持续时间为4秒,在此期间模块可向话机传送呼叫方ID等信号。待机是指模块等待主叫摘机或作为被叫振铃等事件发生。

CODEC芯片采用LEGERITY的T8503。它是A-律/μ-律的PCM编码器,含有A/D和D/A单元,实现声音的数字化和重组,并能实现增益控制。CODEC芯片具有两个通道,每个通道均含有一个针对语音编码或解码的滤波器。两个通道的PCM数据通过PCM同步接口进行接收和发送,并由一对FSXn和FSRn控制两个通道的帧同步,确保在每个通话时隙进行数据传输。

FXO电路部分包括CODEC与数据存取装置(DAA)。将模拟语音转换为数字信号,随后再转换回来,同时负责数据的传输。DAA模拟(POTS)电话功能,其重要作用是去除高电压直流偏置,将PSTN环路关闭,从而仅传送来自PSTN的模拟交流信号。并具有极性保护电路,保证电话机与外线连接时能取得极性正确的直流工作电压。

FXO部分电路主要采用SILICON LABS公司的SI3016和SI3021。SI3016为一个DAA电路,能为线路上的信号提供光电隔离和2/4线转换功能,以满足编解码与数字交换对四线传输的要求。并且能够实现对线路上的振铃信号、呼叫方ID和极性反转检测等功能。SI3021一方面提供直接连接DSP的通信接口,另一方面也提供控制接口。电路可工作于On-Hook(电话线可供使用)和Off-Hook(电话线忙碌)这两种状态下,通过设定SI3021的

嵌入式

引脚电平的高低来控制:

嵌入式

为高表示处于On-Hook状态,可以接收或发起一个呼叫;

嵌入式

为低表示处于Off-Hook状态,电话线忙碌。当线路上有振铃信号时通过

嵌入式

引脚表示。并可以通过配置M1和M0脚来选定串行数据接口的工作模式。整个平台还配有CPLD电路,是为了控制各个电话接口,并协调各端口间的通信。

主处理器IXP421是INTEL公司IXP42x系列的网络处理器,它在VoIP应用方面具有自己的特点。如提供了两个高速同步串口HSS, 同时含有高速网络处理引擎NPE,在Xscale的配合下它可以实现DSP等高级数据处理的应用。并配有基于Xscale的DSP软件库,支持2~4路语音信号的处理。在网络处理方面,IXP421集成有10~100兆MAC,通过MII/RMII接口连接通用PHY芯片,并连至IP网络。

1.2 软件部分

软件可从功能上或驱动模块上划分,下面将从以上两个方面进行分析。

1.2.1 软件功能模块

从功能上可划分如图2所示的模块结构。

嵌入式

其中DSR模块是IXP421进行底层语音数据处理的模块,它主要采用由INTEL提供的DSR(DSP software release)软件库。一方面,它与上层应用程序进行通信,传递数据或响应来自上层的控制消息。另一方面,它与底层接口进行通信与控制。

编码部分负责进行编码和对从HSS到IP接口的数据分组打包,提供对G.711等音频标准的支持,并提供有增益控制功能的自动等级控制ALC单元和区分背景噪声的VAD功能。并将多个语音帧合并成一个IP分组包。对语音包以特定的帧长进行压缩编码,压缩后的语音包送入网络处理单元。网络处理单元为语音添加包头、时标和其他信息后,把数据放在可变长的数据报或分组中,然后给每个数据报附带寻址和控制信息,并通过网络发送到目的地。

相对于解码部分负责把从IP网络接收的语音分组包进行打包并转成语音数据流发送至HSS接口。类似于编码部分,解码部分也包含G.711和G.729数据处理和ALC处理单元。不同的是其包含产生适当背景噪声的CNG单元、消除由于网络丢包而造成语音信息不完整问题的PLC单元和控制从IP网络到HSS接口数据传输节奏的JitterBuffer单元。

电话信号音监测模块负责监控300~3500Hz的电话信号音,如DTMF信号等。主要是采用快速傅立叶算法FFT来进行分析和判断。电话信号音产生模块则负责产生相应的电话信号音。而网络节点是连接HSS端口与编解码等部分的程序模块,它把需要从HSS端口发送的数据放入HSS发送缓冲区,或把需要从HSS端口接收的数据放入HSS接收缓冲区内。

1.2.2 状态机的结构

为了模拟通常状态下的电话机工作流程,需要相应地建立几种不同的状态,并实现不同状态的转换。一般通话双方有空闲、拨号、发送信令、回应、建立连接和断开连接等状态,故可以定义如下几个状态值:call_idel、call_dial、call_cancel、call_invite、call_ack、call_connect、call_bye等。例如用户摘机事件发生后会有中断产生,若该路终端目前的状态为call_ack时,表明该终端用户为被动接收者,且已接收到invite信令并等待用户摘机。故此时状态转为call_connect并进行相关处理。而当该路终端目前的状态不为call_ack时,表明该终端用户为主动呼叫者,准备拨号拨打电话。此时状态转为call_dial,话筒中产生等待音,DSR模块开始等待用户拨号。当用户结束拨号后状态转为call_invite并进行相关处理。大致流程如图3所示。

嵌入式

为了保证状态机能在不同的状态之间转换和方便控制管理各路话音通话的信息。还需要建立一些全局数据结构:

嵌入式

用于保存当前网关中各路话音的配置参数,num表示该路通话的本地号码和对端号码,addr表示该路通话对应在DSR内所使用的本地和远端网络地址,status记录本地终端在该通话中处于状态机中的状态。设备在加电启动后,需要按步骤进行一系列的初始化工作。包括一些记录状态信息的全局变量,初始化SLIC接口、DSR模块、网络接口、信令处理模块并开启所需的监控线程,等待控制状态的变化。

1.2.3 软件驱动模块

因为网络语音底层平台使用嵌入式Linux做为其操作系统,故需要划分如图4所示的几个模块并写出相应的驱动。

嵌入式

以内核态运行的程序主要包括SLIC控制模块、DSR控制模块及接口和DSR数据模块这三部分,它们基本完成了底层所需的功能要求。用户态的程序都是运行在其上,对其进行管理控制,以实现上层的应用。

(1)SLIC控制模块

由于整个平台包含有FXS和FXO接口,故SLIC控制模块也可以相应地分为两部分。

对于FXS接口程序部分,其主要是模拟PSTN局端功能,对提供拨号音、电池电流与振铃电压和检测来自电话的环路关闭进行相应地控制。当有控制信息需要输出时,驱动程序通过向SLIC芯片的C1、C2和C3管脚写入相应的电平,实现对SLIC的控制(具体数值可参看表1)。可以根据SLIC所处的状态进行划分,设置如下四种状态:fxs_ring,fxs_take,fxs_onhook,fxs_offhook。当其处在fxs_ring状态下就可以为FXS接口提供拨号音、振铃等信号;当其处在fxs_take状态下表明用户刚刚摘机;当其处在fxs_offhook状态下表明该终端用户为主动呼叫者,需要处理摘机以后的操作;当其处在fxs_onhook状态下表明用户挂机。

相应的,当SLIC有中断输入时,中断处理程序会根据当前的状态来判断。如果确定是用户进行了摘机或挂机操作后,查询最后一次硬中断后该路SLIC的

嵌入式

电平,为0则处于摘机状态,否则处于挂机状态。这里中断的处理较为重要。其内容包括:中断源是由哪个FXS端口发出的,并根据所处的状态来开启相应状态下的定时器,以保证状态变化间的时间间隔。

对于FXO接口程序部分,其主要是模拟电话机的功能,所以功能相对要简单些。在程序中主要设定有fxo_ring、fxo_onhook和fxo_offhook这三个状态。当其处在fxo_offhook状态下表明用户摘机。当其处在fxo_onhook状态下驱动程序就把DAA芯片的

嵌入式

引脚拉高,表明用户挂机。相应的,当有控制信息需要输入时,其检测DAA芯片的

嵌入式

引脚来进行判断,这里同样要启动相应的定时器,来判断回路上是否有振铃电平或何时回路上振铃信号结束等信息。当程序判断处在fxo_ring状态下,则表明线路上有振铃信号并做相关处理。

(2)DSR控制模块及接口

DSR控制模块及接口主要实现用户对串行语音数据通信接口HSS以及底层引擎NPE的控制。既与来自上层应用程序进行信息交互,又为上层应用程序和SLIC硬件之间提供控制接口。与一般的设备驱动一样,主要包括DSR_open()、DSR_close()、DSR_read()、DSR_write()和DSR_ioctl()这些函数。其中DSR_read()和DSR_write()主要负责从DSR读取消息和向DSR写入消息。DSR_ioctl()主要负责控制DSR的相关配置参数读入与读出和传递SLIC控制信息给底层的SLIC控制模块。参数包括根据当前所处状态判断后所得出的C1、C2和C3管脚写入相应的电平值、查询当前SLIC的工作状态信息、SLIC振铃信号的产生和停止等。DSR的相关配置参数包括DSR中DSP通道数目、通道编码器的类型、编解码器输出语音数据帧的大小等。

(3)DSR数据模块

DSR数据模块主要实现话音数据在内核与用户态之间的交互。包括从内核中读取数据,向内核中发送数据。为了有效把握数据传输节奏,需要建立一种内部缓存机制。包括从DSR读取到数据缓存后发送给用户态的应用程序和用户态的应用程序向DSR发送数据的缓存。缓存内的数据查询也是每隔一段时间后再进行的。但注意缓存不应开的过大,以免通话延时的加大。为了消除由于网络丢包而造成语音信息不完整的问题,DSR数据模块也建立了相应的机制来控制。

用户的应用程序主要运行在用户态,针对DSR模块和网络上收发的语音数据和控制信令进行处理操作。以编程实现直接内向呼叫、呼叫转移网络、呼叫等待和三方呼叫等功能。对于底层通话平台来说,主要关心的是处理电话和IP网络间的衔接问题,这需要做好如下几个接口:DSR控制接口、DSR数据接口和网络接口,以实现语音数据收发、通话信令收发和DSR控制消息收发的管理。

网络接口模块用来接受网络上传递进来的数据,做出相关处理后将压缩的语音数据通过DSR数据接口传递给内核处理,同时也负责将从DSR数据接口传递来的压缩后的语音数据发送到网络上。如果从网络上传递进来的数据是通话信令,则在做出相关处理后将具体的控制信息通过DSR控制接口发送给内核,或者根据底层操作的内容把相应的信令信息通过网络接口发送到网络上。例如,对DSR的相关控制消息包括打开与关闭DSR编解码功能、打开与关闭在向电话输出的电话信令音和开启与关闭检测用户键盘拨号等功能。

2 测试

为了保证当前系统能正确工作,需要对其底层功能进行测试。因为编码压缩的语音数据由实时传送协议RTP负责传递,故主要采用用户数据UDP包的形式接收与发送。出于这个角度考虑,可以实现将电话手柄的MIC采集的声音返回至同一电话手柄的听筒内。首先编写一个小程序来实现将话筒收集的语音数据发送至网络上,同时接受来自网络的数据并还原成模拟话音。假设网络上有一台IP地址为192.168.0.1的主机。其运行一个UDP数据包环回程序负责将网上接收到的UDP数据包转发回源发送端。开始测试前,先设定一些必要的控制信息,如对方IP地址和语音编解码方式等。将网线和话筒线连至网口和RJ11接口,拨通IP地址为192.168.0.1主机的电话,看看电话手柄的听筒内将能够听到话筒MIC所收集的话音。如果话音正确,则表明底层的功能已实现。

基于IXP421的网络语音平台方案实现了底层的相关功能,而上层的应用较为灵活,且有很强的扩展性,例如实现VPN功能及多媒体业务,还需要开发相应的软件,本文并未涉及到。随着网络语音相关技术的逐步走向成熟,相信会有越来越多的人因之受益。

责任编辑:gt

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分