王 碩,郭書軍
(北方工業大學 電子信息工程學院,北京 100144)
當社區公民在戶外遇到突發情況時,快速與有關部門取得聯系非常重要。針對這種社會需求,本設計提出并實現了一種戶外報警對講系統。當社區內發生突發事件時,市民能夠通過此設備第一時間通知社區控制室,并與工作人員對講以尋求幫助[1-2]。此報警對講系統使用Cortex-A8架構的S5PV210 ARM處理器作為CPU,硬件包括音頻模塊、網絡模塊、SD卡模塊、USB模塊、按鍵報警模塊、顯示模塊等。
系統采用S5PV210核心板作為主控單元,使用WM8960音頻芯片CODEC進行編碼與解碼,使用LM4871音頻功率放大芯片放大聲音信號后傳送到4 Ω/3 W的喇叭輸出。系統選用DM9000網絡芯片,通過百兆網口與后臺服務器通信,由I/O口控制LED的顯示以及檢測按鍵報警,由RS 232接口控制LED顯示屏顯示的內容。系統預留了SD卡接口和USB接口,使得系統可以方便地進行內核燒寫與日后的維護升級。
系統硬件框圖如圖1所示。

圖1 系統硬件框圖
S5PV210支持I2S/PCM/AC97等音頻接口。本開發板采用I2S0接口,外接有WM8960作為CODEC解碼芯片。WM8960內置有D類功放,可以直接驅動8 Ω/1 W的喇叭,本設計使用LM4871功放芯片對信號進行放大處理。LM4871是一個具有關斷功能的音頻功率放大器,其具有單位增益穩定,外部電路簡單等特點,輸出可以驅動4 Ω/3 W的喇叭,經測試,音量基本達到了設計要求。
音頻功放模塊電路如圖2所示。

圖2 音頻功放模塊電路圖
網絡部分采用DM9000網卡芯片。DM9000是一款集成了10/100PHY的以太網MAC控制器,它可自適應10/100 M網絡,具有支持介質無關接口,支持背壓模式半雙工流量控制模式等特點,同時還支持超低功耗模式,兼容3.3 V和5.0 V輸入輸出電壓。網口使用內部已經包含耦合線圈的RJ45連接頭,因此不必在電路中另接網絡變壓器。
傳統的嵌入式產品在設備安裝完成后,對于內核驅動層的升級較為不便,一般需回廠升級或者更換ROM。這種方式不僅效率低下,更大大增加了維修成本。本設計預留了SD卡接口和USB接口,系統可以通過SD卡上的Boot Loader啟動并通過USB接口燒寫內核。維修人員只需攜帶一張SD卡和一臺筆記本電腦即可完成固件升級工作。
系統軟件主要由應用層軟件以及相應的驅動模塊組成。應用層主要包括網絡模塊、音頻模塊、回聲消除模塊、按鍵控制模塊等。系統軟件模塊組成如圖3所示。
文中分別詳細介紹了與音頻處理有關的ALSA框架,與回聲消除有關的Speex框架及網絡通信部分。

圖3 系統軟件模塊圖
S5PV210支持I2S/PCM/AC97等音頻接口。本設計采用I2S接口進行音頻數據的傳輸,采用I2C接口對CODEC芯片的寄存器進行設置。整個音頻驅動基于ALSA音頻架構[3-6]。
ALSA是Linux上一種應用比較廣泛的音頻驅動框架,ALSA包含與音頻編程有關的API庫[2],及其他方便開發的工具,如alsamixer可以調節音頻混聲器參數,arecord指令可以測試錄音功能,aplay指令可以測試播放功能。
ALSA的軟件體系結構如圖4所示。

