文獻(xiàn)標(biāo)識(shí)碼: B
文章編號(hào): 0258-7998(2012)07-0030-03
Android是一個(gè)開(kāi)放、自由的移動(dòng)終端平臺(tái),,其開(kāi)放性保證了該平臺(tái)不存在任何阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專(zhuān)有權(quán)障礙,,一經(jīng)推出就深受業(yè)內(nèi)人士的認(rèn)可。隨著電子科技的發(fā)展,,Android平臺(tái)不僅僅應(yīng)用于移動(dòng)互聯(lián)網(wǎng)上的開(kāi)發(fā),,在工程上的開(kāi)發(fā)前景也得到了廣泛的關(guān)注[1],。
Android平臺(tái)使用Java語(yǔ)言進(jìn)行開(kāi)發(fā),支持SQLite數(shù)據(jù)庫(kù),、2D/3D圖形加速,、多媒體播放和攝像頭等硬件設(shè)備,并設(shè)置了豐富的應(yīng)用程序,,如電子郵件客戶(hù)端,、鬧鐘,、Web瀏覽器,、計(jì)數(shù)器、通信錄和MP3播放器等,。Android采用了軟件堆層(Software Stack)的架構(gòu),,共分為4層:第一層是Linux內(nèi)核,提供由操作系統(tǒng)內(nèi)核管理的底層基礎(chǔ)功能,;第二層是中間件層,,由函數(shù)庫(kù)和Android運(yùn)行時(shí)所需的虛擬機(jī)構(gòu)成;第三層是應(yīng)用程序框架層,,提供了Android平臺(tái)基本的管理功能和組件重用機(jī)制,;第四層是應(yīng)用程序?qū)樱峁┝艘幌盗泻诵膽?yīng)用程序[2],。數(shù)據(jù)信號(hào)的采集一般是通過(guò)USB,、藍(lán)牙、WiFi等方法,,而本文是通過(guò)Android手機(jī)的麥克端來(lái)采集數(shù)字信號(hào),,從而實(shí)現(xiàn)了一種新型的數(shù)據(jù)采集的方法。
1 硬件系統(tǒng)設(shè)計(jì)
1.1 硬件結(jié)構(gòu)
Android手機(jī)的麥克端不能接收任意頻率的信號(hào),,只能接收頻率在20 Hz~20 kHz范圍內(nèi)(即達(dá)到音頻信號(hào)的范圍)的信號(hào),,因?yàn)橹挥幸纛l信號(hào)才能被人耳聽(tīng)到,才能被麥克采集到,。本文采集的信號(hào)是一電壓信號(hào),,而電壓信號(hào)不能直接被Android手機(jī)的麥克端接收。因此在硬件系統(tǒng)設(shè)計(jì)中,,需要把電壓信號(hào)轉(zhuǎn)換成頻率范圍在20 Hz~20 kHz之間的頻率信號(hào),,即達(dá)到音頻信號(hào)的標(biāo)準(zhǔn)。電壓信號(hào)轉(zhuǎn)換成頻率信號(hào)的方法有很多,,本文采用V/F轉(zhuǎn)換器LM331實(shí)現(xiàn)把電壓信號(hào)轉(zhuǎn)換成頻率在20 Hz~20 kHz范圍內(nèi)的音頻信號(hào),,其硬件框圖如圖1所示。
經(jīng)調(diào)整電路后的頻率信號(hào)就是標(biāo)準(zhǔn)的音頻信號(hào)了,,但信號(hào)并不能直接連接到送話(huà)器讓Android手機(jī)的麥克端接收,,因?yàn)椴荒鼙WC周?chē)^對(duì)安靜,, 誤差會(huì)很大,而是要把音頻信號(hào)與耳機(jī)中的送話(huà)器線(xiàn)相連,,再把耳機(jī)與Android手機(jī)相連,,這樣就可以大大減少失真的程度。
1.2 V/F轉(zhuǎn)換器LM331模塊
LM331是美國(guó)NS公司生產(chǎn)的性?xún)r(jià)比較高的集成芯片,,它是當(dāng)前最簡(jiǎn)單的一種高精度V/F轉(zhuǎn)換器,,將電壓信號(hào)轉(zhuǎn)換成脈沖頻率信號(hào),輸出頻率嚴(yán)格正比于輸入電壓,。LM331為雙列直插式8引腳芯片,,線(xiàn)性度好,最大非線(xiàn)性失真小于0.01%,,工作頻率為0.1 Hz時(shí)仍有較好的線(xiàn)性,;變換精度高,分辨率可達(dá)16位,;外接電路簡(jiǎn)單,,只需接入幾個(gè)外部元件就可方便地構(gòu)成V/F轉(zhuǎn)換器,并且容易保持轉(zhuǎn)換精度,。LM331在4.0 V的電壓供電的情況下,,就可在整個(gè)工作溫度范圍內(nèi)高精度地工作[3]。V/F轉(zhuǎn)換電路如圖2所示,。
2 音頻格式
音頻的格式有很多種,,但在Android的API中與音頻有關(guān)的包是android.media,其中有兩個(gè)類(lèi)是與音頻采集有關(guān)的,,分別是MediaRecorder和AudioRecord,。用Media-Recorder采集的音頻信號(hào)經(jīng)過(guò)壓縮編碼后變成的聲音數(shù)據(jù)為AMR格式。但因?yàn)閿?shù)據(jù)是被壓縮的,,所以在讀取數(shù)據(jù)時(shí),,要面臨解壓縮的問(wèn)題。而用AudioRecord采集音頻可以直接獲得無(wú)壓縮的PCM數(shù)據(jù),,即可以直接讀取音頻數(shù)據(jù),,數(shù)據(jù)不再需要解壓縮?;贏udioRecord的方便性與實(shí)用性,,本文采用AudioRecord來(lái)采集音頻信號(hào)。
脈沖編碼調(diào)制PCM(Pulse Code Modulation)是將音頻數(shù)字化的最好途徑,,聲音經(jīng)過(guò)麥克風(fēng),,轉(zhuǎn)換成一系列電壓變化的信號(hào)。要將這樣的信號(hào)轉(zhuǎn)換成PCM格式,,要使用聲道數(shù),、采樣位數(shù)和采樣頻率3個(gè)參數(shù)來(lái)表示聲音:(1)聲道數(shù)可分為單聲道和立體聲,,單聲道即用一個(gè)傳聲器拾取聲音,用一個(gè)揚(yáng)聲器來(lái)播放聲音,;而立體聲則是由兩個(gè)傳聲器輪流拾取聲音,,用兩個(gè)揚(yáng)聲器來(lái)播放聲音。(2)采樣位數(shù)即采樣值,,它是用來(lái)衡量聲音動(dòng)態(tài)波動(dòng)變化的一個(gè)參數(shù),,其值越大,分辨率就越高,,在Android提供的API中,,所提供的分辨率有8 bit和16 bit兩種。(3)采樣頻率(即取樣頻率)指的是每秒鐘采得聲音樣本的次數(shù),,采樣頻率越高,,聲音的質(zhì)量也就越好,,聲音的還原越真實(shí),,同時(shí)它占用的資源也比較多。通常選用的采樣頻率一般有11 025 Hz,、22 050 Hz和44 100 Hz,。11 025 Hz、8 bit的聲音稱(chēng)為電話(huà)音質(zhì),;22 050 Hz,、16 bit的聲音稱(chēng)為廣播音質(zhì);44 100 Hz,、16 bit已達(dá)到CD的音質(zhì)了[4],。
3 Android平臺(tái)下的軟件系統(tǒng)設(shè)計(jì)
首先是建立Android工程(即MediaPCM),其中包括主界面MainActivity,,在主界面上有MediaFile和Recorder兩個(gè)圖標(biāo),,分別代表音頻文件列表和音頻信號(hào)采集,如圖3所示,。
點(diǎn)擊右邊的Recorder,,就會(huì)進(jìn)入到音頻采集界面(即Record-Activity),實(shí)現(xiàn)采集和播放音頻的功能,,同時(shí)要把采集到的音頻打包成文件存放到SD卡指定的目錄下,;點(diǎn)擊左邊MediaFile,就會(huì)進(jìn)入到音頻文件顯示列表界面(即ListActivity),,點(diǎn)擊其中某一項(xiàng)文件,,就會(huì)進(jìn)入波形顯示界面(即WaveFormActivity),就會(huì)把音頻文件以二進(jìn)制數(shù)據(jù)的形式顯示在Android手機(jī)的界面上,。軟件系統(tǒng)的整體框架流程圖如圖4所示,。
3.1 清單(AndroidManifest)文件
在每一個(gè)Android項(xiàng)目中,,都包含了一個(gè)清單(AndroidManifest)文件,即AndroidManifest.xml,,它存儲(chǔ)在項(xiàng)目層次中的最底層,,用于在程序運(yùn)行之前向Android系統(tǒng)聲明程序的相關(guān)信息,這些信息包括應(yīng)用程序需要的許可,、程序運(yùn)行的最低SDK版本,、程序運(yùn)行所需要的硬件支持和函數(shù)庫(kù)等。由于本文要用到SD卡的操作和采集音頻信號(hào)(即錄音)的操作,,所以要在AndroidManifest.xml文件中加入以下兩個(gè)權(quán)限:"android.permission.WRITE_EXTERNAL_STORAGE"和"android.permission.RECORD_AUDIO",,這樣就可以訪問(wèn)SD卡和進(jìn)行采集音頻信號(hào)了。
3.2 音頻的采集與播放
因?yàn)橐纛l的采集需要使用AudioRecord類(lèi),,與之對(duì)應(yīng)的音頻的播放需要用到AudioTrack類(lèi),;要把聲音轉(zhuǎn)化成PCM格式,需要使用采樣頻率,、聲道數(shù)和采樣位數(shù)這三個(gè)參數(shù),。因此在編寫(xiě)程序時(shí),要對(duì)這三個(gè)參數(shù)進(jìn)行初始化,,即在本文中表示為frequence,、channelConfig和audioEncoding。本文采用的是采樣頻率為44 100 Hz,、單聲道16位進(jìn)行采樣,。點(diǎn)擊開(kāi)始按鈕(startButton)時(shí),就會(huì)開(kāi)始錄音(即采集音頻信號(hào)),。其核心代碼如下:
int bufferSize = AudioRecord.getMinBufferSize(frequence,
channelConfig, audioEncoding);
int resource = MediaRecorder.AudioSource.MIC;
AudioRecord record = new AudioRecord(resource, frequence,
channelConfig, audioEncoding, bufferSize);
record.startRecording();
其中,,bufferSize是根據(jù)采樣頻率、聲道和采樣位數(shù)三個(gè)參數(shù)得到一個(gè)最小的緩沖區(qū),,并且MediaRecorder.AudioSou-rce.MIC聲明了音頻信號(hào)的來(lái)源是Android手機(jī)的麥克端,。這樣當(dāng)調(diào)用record的startRecording()方法時(shí)就開(kāi)始錄音(即音頻采集);當(dāng)點(diǎn)擊停止按鈕(stopButton)時(shí)就會(huì)停止采集,;點(diǎn)擊播放按鈕(playButton)時(shí),,就開(kāi)始播放已經(jīng)錄制的音頻;點(diǎn)擊結(jié)束按鈕(finishButton)就結(jié)束播放音頻,。至于播放音頻這一項(xiàng),,對(duì)數(shù)據(jù)的采集并沒(méi)有太大的影響。為了完善界面,,在沒(méi)有硬件電路的情況下,,只用一個(gè)Android手機(jī)也能完成錄音播放的功能。錄音界面如圖5所示。
3.3 打包音頻文件
只采集音頻信號(hào)是遠(yuǎn)遠(yuǎn)不夠的,,還要把采集到的音頻信號(hào)打包成文件存放到SD卡指定的目錄中,,并把采集到的音頻信號(hào)顯示在音頻文件顯示界面上,在SD卡中的位置如圖6所示,。
本文把采集到的文件放在SD卡的MediaFile/File中,,并根據(jù)當(dāng)天的日期所建立的文件夾下(如本文的2012/1/12),確保把當(dāng)天采集到的音頻文件存放在一起,,以便于查詢(xún),。
在現(xiàn)實(shí)音頻文件列表時(shí),是根據(jù)日歷的形式存儲(chǔ)的,,有內(nèi)容的當(dāng)天日期會(huì)有標(biāo)記,,點(diǎn)擊標(biāo)記日就會(huì)進(jìn)入音頻文件顯示界面,如圖7所示。
3.4 讀取并顯示音頻文件
把音頻數(shù)據(jù)文件保存到SD卡中,,工作并沒(méi)有結(jié)束,,最終還要把音頻文件以二進(jìn)制數(shù)據(jù)的形式讀出來(lái)輸送到Android手機(jī)界面上。首先把音頻文件以列表的形式顯示出來(lái)(即顯示在ListActivity界面下),,點(diǎn)擊采集到的文件MyFile66315.pcm,,即以讀的形式打開(kāi)文件,并把存在文件中的數(shù)據(jù)以二進(jìn)制的形式輸送到波形顯示界面上(即本文的WaveFormActivity界面),。波形顯示界面如圖8所示,。至此使用Android手機(jī)麥克端實(shí)現(xiàn)數(shù)據(jù)采集并顯示的工作已經(jīng)完成。
選擇用手機(jī)的麥克端來(lái)采集數(shù)據(jù)主要是為了不僅僅只能通過(guò)USB,、藍(lán)牙等的數(shù)據(jù)采集方法,而開(kāi)拓出一種新型的數(shù)據(jù)采集方法,。使用手機(jī)的麥克端來(lái)采集數(shù)據(jù),,要通過(guò)硬件電路把所要采集的數(shù)據(jù)信號(hào)轉(zhuǎn)換成音頻信號(hào),才能被麥克端采集到,。使用Android手機(jī)平臺(tái),,可以在界面的設(shè)計(jì)上下一番功夫,設(shè)計(jì)出自己喜好的界面,,與一般的顯示器相比,,Android界面更加小巧美觀,在未來(lái),,Android平臺(tái)勢(shì)必會(huì)在各行各業(yè)中發(fā)揮其巨大的作用,。
參考文獻(xiàn)
[1] 李楊,馮剛,,李亮,,等.基于Android的多媒體開(kāi)發(fā)與研究[J].計(jì)算機(jī)與現(xiàn)代化,2011(4):149-152.
[2] 王向輝,張國(guó)印,,沈潔.Android應(yīng)用程序開(kāi)發(fā),,第1版[M]. 北京:清華大學(xué)出版社,2010.
[3] 劉金華,,皮大能,,程彩云.LM331與PIC16F73單片機(jī)實(shí)現(xiàn)數(shù)據(jù)采集[J].自動(dòng)化技術(shù)與應(yīng)用,2009,,28(11):116-119.
[4] 翟彥.基于LM331和單片機(jī)的壓力數(shù)據(jù)采集[J].電子設(shè)計(jì)工程,,2009,19(3):95-97.