王 碩,郭書軍
(北方工業(yè)大學(xué) 電子信息工程學(xué)院,北京 100144)
當(dāng)社區(qū)公民在戶外遇到突發(fā)情況時,快速與有關(guān)部門取得聯(lián)系非常重要。針對這種社會需求,本設(shè)計提出并實現(xiàn)了一種戶外報警對講系統(tǒng)。當(dāng)社區(qū)內(nèi)發(fā)生突發(fā)事件時,市民能夠通過此設(shè)備第一時間通知社區(qū)控制室,并與工作人員對講以尋求幫助[1-2]。此報警對講系統(tǒng)使用Cortex-A8架構(gòu)的S5PV210 ARM處理器作為CPU,硬件包括音頻模塊、網(wǎng)絡(luò)模塊、SD卡模塊、USB模塊、按鍵報警模塊、顯示模塊等。
系統(tǒng)采用S5PV210核心板作為主控單元,使用WM8960音頻芯片CODEC進(jìn)行編碼與解碼,使用LM4871音頻功率放大芯片放大聲音信號后傳送到4 Ω/3 W的喇叭輸出。系統(tǒng)選用DM9000網(wǎng)絡(luò)芯片,通過百兆網(wǎng)口與后臺服務(wù)器通信,由I/O口控制LED的顯示以及檢測按鍵報警,由RS 232接口控制LED顯示屏顯示的內(nèi)容。系統(tǒng)預(yù)留了SD卡接口和USB接口,使得系統(tǒng)可以方便地進(jìn)行內(nèi)核燒寫與日后的維護(hù)升級。
系統(tǒng)硬件框圖如圖1所示。
圖1 系統(tǒng)硬件框圖
S5PV210支持I2S/PCM/AC97等音頻接口。本開發(fā)板采用I2S0接口,外接有WM8960作為CODEC解碼芯片。WM8960內(nèi)置有D類功放,可以直接驅(qū)動8 Ω/1 W的喇叭,本設(shè)計使用LM4871功放芯片對信號進(jìn)行放大處理。LM4871是一個具有關(guān)斷功能的音頻功率放大器,其具有單位增益穩(wěn)定,外部電路簡單等特點,輸出可以驅(qū)動4 Ω/3 W的喇叭,經(jīng)測試,音量基本達(dá)到了設(shè)計要求。
音頻功放模塊電路如圖2所示。
圖2 音頻功放模塊電路圖
網(wǎng)絡(luò)部分采用DM9000網(wǎng)卡芯片。DM9000是一款集成了10/100PHY的以太網(wǎng)MAC控制器,它可自適應(yīng)10/100 M網(wǎng)絡(luò),具有支持介質(zhì)無關(guān)接口,支持背壓模式半雙工流量控制模式等特點,同時還支持超低功耗模式,兼容3.3 V和5.0 V輸入輸出電壓。網(wǎng)口使用內(nèi)部已經(jīng)包含耦合線圈的RJ45連接頭,因此不必在電路中另接網(wǎng)絡(luò)變壓器。
傳統(tǒng)的嵌入式產(chǎn)品在設(shè)備安裝完成后,對于內(nèi)核驅(qū)動層的升級較為不便,一般需回廠升級或者更換ROM。這種方式不僅效率低下,更大大增加了維修成本。本設(shè)計預(yù)留了SD卡接口和USB接口,系統(tǒng)可以通過SD卡上的Boot Loader啟動并通過USB接口燒寫內(nèi)核。維修人員只需攜帶一張SD卡和一臺筆記本電腦即可完成固件升級工作。
系統(tǒng)軟件主要由應(yīng)用層軟件以及相應(yīng)的驅(qū)動模塊組成。應(yīng)用層主要包括網(wǎng)絡(luò)模塊、音頻模塊、回聲消除模塊、按鍵控制模塊等。系統(tǒng)軟件模塊組成如圖3所示。
文中分別詳細(xì)介紹了與音頻處理有關(guān)的ALSA框架,與回聲消除有關(guān)的Speex框架及網(wǎng)絡(luò)通信部分。
圖3 系統(tǒng)軟件模塊圖
S5PV210支持I2S/PCM/AC97等音頻接口。本設(shè)計采用I2S接口進(jìn)行音頻數(shù)據(jù)的傳輸,采用I2C接口對CODEC芯片的寄存器進(jìn)行設(shè)置。整個音頻驅(qū)動基于ALSA音頻架構(gòu)[3-6]。
ALSA是Linux上一種應(yīng)用比較廣泛的音頻驅(qū)動框架,ALSA包含與音頻編程有關(guān)的API庫[2],及其他方便開發(fā)的工具,如alsamixer可以調(diào)節(jié)音頻混聲器參數(shù),arecord指令可以測試錄音功能,aplay指令可以測試播放功能。
ALSA的軟件體系結(jié)構(gòu)如圖4所示。
圖4 ALSA的軟件體系結(jié)構(gòu)圖
ALSA的API可以分解成控制接口、PCM接口、Raw MIDI接口等。其中PCM接口是管理數(shù)字音頻回放(playback)和錄音(capture)的接口。本文后續(xù)重點將放在該接口上,它是開發(fā)數(shù)字音頻程序最常用的接口。
要使用ALSA,首先調(diào)用以下語句打開PCM設(shè)備:
snd_pcm_open(&handle_cap,"hw :0,0",SND_PCM_STREAM_CAPTURE,0);
設(shè)置語音的硬件參數(shù)??紤]到緊急報警的通話要求僅為清晰,故選用的參數(shù)為:采樣率8 k,單通道,16位。ALSA首先聲明一個結(jié)構(gòu)體snd_pcm_hw_params_t,用來保存句柄的硬件參數(shù),然后調(diào)用參數(shù)設(shè)置語句填充結(jié)構(gòu)體,最后調(diào)用函數(shù)snd_pcm_hw_params進(jìn)行參數(shù)設(shè)置。
音頻部分代碼運(yùn)用Linux多線程編程技術(shù),其中一個線程負(fù)責(zé)通過UDP接收音頻流并播放,調(diào)用snd_pcm_writei函數(shù)完成寫數(shù)據(jù);另一個線程負(fù)責(zé)采集音頻信號并發(fā)送到服務(wù)器,調(diào)用snd_pcm_readi函數(shù)完成讀數(shù)據(jù)操作。音頻的采集和播放分別維護(hù)一個buffer,由信號量控制各線程對其的使用權(quán),每個buffer有兩個指針,分別表示數(shù)據(jù)的壓入和取出,保證程序有序運(yùn)行。
由于音頻設(shè)備會出現(xiàn)回聲的現(xiàn)象(遠(yuǎn)端喇叭播放的聲音被麥克風(fēng)采集后又傳回近端),情況嚴(yán)重時對語音質(zhì)量影響極大。本設(shè)計主要采用Speex音頻庫的API,結(jié)合ALSA框架進(jìn)行回聲消除的研究[7]。
應(yīng)用Speex庫進(jìn)行回聲消除的主要步驟如下:
(1)首先設(shè)置音頻基本參數(shù),需要調(diào)用以下函數(shù):
_speex_preprocess=speex_preprocess_state_init(FRAMESIZE,8000);
在使用其他功能之前首先調(diào)用Speex的預(yù)處理函數(shù)初始化音頻參數(shù),函數(shù)第一個參數(shù)是每幀的大小,第二個參數(shù)是采樣率。在語音通話中一般采用的幀長為20 ms,假如是16 k的語音數(shù)據(jù),幀長20 ms等于320個采樣點。
(2)創(chuàng)建回聲消除AEC,設(shè)置相關(guān)參數(shù)。調(diào)用speex_echo_state_init(m_nFrameSize,m_nFilterLen) 創(chuàng) 建 一 個AEC(Acoustic Echo Chancellor,AEC),該函數(shù)的第二個參數(shù)是尾音長度,即喇叭到麥克風(fēng)的延遲時間,該參數(shù)直接影響了回聲消除的效果。
調(diào) 用 speex_echo_ctl(st,SPEEX_ECHO_SET_SAMPLING_RATE,&sampleRate)來設(shè)置相關(guān)參數(shù)。
(3)最后在線程中循環(huán)調(diào)用函數(shù)消除回聲。調(diào)用speex_echo_cancellation(st,ref_buf,echo_buf,e_buf) 函數(shù) 將 數(shù)據(jù)傳遞給AEC,第二個參數(shù)是喇叭播放數(shù)據(jù),第三個參數(shù)是麥克風(fēng)采集數(shù)據(jù),第四個參數(shù)是回聲消除后的數(shù)據(jù)。
調(diào)用 speex_preprocess_run(_speex_preprocess,outbuf)啟動Speex的音頻處理進(jìn)行回聲消除。Outbuf即為處理后的數(shù)據(jù)。
系統(tǒng)使用TCP協(xié)議控制信號的傳輸,使用UDP協(xié)議進(jìn)行音頻流的傳輸[8]。
下位機(jī)作為TCP客戶端主動向服務(wù)器發(fā)起連接,并且每隔30 s向服務(wù)器發(fā)送一個心跳包,服務(wù)器可以通過判斷接收間隔以判斷下位機(jī)的在線狀態(tài)。下位機(jī)和服務(wù)器通過Modbus協(xié)議進(jìn)行應(yīng)用層數(shù)據(jù)交互,其基本格式為:幀頭+幀長+數(shù)據(jù)區(qū)+校驗碼+幀尾,通過自定義協(xié)議完成上位機(jī)對下位機(jī)的查詢和控制,以及下位機(jī)報警信號的上傳。
網(wǎng)絡(luò)編程部分應(yīng)用了Libevent事件通知庫,其內(nèi)部使用select,epoll,kqueue,IOCP等系統(tǒng)調(diào)用管理事件機(jī)制。相對于Raw Socket編程,應(yīng)用Libevent事件庫大大提升了網(wǎng)絡(luò)通信的性能與穩(wěn)定性。
本系統(tǒng)在設(shè)計完成后進(jìn)行了完整有效的系統(tǒng)測試,電路板安裝在定制的機(jī)箱殼體內(nèi),并設(shè)計有ESD防護(hù)。本設(shè)備可以安裝在電線桿上或者臨街的墻壁上方便市民使用。
系統(tǒng)終端控制板如圖5所示。
圖5 終端控制板實物圖
最終的測試結(jié)果表明,報警信號可及時上傳,對講語音清晰有效,各類接口功能正常,均滿足了設(shè)計要求,達(dá)到了預(yù)期目標(biāo)。