圖4 ALSA的軟件體系結構圖
ALSA的API可以分解成控制接口、PCM接口、Raw MIDI接口等。其中PCM接口是管理數字音頻回放(playback)和錄音(capture)的接口。本文后續重點將放在該接口上,它是開發數字音頻程序最常用的接口。
要使用ALSA,首先調用以下語句打開PCM設備:
snd_pcm_open(&handle_cap,"hw :0,0",SND_PCM_STREAM_CAPTURE,0);
設置語音的硬件參數。考慮到緊急報警的通話要求僅為清晰,故選用的參數為:采樣率8 k,單通道,16位。ALSA首先聲明一個結構體snd_pcm_hw_params_t,用來保存句柄的硬件參數,然后調用參數設置語句填充結構體,最后調用函數snd_pcm_hw_params進行參數設置。
音頻部分代碼運用Linux多線程編程技術,其中一個線程負責通過UDP接收音頻流并播放,調用snd_pcm_writei函數完成寫數據;另一個線程負責采集音頻信號并發送到服務器,調用snd_pcm_readi函數完成讀數據操作。音頻的采集和播放分別維護一個buffer,由信號量控制各線程對其的使用權,每個buffer有兩個指針,分別表示數據的壓入和取出,保證程序有序運行。
由于音頻設備會出現回聲的現象(遠端喇叭播放的聲音被麥克風采集后又傳回近端),情況嚴重時對語音質量影響極大。本設計主要采用Speex音頻庫的API,結合ALSA框架進行回聲消除的研究[7]。
應用Speex庫進行回聲消除的主要步驟如下:
(1)首先設置音頻基本參數,需要調用以下函數:
_speex_preprocess=speex_preprocess_state_init(FRAMESIZE,8000);
在使用其他功能之前首先調用Speex的預處理函數初始化音頻參數,函數第一個參數是每幀的大小,第二個參數是采樣率。在語音通話中一般采用的幀長為20 ms,假如是16 k的語音數據,幀長20 ms等于320個采樣點。
(2)創建回聲消除AEC,設置相關參數。調用speex_echo_state_init(m_nFrameSize,m_nFilterLen) 創 建 一 個AEC(Acoustic Echo Chancellor,AEC),該函數的第二個參數是尾音長度,即喇叭到麥克風的延遲時間,該參數直接影響了回聲消除的效果。
調 用 speex_echo_ctl(st,SPEEX_ECHO_SET_SAMPLING_RATE,&sampleRate)來設置相關參數。
(3)最后在線程中循環調用函數消除回聲。調用speex_echo_cancellation(st,ref_buf,echo_buf,e_buf) 函數 將 數據傳遞給AEC,第二個參數是喇叭播放數據,第三個參數是麥克風采集數據,第四個參數是回聲消除后的數據。
調用 speex_preprocess_run(_speex_preprocess,outbuf)啟動Speex的音頻處理進行回聲消除。Outbuf即為處理后的數據。
系統使用TCP協議控制信號的傳輸,使用UDP協議進行音頻流的傳輸[8]。
下位機作為TCP客戶端主動向服務器發起連接,并且每隔30 s向服務器發送一個心跳包,服務器可以通過判斷接收間隔以判斷下位機的在線狀態。下位機和服務器通過Modbus協議進行應用層數據交互,其基本格式為:幀頭+幀長+數據區+校驗碼+幀尾,通過自定義協議完成上位機對下位機的查詢和控制,以及下位機報警信號的上傳。
網絡編程部分應用了Libevent事件通知庫,其內部使用select,epoll,kqueue,IOCP等系統調用管理事件機制。相對于Raw Socket編程,應用Libevent事件庫大大提升了網絡通信的性能與穩定性。
本系統在設計完成后進行了完整有效的系統測試,電路板安裝在定制的機箱殼體內,并設計有ESD防護。本設備可以安裝在電線桿上或者臨街的墻壁上方便市民使用。
系統終端控制板如圖5所示。

圖5 終端控制板實物圖
最終的測試結果表明,報警信號可及時上傳,對講語音清晰有效,各類接口功能正常,均滿足了設計要求,達到了預期目標。