摘? 要: 提出了一種集成式IP電話網關的實現方法,分析了語音信號在該網關中的處理過程,詳細介紹了語音采樣、播放、壓縮與解壓縮、RTP包的封裝與解包以及IP包的接受和發送的實現方法。
關鍵詞: IP電話網關? 語音壓縮? RTP協議
?
隨著IP電話技術的飛速發展,IP電話的實現方式正在由PC To PC過渡到Phone to Phone,在Phone to Phone的實現方式中,需要所謂的IP電話網關來連接PSTN和因特網。因此IP電話網關成為目前計算機和通信領域研究的熱點之一。雖然國內外許多廠商都在以不同的方式開發IP電話網關,但他們有一個共同的的特點,即:幾乎所有IP電話網關都采用了自己的專用硬件設備。本文提出了一種采用市場上通用的板卡來構造一種硬件集成式的IP電話網關的方法,并研究了語音數據在該網關的處理過程和實現方法。
集成式IP電話網關的硬件構成如圖1所示,它是在Pentium II PC機的基礎上,插入Dialogic公司的D/41E型語音卡、LSI公司的C6200資源卡和D_Link網卡所組成。其中D/41E語音卡用來完成語音的采樣和播放。C6200資源卡有一塊TI公司的TMS320C6201 DSP芯片,用來完成語音的壓縮和解壓縮以及回聲抵消。Pentium II PC用來實現H.323協議棧的主要功能,網卡用來發送和接受IP包。下面具體分析語音數據在IP電話網關的處理過程和實現方法。
?
?
1 語音采樣和播放
在該IP電話網關中,語音的采樣和播放是由Dialogic公司的D/41E型語音卡來完成,其中,語音采樣是利用語音卡所提供的錄音函數來完成的。在實時語音通信時,語音數據存入語音采樣緩沖區中,等待語音壓縮線程取出并處理。錄音函數形式如下:
dx_reciottdata(activeChdev,&chinfo[activeChdev].iott,&tptrec[0],&xpbVox,mode);??????????????????
該函數的輸入參數的含義如下:
int chdev? ??????????? ????? 語音通道的設備句柄
DX_IOTT *iott? ??????? ? 指向語音數據目的地的指針
DV_TPT *tptp? ?? ??????????? 指向終止參數塊的指針
DX_XPB *xpbp?? ????????????? 指向I/O傳輸塊的指針
unsigned short mode? ??????? 錄音所采取的方式
iott是一種DX_IOTT類型的數據結構,該數據結構中的io_type可取值IO_DEV和IO_MEM,分別用于指定語音數據是存入文件還是存入緩沖區中。io_type的另一類取值可為IO_CONT,IO_LINK或 DX_IOTT,用于指定語音數據目的地的結構。如果io_type取值IO_DEV,則io_fhandle的值應為一個文件的句柄;如果io_type取值IO_MEM,則io_fhandle的值應為0,此時,io_bufp指向存放語音數據的緩沖區的起始地址。io_offset為地址偏移量。io_length用于指定文件或緩沖區的大小。如果io_type取值IO_LINK,則io_nextp指向下一個存放語音數據的DX_IOTT數據結構,而io_prevp指向上一個存放語音數據的DX_IOTT數據結構。DX_IOTT的數據結構定義如下:
typedef struct dx_iott {
unsigned short io_type;??????????? ?? /*Transfer type*/
unsigned short rfu;? ??? ??? /*Reserved*/
int???? io_fhandle;??? ??? /*File descriptor*/
char*? io_bufp;??? ?? /*Pointer to base memory*/
unsigned long io_offset;?? ? ????? /*File/Buffer offset*/
long int io_length;? ??????? /*Length of data*/
DX_IOTT *io_nextp;??? ? ?????? /*Ptr to next DX_IOTT if IO_LINK set*/
DX_IOTT *io_prevp;? ?? ? /*(Optional) Ptr to previous DX_IOTT*/
} DX_IOTT;
DV_TPT數據結構用于指定終止某語音通道上函數的條件。具體如下:
typedef struct DV_TPT {
unsigned short? tp_type;?? ????? ???? /*Flags describing this structure*/
unsigned short tp_termno; /*Termination parameter number */
unsigned short tp_length; ? /*Length of terminator*/
unsigned short tp_flags;??????? ????? /*Term.parameter attributes flag*/
unsigned short tp_data; ?? ?? /*Optional additional data*/
unsigned short rfu;? ??????????????? /*Reserved for future use*/
struct DV_TPT *tp_nextp; /*Pointer to next term.parameter if*/
?????????????????????????????????????????? /*IO_LINK is set*/
} DV_TPT;
DX_XPB數據結構用于指定用何種算法進行錄音等。WFileFormat可取值FILE_FORMAT_VOX和FILE_FORMAT_WAVE,分別代表用VOX文件格式和WAV文件格式存放語音數據。wDataFormat可取值DATA_FORMAT_DIALOGIC_ADPCM、DATA_FORMAT_MULAW、DATA_FORMAT_ALAW、DATA_FORMAT_PCM,分別代表用ADPCM、μ率、A率或線性PCM的算法對聲音進行采樣。nSamplesPerSec可取值DRT_6kHz、DRT_8kHz、DRT_11kHz,用于指定采樣頻率分別為6kHz、8kHz或11kHz。nBitsPerSample可取值4和8,為每個樣本點的位數。如果wDataFormat采用ADPCM算法,則nBitsPerSample只能取4。DX_XPB的數據結構定義如下:
typedef struct {
? USHORT?? wFileFormat;??? ????? //file format
? USHORT?? wDataFormat;?? ????? //audio data format
? ULONG?? nSamplesPerSec;? ???? //sampling rate
? ULONG?? nBitsPerSample;? ????? //bits per sample
} DX_XPB;
mode用于指定錄音的方式,可取值PM_TONE、EV_SYNCH或EV_ASYNCH。取值PM_TONE代表在錄制前先播放一個200ms的提示音。取值為EV_SYNCH時,代表用同步的方式執行語音采樣,在同一線程中的其它功能將被暫時掛起,直到該同步函數執行完后才被釋放。取值為EV_ASYNCH代表是用異步的方式執行語音采樣,在同一線程中的其它功能仍可照常進行。
語音播放是利用語音卡播放函數來完成的。該函數所用的參數與錄音函數的參數類似。播放函數的形式如下:
????dx_playiottdata(activeChdev,&chinfo[activeChdev].iott,&tptplay[0],&xpbVox,mode)
2 電話狀況偵測
電話狀況偵測功能主要是判斷電話線狀況,如判斷現在電話機話筒是拿起或放下,有沒有撥號音,是否電話正忙或沒有人接電話。在異步方式下,采用語音卡的ATDX_CPTERM()來檢測某語音通道上電話呼叫的返回值。在同步方式下無需該步驟。當返回值為CR_CEPT時,表示特殊通知音,即撥了無效的電話號碼或遇到了其它特殊問題。當返回值為CR_NORB時,表示無回鈴音,即檢測不到可識別的信號模式。當返回值為CR_NOANS時,表示無應答,即線已撥通,但無應答。當返回值為CR_CNCT時,表示連接音。當返回值為CR_BUSY時,表示忙音。當返回值為CR_CNCT時,還可利用ATDX_CONNTYPE(chdev)函數檢測連接音的類型。返回值可能是CON_CAD,CON_LPC,CON_PVD或CON_PAMD,分別代表韻律連接音,循環流連接音,陽極音連接音或陽極應答機連接音。
進行呼叫時,先用ATDX_HOOKST(activeChdev)函數獲取電話機的狀態。如果是掛機狀態,則用dx_sethook(activeChdev,DX_OFFHOOK,EV_SYNC)將電話機置為摘機狀態。然后給呼叫函數傳遞所需的參數。參數是通過DX_CAP這個數據結構來傳遞的,其定義為:
typedef struct DX_CAP {
unsigned short ca_nbrdna;? ? //# of rings before no answer.
unsigned short ca_stdely;?? ???? ? //Delay after dial before analysis
unsigned short ca_cnosig;??? //Duration of no signal time out delay
unsigned short ca_lcdly;??? ? //Delay after dial before lc drop connect
unsigned short ca_lcdly1;??? //Delay after lc drop?con. before msg.
unsigned short ca_hedge;???? //Edge of answer to?send connect message
unsigned short ca_cnosil;? //Initial continuous noise timeout delay
unsigned short ca_lo1tola;?? //% acceptable pos.dev?of short low sig.
unsigned short ca_lo1tolb; //% acceptable neg.dev of short low sig.
unsigned short ca_lo2tola;?? //% acceptable pos.dev of long low sig.
unsigned short ca_lo2tolb;?? //% acceptable neg.dev of long low sig.
unsigned short ca_hi1tola;? ??//% acceptable pos.dev of high signal.
unsigned short ca_hi1tolb;???? //% acceptable neg.dev of high signal
unsigned short ca_lo1bmax;?? //Maximum interval?for shrt low for busy.
unsigned short ca_lo2bmax;? //Maximum interval for long low for busy.
unsigned short ca_hi1bmax;?? //Maximum interval for 1st high for busy
??? unsigned short ca_nsbusy;????????? //Num. of highs after nbrdna busy check.
??? unsigned short ca_logltch;???????? //Silence deglitch duration.
????unsigned short ca_higltch;???????? //Non-silence deglitch duration.
??? unsigned short ca_lo1rmax;???????? //Max. short low dur. of double ring
??? } DX_CAP;
該數據結構中有大量的參數項,一般使用缺省值即可。需要修改時,可通過程序提供的呼叫對話框來修改。呼叫的電話號碼也在該對話框中指定。
3 語音數據壓縮與解壓縮
G.723.1、G.729均為ITU H.323所推薦的語音編碼標準。其中G.723.1采用ACELP和MP_MLQ算法,比特率為6.3kbps和5.3kbps。G.729采用CS_ACELP算法,比特率為8kbps。由于G.723.1無論是在帶寬還是語音質量都優于G.729,因此,一般在IP電話中普遍使用G.723.1語音壓縮標準。
在集成式IP電話網關中,語音的壓縮是由C6200資源卡上的TMS320C6201 DSP來完成。G.723.1編碼器的輸入信號是8kHz的16位線性PCM碼,由語音卡采樣的語音信號包括8kHz的8位線性PCM碼在內的多種形式,在輸入到G.723.1編碼器之前,需要進行轉換。相應地,解碼器的輸出語音信號也應轉化為語音卡能識別的格式數據流。Dialog D/4E語音卡只識別ADPCM碼,其它高級一些的語音卡如D/41ESC語音卡既可識別ADPCM碼,也能識別線性PCM碼。編碼器每30ms處理一幀數據,每幀包含240個樣本點,每個樣本點占16位。G.723.1編碼/解碼器的處理流程大致過程如下:
每一幀首先通過高通濾波器,去除直流成分,然后被分為4個子幀,每個子幀包括60個采樣點。每個子幀被送入一個10階線性預測編碼器,計算LPC系數。最后一個子幀的LPC系數采用預測分裂矢量量化器(PSVQ)量化。量化前的LPC系數用來建立短時感覺加權濾波器,整幀信號通過它得到感覺加權語音信號。對于每兩個子幀,用感覺加權后的語音信號來計算開環基音周期,基音周期的搜索范圍在18和145之間。對于每一個子幀,運用估計的基音周期建立諧波噪聲成形濾波器(Harmonic Noise Shaping filter)。LPC合成濾波器、共振峰感覺加權濾波器和諧波噪聲成形濾波器組成一個聯合濾波器,然后可以得到該濾波器的沖激響應。運用基音周期估計和沖激響應計算閉環基音周期。采用五階基音預測器,以開環基音周期為中心,作小范圍內閉環搜索,得到精確的基音周期,然后將基音預測器的貢獻從初始的目標矢量中扣除。最后,進行非周期性的激勵信號的估計。對于高碼率6.3kbps,采用多脈沖最大似然量化激勵(MP_MLQ);對于低碼率5.3 kbps,采用代數碼本激勵(ACELP)。
4 RTP包的形成與解包
RTP包的形成與解包是由網關中的主CPU(Pentium Ⅱ)來完成。RTP是IEFT的提議標準RFC1890。它是一個獨立于應用程序的協議規范,在具體應用中可有不同的獨立框架。每個RTP數據包都由一個頭部和一個有效數據部組成。有效數據部中放置壓縮后的語音數據。RTP包頭的前12個字節是固定的,其格式如圖2所示。
?
?
在RTP包頭中,標記M占有1比特位,用來指明語音數據的邊界。PT占7比特位,指明語音數據的壓縮類型。Sequence number占16比特位,是一個正整數的序列號。每發送一個RTP數據包,序列號就加1。接收端可通過序列號監測數據包傳輸過程中的丟包情況以及失序情況。序列號的初始值是隨機分配的。Timestamp是時間戳,占32比特位,描述RTP包中語音數據的采樣時刻,主要用于同步和計算時延。Synchronization source identifier是同步資源標識符SSRC,占32比特位,用于標識同步資源。RTP打包過程如圖3所示。
?
?
如果是第一次生成RTP包,則序列號的初值為一隨機數而不是0。這樣做的目的是為了通信過程中的安全性。SSRC標識符是一個32位的隨機數。在一個RTP會話中,不允許兩個SSRC有相同的值。RTP解包過程是RTP打包過程的逆過程,在此不再贅述。
5 IP包的發送與接收
利用H.323協議棧軟件包可以生成符合H.323協議的API函數。在程序中,先執行 mcInitialize()和mcSetEventHandler()建立H.245控制信道,然后執行mcOpenCall() 函數以建立H.225.0呼叫信令信道。在mcOpenCall()函數的參數中可以設置所選的音頻編解碼協議。所選的音頻編解碼協議包括G.711協議(必選) 、G.722、G.723.1、G.728或G.729協議。當H.245控制信道和H.225.0呼叫信令信道成功建立后,使用mcSendAudio()函數發送包含壓縮語音數據的IP包。當通話結束后,使用mcCloseCall()函數關閉H.225.0呼叫信令信道和H.245控制信道。
本文提出的集成式IP電話網關具有硬件結構簡單、維護方便、升級容易等優點,并具有很高的性能價格比,更有價值的是拓寬了設計IP電話網關的設計思想。另外,本文還詳細地給出了語音在網關中的各個階段的處理過程和實現方法,其中有關語音壓縮和回聲抵消的處理,是網關中語音的關鍵技術,涉及到網關的DSP的運行效率、壓縮算法的優化、語音質量的提高和噪聲的消除等技術問題。
?
參考文獻
1 Dialogic, Standard Runtime Library Programmer's Guide for Windows NT. Dialogic Corporation,1997
2 Heffes H,Lucanoni D.A. Markov modulation characterization of packetized voice and data traffic and related?statistical multiplexer analysis[J].IEEE JSAC, 1986;4(6):856~868
3 H.Schulzrinne, S.Casner, R.Frederick, V.Jacobson.?RTP-A Transport Protocol for Real-Time Applications. Internet Draft, draft-ietf-avt-rtp-new-ps, Internet Engineering Task Force, Dec.,1997
4 H.Schulzrinne. RTP Profile for Audio and Video Conferences with Minimal Control. Internet Draft, draft-
ietf-avt-profile-new-01.ps, Internet Engineering Task?Force, Jan.,1998