摘 要: 綜合Ad-Hoc網絡技術、多媒體開發技術、嵌入式技術和RTP實時傳輸技術,設計實現了一套在嵌入式Ad-Hoc網絡環境下的全雙工實時語音通信系統。語音編碼、抖動處理、靜音檢測有效地提高了系統的語音傳輸質量。實驗表明,該系統性能穩定,適應性強,有較廣泛的應用。
關鍵詞: 嵌入式;Ad-Hoc;語音通信;RTP
無線自組織網絡(Ad-Hoc)最早起源于20世紀70年代美國國防部高級研究署(DARPA)資助的分組無線網絡PRNET(Packet Radio Network),其最初的動機之一是滿足戰場生存的軍事需求。Ad-Hoc是一種無中心、自組織、對等式、節點可移動和多跳路由的移動通信網絡,這種網絡結構不需要中心節點,具有良好的自組織能力、抗毀性能、機動性和魯棒性[1-2]。無線自組織網絡主要應用在軍事、民用、治安、救災等復雜而環境惡劣的場所中。在這些惡劣環境中,沒有鋪設通信基礎設施或者通信設施遭到了破壞,迫切需求Ad-Hoc網絡的投產使用。而實時語音通信作為人與人之間一種最直接的溝通手段,應用在軍事、治安、救災等領域是必然的需求。本文正是基于這種需求,設計并實現了一套在嵌入式Ad-Hoc網絡環境下的實時語音通信系統。本設計涉及Ad-Hoc網絡、Linux無線網卡驅動、實時流媒體傳輸等技術。首先,Ad-Hoc網絡采用了按需路由中的AODV協議[3-4]來搭建實驗的網絡環境,在嵌入式平臺(MagicARM2410)上進行了USB無線網卡驅動RT73的移植,對網絡節點的分布做了合理的布局和連通性測試;其次,結合多媒體編程技術和流媒體實時傳輸技術[5],實現了語音采集和實時通信,對語音通信質量做了分析和改善。與傳統的語音通信比較,本系統具有獨特的優勢:不需要鋪設基礎通信設施,無中心,自組織,可移動,多跳全雙工語音通信,可以應用在治安、礦井、救災等領域。
1 整體方案設計
本語音通信系統的移動終端是由廣州致遠電子有限公司開發的教學實驗開發平臺MagicARM2410,該實驗平臺采用ARM920T內核的S3C2410A微處理器,工作頻率高達203 MHz,擴展有充足的存儲資源,具有I2S數字音頻接口和8英寸真彩TFT液晶屏,滿足系統的需求。網卡選用的是華碩的USB無線網卡WL-167g,該網卡的芯片是RT73芯片,擁有官網開發的Linux驅動,還有開源社區提供的驅動,有較多的文檔資料可供查詢。開發平臺的操作系統是Linux-2.6.14.1,在該操作系統下對AODV路由協議、UDA1341TS聲卡驅動、USB驅動、RT73無線網卡驅動進行移植。
語音通信系統終端主要分為音頻采集、音頻編碼、傳輸、接收、音頻解碼、音頻播放6個模塊,如圖1所示。系統采用多線程技術,分為音頻采集、編碼傳輸、接收解碼和音頻播放4個線程,收發緩沖使用環形緩沖區,其作為臨界資源,采集與編碼傳輸競爭一個環形緩沖區,播放與接收解碼競爭一個環形緩沖區[6],如圖2所示。
2 系統實現
2.1 搭建Ad-Hoc網絡環境
本系統使用的路由協議源碼是aodv-uu-0.9.5,這是一款成熟的Linux平臺下的AODV路由協議實現,移植到本系統只需要針對操作系統內核做一些相應的修改和參數設置。使用交叉編譯工具arm-linux-gcc3.4.1對AODV源碼進行交叉編譯,得到適合Linux-2.6.14.1內核的路由協議內核態模塊kaodv和用戶態模塊aodv。為了對網絡節點進行合理的拓撲分布,在室內使用了屏蔽的方案,如圖3所示,進行4個節點的路由線路全雙工語音通信時,Node1分別與Node3、Node4互相設置MAC地址屏蔽,Node2與Node4互相設置MAC地址屏蔽,這樣就能保證按照本文設計的路由線路方式進行語音傳輸。
2.2 音頻參數設置
音頻信號是一種連續變化的模擬信號,計算機只能記錄和處理二進制的數據,自然音源的模擬音頻信號必須經過量化成為數字音頻信號之后,才能被計算機進一步處理。采樣和量化是音頻編程程序員理解聲音數字化的兩個關鍵步驟,進行音頻編程時經常用到的技術指標有采用頻率、量化位數和聲道數。常用的采樣頻率有8 kHz、16 kHz、44.1 kHz、48 kHz等;常用的量化位數有8 bit、12 bit、16 bit;聲道有單聲道和雙聲道。本系統使用的是8 kHz、16 bit、單聲道。
//設置采樣頻率
Arg=采樣頻率;
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,&Arg);
//設置量化位數
Arg=量化位數;
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_BITS,&Arg);
//設置聲道數
Arg=聲道數
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_CHANNELS,&Arg);
2.3 音頻采集
系統使用read()函數來從聲卡讀取數據,其函數原型為:int read(int fd, char*buf, size_t count)。其中,fd是音頻設備文件的標識符,buf是存儲音頻數據的緩沖區,count是要采集的音頻數據字節數。單次采集所用時間為:(采樣字節數count×8×1000)/(采樣頻率rate×量化位數bits×聲道數channels) ms。因此,count不能設置太大,會增加系統的時延,影響語音的實時性,本系統單次采樣128 B,采樣時間為8 ms。程序偽代碼為:
while(conditions)
{
//訪問臨界資源環形緩沖區
Pthread_mutex_lock();
采集音頻數據;
寫入環形緩沖區;
//增加信號量值
Sem_Post();
//退出臨界區
Pthread_mutex_unlock();
}
2.4 編碼傳輸
Ad-Hoc網絡的帶寬是有限的,大量的數據傳輸會增加網絡的負荷,影響通信質量,對語音進行適當的編碼是很有必要的,這可以有效地減輕網絡的負擔,更利于語音通信。復雜的語音編碼算法擁有高效的壓縮比,但由于計算量大,會增加語音傳輸的延遲。本系統選用了著名的波形編碼算法G711編碼,G711編碼算法比較簡單,計算量小,可減少一半的網絡語音數據負荷[7]。語音傳輸使用了RTP實時傳輸協議,RTP協議常用于流媒體系統,可有效監控語音傳輸質量,這使它成為IP電話產業的技術基礎。程序偽代碼為:
while(conditions)
{
//等待信號量喚醒
Sem_wait();
//訪問臨界資源環形緩沖區
Pthread_mutex_lock();
從環形緩沖區提取音頻數據;
G711編碼語音數據;
發送RTP語音數據包;
//退出臨界區
Pthread_mutex_unlock();
}
2.5 接收解碼
系統終端接收到語音數據包時,提取payload語音數據,并解碼出PCM音頻碼,存放在環形緩沖區。程序偽代碼為:
while(conditions)
{
//訪問臨界資源環形緩沖區
提取RTP語音數據包;
解碼語音數據;
將語音數據放入環形緩沖區;
//增加信號量值
Sem_post();
//退出臨界區
Pthread_mutex_unlock();
}
2.6 音頻播放
播放線程與接收解碼線程競爭同一個環形緩沖區,從環形緩沖區提取音頻數據,并寫入聲卡。程序偽代碼為:
While(conditions)
{
//等待信號量喚醒
Sem_wait();
//訪問臨界資源環形緩沖區
Pthread_mutex_lock();
從環形緩沖區提取音頻數據;
播放音頻數據;
//退出臨界區
Pthread_mutex_unlock();
}
3 改善語音通信質量
本設計針對節省網絡帶寬和消除抖動兩方面對語音的通信質量進行了優化。通過實驗測試優化前后的語音通信質量,結果證明優化后確實具有更好的效果。下面分別介紹這兩種優化方案。
(1)靜音檢測節省網絡帶寬。大量的研究表明,在一路全雙工電話交談中,只有36%~40%的語音信號是活動或有效的[8]。電話交談過程中某一時候往往只有一方在講,另一方在聽,而且講話時有大量停頓。如果能通過某種手段檢測到通話過程中的靜默時段,停止發送語音數據包,則可以節省大量的網絡帶寬。本設計在靜默檢測時使用VAD(Voice Activation Detection)技術,分為短時能量檢測和短時過零率檢測兩部分。短時能量檢測可以很好地區分出濁音和靜音,而短時過零率可以很好地區分出靜音和清音,因此,將兩者結合起來,就可以檢測出靜音段。下面是算法描述:
①對輸入語音信號進行高通濾波和加窗處理;
②計算一幀的能量及其平均值;
③該幀平均能量值是否大于能量閾值,是則判定為語音幀并返回,否則轉步驟④;
④前3幀是否有語音幀,有則判定為平滑語音幀并返回,否則轉至步驟⑤;
⑤計算該幀過零率;
⑥該幀過零率是否在過零率閾值范圍內,是則判定為語音幀并返回,否則判定為靜音幀。
(2)消除抖動。所謂抖動,是指語音數據包沒有按規律的時間間隔到達接收端,造成語音播放時聲音斷斷續續。嚴重的抖動會導致語音數據包不按順序到達接收端或者丟失,導致聲音混亂無序[9]。抖動是經常發生的,分組到達出現少量時延很常見。為了消除抖動,本文采用了延遲回放技術。如圖4所示,接收端在收到第一個數據時并不馬上開始回放,而是將傳入數據放入緩存中,該緩存稱為抖動緩存(Jitter Buffer)。在接收端設置一個適當大小的抖動緩存,按照FIFO隊列進行操作,當語音數據在緩存中積累到一定程度(K個數據包)時開始按時序播放語音,這樣聲音就比較平滑連續。
4 系統測試及結論
本文對搭建的嵌入式Ad-Hoc網絡環境進行了連通性測試,并在該基礎上進行了實時語音通信的實驗。網絡連通性測試確保各個節點之間能互相通信,保證數據的路由轉發路徑按照設計的方案進行。實時語音通信實驗監測了2個節點路由線路、3個節點路由線路、4個節點路由線路的語音通信質量,以及使用靜音檢測技術前后發送的語音數據包占總采樣數據包的比例。
(1)本文在搭建Ad-Hoc網絡環境中設計了部分節點之間相互屏蔽MAC地址以保證路由轉發按照設計線路進行的實驗方案。下面使用ping命令對4個嵌入式節點線路的網絡進行了數據跟蹤測試,如圖5所示,數據包確實按照所設計的方案進行路由轉發。
(2)分別在4個網絡節點上移植了本實時語音通信系統,進行全雙工語音通信,實驗對語音數據包的收發情況做了統計,統計結果如表1所示。數據表明,本嵌入式實時語音通信系統在4個節點線路以內的Ad-Hoc網絡環境中進行全雙工語音通信有較好的效果。
本文綜合了Ad-Hoc網絡技術、Linux系統語音編程、靜音檢測技術和RTP實時傳輸技術設計實現了一套應用于嵌入式Ad-Hoc網絡的實時語音通信系統。本系統性能良好,有較高的實際應用價值,可以應用在治安、礦井、救災等領域中。本文的下一步工作是針對節點的移動性、多節點多路由路徑作進一步的改進,不斷提高本系統的性能。
參考文獻
[1] 藏婉瑜,于勐,謝立,等.按需式ad hoc移動網絡路由協議的研究進展[J].計算機學報,2003,25(10):1009-1017.
[2] Zhan Yimin, Lin Baocheng. VoIP technology and it’s application in broadband IP network[J]. CATV Technology,2002,9(15):12-18.
[3] 王雅輝,劉家康,趙勝輝.基于OPNET仿真平臺的AODV協議的性能研究[J].光電技術應用,2004(6):60-64.
[4] 王忠恒,張曦煌.移動Ad Hoc網絡AODV路由協議的改進[J].計算機應用,2010(2):333-336.
[5] 楊靜文,盧益民,胡浩.Linux下實時音頻傳輸的實現[J]. 電聲技術,2005(2):63-65.
[6] 楊水清,張劍,施云飛.ARM嵌入式Linux系統開發技術詳解[M].北京:電子工業出版社,2008.
[7] 焦傳斌,于保華,李治柱.新型寬帶語音編解碼器AMR-WB的研究[J].計算機仿真,2005,22(1):150-159.
[8] 于洪濤,徐靜波,冉崇森.語音噪聲壓縮新算法[J].計算機工程與科學,2006,28(10):71-13.
[9] COMER D E, STEVENS D L. Internetworking with TCP/IP volume 3 client-server programming and applications Linux/POSIX sockets version[M]. USA:Pearson Education,2001.