摘 要: 針對機車安全對語音錄音系統性能的要求,設計了由ARM微處理器與音頻處理芯片組成的嵌入式語音錄音系統。介紹了錄音系統的硬件設計方案及軟件設計要點?;贏RM處理器,應用和音頻芯片實現了對語音音頻數據流及其控制信號的傳輸,采用分段緩存技術改進了緩存管理方式,提高了系統處理速度,滿足了語音錄音實時性的要求。通過實際測試,證明該系統達到了良好的錄音效果。
關鍵詞: 微處理器; 音頻芯片; 緩存區; 設備驅動
中圖分類號: TN919?34; TP368.1 文獻標識碼: A 文章編號: 1004?373X(2013)04?0016?03
0 引 言
機車運行安全關系到旅客人身安全和財產安全,同時影響跌路系統的運行效率,因此研制一套實時性好,使用方便的機車語音錄音量系統非常重要。
語音可以采用模擬錄音方式,也可以采用工控機進行,前者使用不方便,后者的成本很高[1]。
針對機車語音錄音的要求,設計了一種實時性好、錄放方便的機車錄音系統。系統硬件主要采用基于Atmel公司的ARM處理器和飛利浦公司的音頻處理芯片。詳細介紹了硬件設計方案,和Linux環境下語音驅動程序的實現方法。
1 硬件設計
硬件系統以AT91系列ARM處理器為核心構建。
1.1 處理器簡介
Amtel公司的AT91系列ARM處理器是ARM9處理器為核心,擴展有DSP指令集,內置Java加速器,同時集成有JTAG?ICE和UART調試接口,能夠實現代碼調試,因此基于AT91系列處理器進行系統開發和調試非常方便[2]。
1.2 音頻數據總線簡介
音頻數據總線[3]是INTEL公司定義的一種面向音頻處理的系統總線,簡稱IIS(Intel IC Sound),主要音頻數據傳輸,并提供標準編解碼器。
IIS由三條串行線組成:數據線、聲道選擇線和時鐘,而編碼、控制等其他信號則另行傳送。
1.3 設計方案
基于AT91系列處理器AT91SAM9261和音頻芯片UDA1341的總體設計方案如圖1所示,其中UDA1341支持IIS,具有PGA(可編程增益)和數字AGC功能。
AT91SAM9261內部具有SSI(串行接口控制器),支持多種串行通信協議,能直接與外部8位或16位的音頻芯片相連接。通過設置AT91SAM9261的PDC控制器選擇DMA傳輸模式,從而使語音數據發送和接收可以同時進行。
音頻芯片UDA1341有兩組音頻接口,每組都有VINL2和VINR2左右兩個聲道,接口與ARM處理器的連接如圖2所示。VINR2可以用PGA和AGC對語音信號進行調理,同時可以通過軟件編程方法對語音音量的大小進行調節。
在硬件設計中,使用2個DAM通道對語音數據流進行錄放。錄音時語音數據流由IIS總線通過RD傳入,經過DMA通道1存入內部存儲器;放音時語音頻數據流從內存中通過DMA通道2傳入數據寄存器,然后通過TD將數據傳給UDA1341TS。由于DMA控制器沒有內置的緩存區域,所以需要在驅動程序編寫中申請DMA緩沖區,由于需要進行同時進行錄放,所以DMA緩存區定義為雙緩存結構。
ARM處理器的TK,TF,RD和TD四個接口分別對應連接與語音芯片的BCK,WS,DATAO和DATA1,時鐘(SYSCLOCK)則由ARM處理器的PCK2提供。
UDA1341的L3DATA(數據線)、L3MODE(模式選擇線)和L3CLOCK(時鐘)3個信號為內部L3總線接口,用于傳輸控制信號。L3MODE與ARM9處理器的PA7 I/O口相連、L3CLOCK與ARM9處理器的PA8相連,L3DATA與ARM9處理器的PA9相連, ARM處理器通用這3個I/O口線模擬L3總線時序和相應的總線協議,對語音處理參數和控制參數進行配置。
2 軟件設計
設備驅動程序是Linux操作系統內核的重要組成部分,通過驅動程序用戶可以對硬件設備操作。file_operations是Linux設備控制塊中重要的數據結構,用于訪問硬件設備。用戶對設備進行操作時,先通過用戶定義的設備號找到相應的設備驅動程序,然后讀取file_operations中相應的函數指針,然后把控制權交給該函數。
驅動程序通過硬件控制實現對語音數據流的錄制和播放[4]。語音驅動程序提供了2個標準接口:
(1)DSP接口:控制語音的錄制或播放。具體定義為:
static struct file_ops speech_fops = {
llseek:speech_llseek, //查找定位
write: speech _write, //播放
read: speech _read, //錄制
poll: speech _poll, //選擇
ioctl: speech _ioctl, //語音控制接口
open: device_open, //打開設備
release:device_release, //關閉設備
};
(2)混頻器:用于對語音進行混音處理。具體定義為:
static struct file_ops mixer_fops = {
ioctl: mixer_ioctl, //混音控制
open: mixer_open, //打開混音設備
release: mixer_release, //關閉混音設備
};
混合器的音效控制通過mixer_fops結構體的指針調用相應的函數來實現。
驅動程序中的DSP接口和混頻器設備文件分別定義為dev/dsp,dev/mixer。
2.1 設備初始化
調和初始化主要完成通用I/O口的設置、同步串行控制器的初始化、L3總線的初始化、DMA的初始化和初始化音頻芯片的采樣頻率及音量,并對語音設備進行注冊。這些操作都是通過初始化模塊module_init( )調用初始化函數uda1341_ init( )來實現的。
2.2 DMA設計
驅序程序中通過雙緩沖DMA分段方法,使讀寫可以同時進行,從而提高了語音的錄制和播放速度。若只設置一個DMA緩存區,則在寫操作時需要等待緩存區的數據傳輸完后才能進行后續操作,因此讀操作被阻塞,大大降低了語音處理速度。
audio_buf_t和audio_stream_t是管理循環緩存區的兩個結構,如圖3所示。具體的工作過程是:將申請到的緩存區分成N個塊,先寫塊1,然后再寫塊2,這樣就不管塊1的數據是否被傳輸完,當寫完第N個塊后,又開始回到第一個,而此時第一個緩存區相當有可能已傳輸完畢。同時驅動程序還提供了ioctl接口,給上層調用,這樣上層可以調用ioctl,根據語音數據流量來調整緩存區數據段的大小和塊數(N),以取得最好的傳輸效果。
2.3 錄放操作的實現
設備驅動程序控制語音的錄制和播放,是驅動程序的核心。錄制和播放操作分別對應于struct file_ops 結構中的speech_read函數和speech_write函數。
錄音和播放的實現過程相似,故只對錄音過程進行討論:驅動程序首先配置DMA緩存區,錄音時讀入語音數據塊(大小為count),然后將DMA中的語音數據流按照count大小傳送到用戶的緩沖區Buffer中。每讀完一個塊后將塊插入到DMA隊列中等待下次數據傳輸。最后驅動程序改變DMA緩存塊指針,使其指向下一個DMA塊繼續讀取數據。
2.4 設備的卸載
device_exit()函數用于卸載設備,調用注銷函數uda1341_exit()完成。具體過程是:需要注銷設備時,首先輸入注冊設備時所得到的設備號,然后釋放驅動程序申請使用的所有資源。
2.5 語音測試
為了測試語音驅動程序工作的正確性,需要使用音頻播放器。本文使用mplayer播放器,將mplayer原碼在Linux環境下重新編譯,然后寫入SD卡中,經過Linux的mount指令將mplayer播放器掛載到根文件系統中。在超級終端下輸入Linux命令:root@at91sam9261: /mou nt/sd$:./mplayer test.mp3,就會聽到播放的聲音。超級終端反饋信息如圖4所示,其中test.mp3為要測試的音頻文件。
3 結 語
本文基于ARM9處理器與音頻芯片UDA1341構建機車語音錄音和播放系統。文中主要對硬件系統的設計方案、語音錄制和播放驅動程序的編寫要點和雙緩沖DMA分段管理方法進行了仔細說明。目前,該系統已應用于列車電臺之間的語音通話錄音,實踐證明達到了較好的錄放音效果。
參考文獻
[1] 范新,陳生惠.LY?Ⅰ型列車無線調度電話機車電臺語音記錄裝置[J].中國鐵路,2001(6):57?58.
[2] Atmel Corporation. AT91SAM9261 datasheet rev. 1.09.02 [S]. US: Atmel Corporation, 2007.
[3] 吳平,曹曉琳,丁鐵夫.基于ARM和DSP的語音通訊系統設計[J].計算機測量與控制,2005,13(12):1423?1426.
[4] 奇浩淳.基于SEP4020的嵌入式音頻系統設計[J].計算機工程應用技術,2008(4):964?966,968.
[5] 商斌.Linux設備驅動開發入門與編程實踐[M].北京:電子工業出版社,2009.
[6] 易紅,李曉濤.LY?07語音錄音裝置音頻驅動的設計與實現[J].機車電傳動,2010(3):24?25.
[7] 林永碩.基于USB的音頻信號分析儀的設計[J].現代電子技術,2012,35(11):60?63.
[8] 王維.基于WinCE的車載電臺錄音裝置的設計[M].北京:北京交通大學出版社,2010.
[9] 劉彥明.嵌入式無線電臺檢測終端的設計與實現[M].濟南:山東大學出版社,2010.
[10] CRAIG Hollabaugh. Embeded Linux hardware software and interfacing [M].北京:電子工業出版社,2003.