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