基于嵌入式Linux的網(wǎng)絡(luò )語(yǔ)音平臺的設計與構建
FXO部分電路主要采用SILICON LABS公司的SI3016和SI3021。SI3016為一個(gè)DAA電路,能為線(xiàn)路上的信號提供光電隔離和2/4線(xiàn)轉換功能,以滿(mǎn)足編解碼與數字交換對四線(xiàn)傳輸的要求。并且能夠實(shí)現對線(xiàn)路上的振鈴信號、呼叫方ID和極性反轉檢測等功能。SI3021一方面提供直接連接DSP的通信接口,另一方面也提供控制接口。電路可工作于On-Hook(電話(huà)線(xiàn)可供使用)和Off-Hook(電話(huà)線(xiàn)忙碌)這兩種狀態(tài)下,通過(guò)設定SI3021的




主處理器IXP421是INTEL公司IXP42x系列的網(wǎng)絡(luò )處理器,它在VoIP應用方面具有自己的特點(diǎn)。如提供了兩個(gè)高速同步串口HSS, 同時(shí)含有高速網(wǎng)絡(luò )處理引擎NPE,在Xscale的配合下它可以實(shí)現DSP等高級數據處理的應用。并配有基于Xscale的DSP軟件庫,支持2~4路語(yǔ)音信號的處理。在網(wǎng)絡(luò )處理方面,IXP421集成有10~100兆MAC,通過(guò)MII/RMII接口連接通用PHY芯片,并連至IP網(wǎng)絡(luò )。
1.2 軟件部分
軟件可從功能上或驅動(dòng)模塊上劃分,下面將從以上兩個(gè)方面進(jìn)行分析。
1.2.1 軟件功能模塊
從功能上可劃分如圖2所示的模塊結構。

其中DSR模塊是IXP421進(jìn)行底層語(yǔ)音數據處理的模塊,它主要采用由INTEL提供的DSR(DSP software release)軟件庫。一方面,它與上層應用程序進(jìn)行通信,傳遞數據或響應來(lái)自上層的控制消息。另一方面,它與底層接口進(jìn)行通信與控制。
編碼部分負責進(jìn)行編碼和對從HSS到IP接口的數據分組打包,提供對G.711等音頻標準的支持,并提供有增益控制功能的自動(dòng)等級控制ALC單元和區分背景噪聲的VAD功能。并將多個(gè)語(yǔ)音幀合并成一個(gè)IP分組包。對語(yǔ)音包以特定的幀長(cháng)進(jìn)行壓縮編碼,壓縮后的語(yǔ)音包送入網(wǎng)絡(luò )處理單元。網(wǎng)絡(luò )處理單元為語(yǔ)音添加包頭、時(shí)標和其他信息后,把數據放在可變長(cháng)的數據報或分組中,然后給每個(gè)數據報附帶尋址和控制信息,并通過(guò)網(wǎng)絡(luò )發(fā)送到目的地。
相對于解碼部分負責把從IP網(wǎng)絡(luò )接收的語(yǔ)音分組包進(jìn)行打包并轉成語(yǔ)音數據流發(fā)送至HSS接口。類(lèi)似于編碼部分,解碼部分也包含G.711和G.729數據處理和ALC處理單元。不同的是其包含產(chǎn)生適當背景噪聲的CNG單元、消除由于網(wǎng)絡(luò )丟包而造成語(yǔ)音信息不完整問(wèn)題的PLC單元和控制從IP網(wǎng)絡(luò )到HSS接口數據傳輸節奏的JitterBuffer單元。
電話(huà)信號音監測模塊負責監控300~3500Hz的電話(huà)信號音,如DTMF信號等。主要是采用快速傅立葉算法FFT來(lái)進(jìn)行分析和判斷。電話(huà)信號音產(chǎn)生模塊則負責產(chǎn)生相應的電話(huà)信號音。而網(wǎng)絡(luò )節點(diǎn)是連接HSS端口與編解碼等部分的程序模塊,它把需要從HSS端口發(fā)送的數據放入HSS發(fā)送緩沖區,或把需要從HSS端口接收的數據放入HSS接收緩沖區內。
1.2.2 狀態(tài)機的結構
為了模擬通常狀態(tài)下的電話(huà)機工作流程,需要相應地建立幾種不同的狀態(tài),并實(shí)現不同狀態(tài)的轉換。一般通話(huà)雙方有空閑、撥號、發(fā)送信令、回應、建立連接和斷開(kāi)連接等狀態(tài),故可以定義如下幾個(gè)狀態(tài)值:call_idel、call_dial、call_cancel、call_invite、call_ack、call_connect、call_bye等。例如用戶(hù)摘機事件發(fā)生后會(huì )有中斷產(chǎn)生,若該路終端目前的狀態(tài)為call_ack時(shí),表明該終端用戶(hù)為被動(dòng)接收者,且已接收到invite信令并等待用戶(hù)摘機。故此時(shí)狀態(tài)轉為call_connect并進(jìn)行相關(guān)處理。而當該路終端目前的狀態(tài)不為call_ack時(shí),表明該終端用戶(hù)為主動(dòng)呼叫者,準備撥號撥打電話(huà)。此時(shí)狀態(tài)轉為call_dial,話(huà)筒中產(chǎn)生等待音,DSR模塊開(kāi)始等待用戶(hù)撥號。當用戶(hù)結束撥號后狀態(tài)轉為call_invite并進(jìn)行相關(guān)處理。大致流程如圖3所示。
為了保證狀態(tài)機能在不同的狀態(tài)之間轉換和方便控制管理各路話(huà)音通話(huà)的信息。還需要建立一些全局數據結構:
struct call_params{
unsigned char local_num;
unsigned char remote_num;
unsigned char local_addr;
unsigned char remote_addr;
unsigned char status;
};
用于保存當前網(wǎng)關(guān)中各路話(huà)音的配置參數,num表示該路通話(huà)的本地號碼和對端號碼,addr表示該路通話(huà)對應在DSR內所使用的本地和遠端網(wǎng)絡(luò )地址,status記錄本地終端在該通話(huà)中處于狀態(tài)機中的狀態(tài)。設備在加電啟動(dòng)后,需要按步驟進(jìn)行一系列的初始化工作。包括一些記錄狀態(tài)信息的全局變量,初始化SLIC接口、DSR模塊、網(wǎng)絡(luò )接口、信令處理模塊并開(kāi)啟所需的監控線(xiàn)程,等待控制狀態(tài)的變化。
1.2.3 軟件驅動(dòng)模塊
因為網(wǎng)絡(luò )語(yǔ)音底層平臺使用嵌入式LINUX做為其操作系統,故需要劃分如圖4所示的幾個(gè)模塊并寫(xiě)出相應的驅動(dòng)。
linux相關(guān)文章:linux教程
評論