基于A(yíng)RM7TDMI內核SEP3203處理器的語(yǔ)音信號的軟件實(shí)時(shí)編解碼的實(shí)現
根據語(yǔ)音實(shí)時(shí)性的需要,設置UCB1400采樣速率為8 kb/s。該芯片用16位表示一個(gè)采樣點(diǎn),故采樣速率為128 kb/s。編碼后,每個(gè)采樣點(diǎn)用4位表示,故傳輸率為32 kb/s。
3.2 軟件系統
軟件流程如圖4所示。每幀數據為64個(gè)采樣點(diǎn),共計為128字節、16位表示的PCM碼,編碼后為32字節、4位表示的ADPCM碼。
圖4 編解碼的軟件流程
(1) 編碼
首先對系統初始化,包括對AC97、CODEC、DMAC等模塊配置,以及有關(guān)狀態(tài)變量的初始化。然后,采樣第1幀語(yǔ)音數據,采樣結束進(jìn)入DMA中斷,在中斷處理中再次配置DMAC,觸發(fā)新的采樣傳輸,并對剛采樣的數據編碼。由于編碼由內核執行,采樣由CODEC和DMA完成,故對第K幀編碼和對第K+1幀采樣是并發(fā)進(jìn)行的。
(2) 解碼
同編碼過(guò)程類(lèi)似,首先對系統進(jìn)行初始化,然后解碼第1幀音頻數據。解碼完配置DMAC,觸發(fā)數據傳送至AC97輸出FIFO,通過(guò)放音設備播放錄音。同樣,解碼第K+1幀數據與播放第K幀數據并發(fā)進(jìn)行。
本設計采用“雙Buffer”機制緩沖數據。“雙Buffer”是指:開(kāi)辟兩個(gè)幀緩沖區為Buf0、Buf1,緩沖標志Flg初始為0。編碼時(shí),采樣第1幀數據,DMA從AC97輸入FIFO向Buf0傳輸數據,傳 輸完后,設置Flg=1,編碼器從Buf0中取數據編碼;同時(shí),DMA向Buf1中傳送新數據。周而復始,每幀數據采樣完,設置Flg=!Flg,編碼器從Buf!Flg緩沖區取數據編碼,DMA傳送采樣數據的目的地址為Buf Flg,從而實(shí)現了第K+1幀數據采樣和第K幀數據編碼并發(fā)。只要編碼速度高于采樣速度,就不會(huì )出現數據的覆蓋。處理過(guò)程如下(解碼時(shí)的情況類(lèi)似):
4 性能優(yōu)化
語(yǔ)音處理的實(shí)時(shí)性要求很高,否則,若數據處理速度跟不上語(yǔ)音變化速度,就會(huì )在錄音時(shí)出現剛采樣的數據覆蓋了先采入但未處理的數據;在放音時(shí),出現播放的速度比實(shí)際語(yǔ)音慢。當然,如果用足夠大的緩沖,可以避免錄音出現的問(wèn)題,但放音出現的問(wèn)題是無(wú)法避免的。同時(shí),鑒于存儲資源對于嵌入式系統是很寶貴的,故此方案沒(méi)有實(shí)際價(jià)值。上文介紹的“雙Buffer”機制,能夠使采樣和編碼之間、解碼和播放之間分別互不影響、并發(fā)執行,易于控制;但要滿(mǎn)足實(shí)時(shí)性要求,還要使編解碼速度符合采樣和播放的要求。語(yǔ)音速率是8 KB/s,而系統中一個(gè)采樣點(diǎn)用16位表示,故編解碼速度不能低于16 KB/s(即每秒至少編碼16 KB的PCM碼,每秒至少解出16 KB的PCM碼)。表1是未對系統優(yōu)化前,測試裸機無(wú)操作系統情況下,處理512 KB的PCM碼(對應128 KB的ADPCM碼)所用時(shí)間。該測試是使用SoC內部定時(shí)器TIMER進(jìn)行的,見(jiàn)參考文獻。測試結果顯示,系統優(yōu)化前沒(méi)有滿(mǎn)足語(yǔ)音實(shí)時(shí)性要求。
到此,系統目標代碼都是在SDRAM中運行的。SEP3203提供了一個(gè)很有用的模塊——片內高速存儲器eSRAM。eSRAM存取速度非???,可達到0.89 MIPS/MHz,所以對系統性能有很大的優(yōu)化作用,而SDRAM卻只能有其性能的1/3左右。表2是在50 MHz時(shí)鐘、32位ARM指令情況下,SDRAM和eSRAM的性能比較。各項指標的意義見(jiàn)參考文獻。
評論