基于TMS320C6416的語音凈化系統(tǒng)
系統(tǒng)上電后,存儲(chǔ)在FLASH ROM中的程序?qū)⒀b入TMS320C6416的片內(nèi)RAM中,程序?qū)拇嫫?、中斷向量表和編碼進(jìn)行初始化并對(duì)片內(nèi)McBSP進(jìn)行配置,完成這些初始化的任務(wù)后系統(tǒng)采集并處理語音信號(hào).系統(tǒng)首先對(duì)目前狀態(tài)進(jìn)行辨識(shí).開機(jī)后的狀態(tài)分為非識(shí)別狀態(tài)和識(shí)別狀態(tài),非識(shí)別狀態(tài) 下系統(tǒng)將采集純正語音信號(hào),提取出語音特征送入存儲(chǔ)器中作為模板;識(shí)別狀態(tài)下首先參數(shù)考純凈語音的特征對(duì)采集的雙路混合信號(hào)進(jìn)行分離,獲得純凈的待別語音,最后送入識(shí)別系統(tǒng)完成語音識(shí)別.整個(gè)流程見圖4.
具體分離步驟在初始化之后,主函數(shù)程序進(jìn)入一個(gè)等待循環(huán),在一個(gè)新的采樣輸入被獲取之后與中斷服務(wù)程序(ISR)一起工作并調(diào)用分離程序.第一步,信號(hào)首先通過TI的DFT程序變換到頻域.系統(tǒng)使用最前面的幾個(gè)塊(例如取5塊)來估計(jì)輸入信號(hào)x1和x2每個(gè)頻率分量的功率矩陣.流程圖(見圖5)中的變量P表示正在處理的塊數(shù).對(duì)于接下來的每一塊(P≥5),系統(tǒng)通過指數(shù)平均來更新輸入信號(hào)的功率矩陣,以計(jì)算出梯度.然后計(jì)算步長(zhǎng)u12、u21和差分脈沖響應(yīng)濾波器ΔH12、ΔH21的更新系數(shù).最后確定更新系統(tǒng)和DRIR濾波器系數(shù),在頻域?qū)斎胄盘?hào)進(jìn)行初步分離.第二步,白化程序?qū)DICA輸出信號(hào)進(jìn)行白化處理,以去除信號(hào)的相關(guān)性.第三步,首先通過最小化非負(fù)代價(jià)函數(shù)計(jì)算分離濾波器矩陣和分離濾波器系數(shù),然后帶入白化后的信號(hào)求得TDICA輸出信號(hào).
2.3 代碼優(yōu)化
為了進(jìn)行實(shí)時(shí)的混合語音分離并識(shí)別,分離算法必須在盡可能短的時(shí)間(如1~2s)內(nèi)完成.在本系統(tǒng)中,通過CCS對(duì)C源代碼進(jìn)行編譯,并對(duì)分離算法的一些關(guān)鍵模塊從內(nèi)聯(lián)函數(shù)替換、數(shù)據(jù)讀寫、循環(huán)體優(yōu)化、函數(shù)拆并、C級(jí)優(yōu)化等方面進(jìn)行優(yōu)化設(shè)計(jì),以達(dá)到充分利用CPU、存儲(chǔ)器等資源,提高算法運(yùn)行速度,滿足實(shí)時(shí)性要求.
(1)內(nèi)聯(lián)函數(shù)優(yōu)化
通過內(nèi)聯(lián)函數(shù)替換提高代碼性能.內(nèi)聯(lián)函數(shù)直接與匯編指令相對(duì)應(yīng),通過使用它們,C編譯器能達(dá)到更好的編譯效果,并充分利用系統(tǒng)資源.C6416提供豐富的內(nèi)聯(lián)函數(shù),涵蓋了各種數(shù)據(jù)類型的乘、加、移位等操作.實(shí)驗(yàn)結(jié)果表明,內(nèi)聯(lián)函數(shù)替換是提高代碼性能最簡(jiǎn)單、直接有效的方法.
(2)數(shù)據(jù)讀寫優(yōu)化
充分利用C6416的雙字存儲(chǔ)指信和packing/unpacking方式提高代碼的運(yùn)行速度.
(3)循環(huán)體優(yōu)化
通過軟件流水工具(Software Pipeline)適當(dāng)安排循環(huán)指令,使多次迭代并行執(zhí)行,以達(dá)到優(yōu)化代碼的目的.
(4)函數(shù)拆并優(yōu)化
將某些大函數(shù)拆開成多個(gè)小函數(shù)或相反,以提高程序的運(yùn)行速度.對(duì)FDICA和TDICA等大程序中某些常用的分支,可將其拆分以減少判斷、跳轉(zhuǎn)操作.對(duì)于某些簡(jiǎn)單的小函數(shù),將其合并成大函數(shù)有助于減少程序調(diào)用開銷.
(5)C級(jí)優(yōu)化
在定點(diǎn)DSP上進(jìn)行浮點(diǎn)運(yùn)算會(huì)影響C源代碼的性能.因此,第一個(gè)優(yōu)化任務(wù)就是將源碼中運(yùn)算比較密集的部分(如分離濾波器矩陣和分離濾波器系數(shù)的計(jì)算)轉(zhuǎn)換成定點(diǎn)的算法.此外,影響系統(tǒng)性能的一個(gè)重要原因是沒有有效利用DSP的并行計(jì)算能力,TMS320C6416為最優(yōu)化這些并行操作的打包數(shù)據(jù)處理提供了特殊的指令.系統(tǒng)另一個(gè)瓶頸是對(duì)外部存儲(chǔ)器的訪問.對(duì)混合語音的分離需要處理大量的數(shù)據(jù),存儲(chǔ)和訪問可能是DSP系統(tǒng)的最大瓶頸.通過使用緩存可以緩解瓶頸,優(yōu)化在外部和內(nèi)部存儲(chǔ)中的數(shù)據(jù)定位可以提高系統(tǒng)的性能.最后,使用C編譯器的最優(yōu)化選項(xiàng)編譯代碼.
上述的優(yōu)化并非已經(jīng)完全,在后續(xù)的研究中代碼可以進(jìn)一步優(yōu)化,如可改進(jìn)以下幾處:首先,使用DMA以提高存儲(chǔ)器訪問的性能并減少存儲(chǔ)器消耗;其次,為了避免浮點(diǎn)溢出可以將代碼全部轉(zhuǎn)換為定點(diǎn),對(duì)代碼中的關(guān)鍵循環(huán)進(jìn)行更好的組織以實(shí)現(xiàn)軟件流水線;最后,為了最大程序提高性能可以使用線性匯編語言并對(duì)部分代碼進(jìn)行匯編層的優(yōu)化.
2.4 實(shí)驗(yàn)結(jié)果
采用兩組混合語音來測(cè)試,即單獨(dú)錄制兩個(gè)純凈的信號(hào)源,圖1所示模型用MATLAB混合(忽略噪聲),通過凈化系統(tǒng)得到兩級(jí)分離信號(hào)并與原始語音進(jìn)行比對(duì).x1(t)和x2(t)即為兩個(gè)麥克風(fēng)的輸入信號(hào).使用以下兩組聲音信號(hào)作為測(cè)試信號(hào),第一組為語音和音樂信號(hào),第二組為兩個(gè)語音信號(hào),都是16kHz采樣16bit單聲道文件,長(zhǎng)度均為7s.圖6與圖7分別為上述兩組混合語音的分離結(jié)果,從中可以看出分離效果非常令人滿意,達(dá)到了帶噪語音的凈化效果.
結(jié)語
在實(shí)驗(yàn)室環(huán)境引入語音凈化系統(tǒng)后,語音識(shí)別的速度雖然略有下降,但是識(shí)別語音的信噪比有顯著提高,在有不同信噪比的音樂和混響噪聲的背景中,識(shí)別率平均提高30%以上.
評(píng)論