隨著單片機(jī)集成化程度的不斷提高,,現(xiàn)代單片機(jī)已經(jīng)具備了數(shù)字信號處理功能,,使語音信號處理用單片機(jī)實現(xiàn)成為可能,。臺灣凌陽科技公司(SunPlus)推出的一款SPCE061A就是這樣的產(chǎn)品,。SPCE061A是以μ'nSP TM16位微控制器及信號處理器芯片為內(nèi)核的16位單片機(jī),,采用模塊式集成結(jié)構(gòu),片內(nèi)集成了2KB RAM,、32KB Flash,、ADC、DAC,、并行I/O等,,特別適合語音信號處理。本文介紹如何實現(xiàn)用SPCE061A單片機(jī)采集語音信號,,并傳送到PC機(jī)中的方法,。
1 硬件系統(tǒng)結(jié)構(gòu)
1.1 SPCE061A結(jié)構(gòu)
SPCE061A的內(nèi)部結(jié)構(gòu)如圖1,其特點(diǎn)如下:
*16位μ'nSP TM微控制器,;
*工作電壓:VDD為2.6~3.6V(CPU),VDDH為VDD~5.5V(I/O),;
*CPU時鐘為0.32~49.152MHz;
*內(nèi)置存儲器:SRAM為2KB,,內(nèi)存Flash為32KB,;
*可編程音頻處理;
*2個16位可編程定時器/計數(shù)器,;
*7通道10位ADC(內(nèi)置麥克風(fēng)放大和自動增益控制功能),;
*2個10位DAC;
*32路可編程通用輸入輸出端口,;
*串行輸入輸出接口,;
*低電壓監(jiān)測/低電壓復(fù)位功能;
*14個中斷源可來自定時器,、外部時鐘輸入,、鍵喚醒等;
*內(nèi)置在線仿真電路ICE,。
1.2 SPCE061A開發(fā)方法
SPCE061A的開發(fā)是通過在線調(diào)試器PROBE實現(xiàn)的,,如圖2所示。它利用了SPCE061A內(nèi)置的在線仿真電路ICE和凌陽公司的在線串行編程技術(shù),。如果讀者想要使用該芯片及開發(fā)系統(tǒng),,可上網(wǎng)www.unsp.com.cn查詢,并尋求大學(xué)計劃的免費(fèi)支持,。
1.3 語音采集的硬件電路
語音采集的硬件電路如圖3所示,。MIC采用駐極體電容話筒,這種話筒具有靈敏度高,、無方向性,、重量輕、體積小,、頻率響應(yīng)寬,、保真度好等優(yōu)點(diǎn)。
與PC機(jī)的串行通信用SPCE061A的UART接口,用MAX232芯片進(jìn)行電平轉(zhuǎn)換,,即可實現(xiàn)RS232通信,。
2 軟件設(shè)計與實現(xiàn)
2.1 語音信號的采集壓縮與數(shù)據(jù)傳輸
(1)語音信號的采集壓縮
語音信號處理的基礎(chǔ)是對語音信號進(jìn)行數(shù)字化,并采樣存儲,。SRCE061A內(nèi)置專門用于語音信號采集的自動增益控制放大器(AGC)的麥克風(fēng)輸入通道(MIC_IN),。語音信號經(jīng)麥克轉(zhuǎn)換成電信號,由隔離電容隔掉直流成分,,然后輸入至內(nèi)部前置放大器,。SPCE061A內(nèi)部自動增益控制電路AGC能隨時跟蹤、監(jiān)視前置放大器輸出的音頻信號電平,,當(dāng)輸入信號增器時,,AGC電路自動減小放大器的增益;當(dāng)輸入信號減小時,,AGC電路自動增大放大器的增益,,以便使進(jìn)入A/D的信號保持在最佳電平,又可使諧波減至最小,。
ADC初始化程序如下:
INT OFF,;
R1=0x0030;
[P_TimerA_Ctrl]=R1,;
//時鐘頻率為CLKA的fosc/2
R1=0xfa00,;
[P_TimerA_Data]=R1;
//采樣率為16kHz
R1=0x003d;
[P_ADC_Ctrl]=R1,; //設(shè)置AGC功能
R1=0x00A8;
[P_DAC_Ctrl]=R1; //采用自動方式且通過MIC_IN通道輸入,,通過定時器A的溢出鎖存數(shù)據(jù),ADC為自動方式
R1=0x1000;
[P_INT_Ctrl]=R1,; //開中斷IRQ1_TM
INT IRQ,;
圖3 語音采集的硬件連接圖
采樣后的數(shù)字語音信號數(shù)據(jù)量非常大,且由于語音信號采樣點(diǎn)幅度分布的非均勻性和樣本間的相關(guān)性等原因,,使語音信號中含有大量的冗余信息,。因此,,在實際應(yīng)用中采用各種信源編碼技術(shù)來消除語音信號的冗余度,。語音編碼方法主要有波形編碼、參數(shù)編碼和混合編碼,。
*波形編碼的基本原理是以波形逼近為原則,,在時域上把幅度樣本分層量化并用代碼表示;特點(diǎn)是語音質(zhì)量高,、抗噪性強(qiáng)編碼率高,,適于語音及高保真音樂。
*參數(shù)編碼是基于某種語音產(chǎn)生模型,在編程端分析出該模型參數(shù)選擇適當(dāng)?shù)姆绞竭M(jìn)行編碼,;特點(diǎn)是語音質(zhì)量差,、抗噪抗弱和編碼率低。
*混合編碼綜合了波形和參數(shù)編碼之優(yōu)點(diǎn),。
凌陽SPCE061A提供了壓縮算法庫——SACMLIB(見表1),,其處理的語音信號范圍是200Hz~3.4kHz的電話語音,并將A/D,、編/解碼,、存儲及D/A做成相應(yīng)的模塊,對于每個模塊都有其應(yīng)用程序接口API,。
表1 SACM-LIB庫中模塊及其算法
模塊名稱 壓縮算法 采樣率/kHz 語音壓縮編碼率/Kb/s 用 途 SACM_A2000 子帶編碼 16 16,、20、24 播放語音及高保真音樂 SACM_S480/S720 CELP混合編碼 16 4.8,、7.2 播音 SACM_S240 參數(shù)編碼 24 2.4 播音 SACM_MS01 FM音樂合成 16 16,、20、24 音樂合成 SACM_DVR 子帶編碼 16 16Kb/s的傳輸率,,8Ksps的采樣率 ADC信道錄音和DAC放音
(2)語音數(shù)據(jù)的傳輸
SPCE061A的通用異步串口(UART)提供了一個8位全雙工標(biāo)準(zhǔn)接口,,用于完成SPCE061A與外設(shè)之間的串行通信。借助于IOB口的特殊功能和UART IRQ中斷,,可以同時完成UART接口的接收與發(fā)送數(shù)據(jù)的過程,。根據(jù)應(yīng)用需求,把UART設(shè)置為中斷方式接收數(shù)據(jù),,以查詢方式發(fā)送數(shù)據(jù),。
UART初始化程序InitUART()見網(wǎng)絡(luò)補(bǔ)充版(http://www.dpj.com.cn)。
2.2 上位機(jī)控制和存儲模塊
目前,,Mircosoft公司的VC++6.0是基于Windows程序設(shè)計的主流開發(fā)工具之一,。VC++不僅秉承了C++簡便、靈活及面向?qū)ο蟮葍?yōu)點(diǎn),,而且提供了功能強(qiáng)大的MFC類庫,,并能自動生成應(yīng)用程序框架,提供標(biāo)準(zhǔn)化的程序結(jié)構(gòu)和用戶接口,。特別需要指出的是,,為了今后調(diào)用低層的音頻處理API函數(shù),對由下位上傳的音頻數(shù)據(jù)進(jìn)一步進(jìn)行語音識別方面的處理,,我們使用VC來編寫上位機(jī)的控制及存儲程序,。
在實驗室和工業(yè)應(yīng)用中,RS232串口是常用的計算機(jī)與外部串行設(shè)備(單片機(jī))之間的數(shù)據(jù)傳輸通道,,由于串行通信簡單易用,,所以應(yīng)用廣泛。通常在VC++中有三種方法可以實現(xiàn)串行通信:
*使用VC++的標(biāo)準(zhǔn)通信函數(shù)_inp和_outp來實現(xiàn)串口通信;
*把串口看成是一個特殊的設(shè)備文件,,使用有關(guān)文件處理的API函數(shù)來實現(xiàn)串口通信,;
*使用ActiveX的串行通信控件MSComm來實現(xiàn)串口通信。
對于本實例來說,,主要考慮的因素是實時語音數(shù)據(jù)存取,,以及位機(jī)與下位機(jī)的配合。因此,,采用了串行通信MSComm控件方法來實現(xiàn)串口通信,。另外,可以采用二進(jìn)制流文件Cfile類來存儲聲音文件,。具體步驟見網(wǎng)絡(luò)補(bǔ)充版,。
通過以上實例錄制的語音數(shù)據(jù),可以從PC機(jī)下載到SPCE061A中(或者作為資源文件放入工程中),,使用SACM_A2000模塊的函數(shù)播放驗證,,效果能夠滿足進(jìn)一步語音信號處理需要。
用凌陽SPCE061A處理語音信號有如下獨(dú)特之處:
*硬件電路簡單,,因SPCE061A是一款專門為語音信號處理設(shè)計的,,麥克和喇叭可直接接入,用戶不必外接放大電路等,;
*軟件編程容易,,有相應(yīng)的API函數(shù),可直接調(diào)用,。
*用ICE和圖形界面編譯軟件,,調(diào)試方便。