摘 要: 綜合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é)合起來,就可以檢測出靜音段,。下面是算法描述:
?、賹斎胝Z音信號進(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.