季衛(wèi)松
(南京萊斯信息技術(shù)股份有限公司,江蘇 南京 210007)
語音信號端點(diǎn)檢測硬件電路由TI公司的TLV320-AIC23語音輸入集成電路、TI公司數(shù)字信號處理器TMS320F28335及外圍接口電路組成,其硬件架構(gòu)如圖1所示。
來自電話的語音信號輸入TLV320AIC23語音集成電路,經(jīng)A/D轉(zhuǎn)換后,進(jìn)入數(shù)字信號處理器TMS320F28335進(jìn)行能量運(yùn)算,同時經(jīng)過TLV320AIC23集成電路進(jìn)行D/A轉(zhuǎn)換,將語音輸入至電臺。當(dāng)語音到來時,處理器的一個GPIO端口設(shè)置為低電平,將電臺的鍵控PTT電平拉低,觸發(fā)電臺發(fā)射;當(dāng)語音結(jié)束時,處理器的一個GPIO端口設(shè)置為高電平,將電臺的鍵控PTT電平拉高,關(guān)閉電臺功率放大器,電臺將處于收聽值守狀態(tài)。
圖1 語音信號端點(diǎn)檢測硬件電路架構(gòu)圖
TMS320F28335[1]是TI公司一款高性能、采用靜態(tài)CMOS技術(shù)的32位高速數(shù)字信號處理器,CPU最高時鐘150 MHz,內(nèi)置單精度浮點(diǎn)運(yùn)算FPU單元,6個通道總線總裁控制器DMA,主要用于ADC、McBSP、ePWM、XINF及SARAM之間的數(shù)據(jù)高速傳輸。先進(jìn)的哈佛總線架構(gòu),程序空間、數(shù)據(jù)空間、特殊寄存器、外設(shè)控制寄存器統(tǒng)一編址,映射成連續(xù)的地址空間,極大地方便編程人員編寫程序代碼。
TLV320AIC23是TI公司推出的高性能立體聲音頻編解碼器,采用先進(jìn)的過采樣技術(shù),可以在8~96 kHz的采樣率下提供16 bit、20 bit、24 bit、32 bit的采樣數(shù)據(jù)。內(nèi)置數(shù)字濾波器,ADC和DAC的輸出信噪比可達(dá)90 dB和 100 dB[2]。支持麥克風(fēng)輸入和線路輸入,輸入和輸出具有可編程的增益調(diào)節(jié)功能。TLV320AIC23具有SPI總線和多通道緩沖串口(McBSP),是與TI公司DSP相配套的專用語音處理集成電路。
一般電話和無線電臺的通話,一句話大概0.5~20 s不等,然后是幾秒的間隔停頓休息。如果使用短時能量法來檢測語音信號的端點(diǎn),必須將一句話的語音分成若干塊,每塊大約50 ms。通常處理器TMS320F28335通過SPI總線將TLV320AIC23的ADC采樣率設(shè)定為44.1 kHz。為了簡化軟件代碼,設(shè)定塊的時間長度為68 ms,即采樣3 000個語音序列的時間。
為了加快運(yùn)算速度,減小延遲,在軟件處理上,采用滑動窗的方式,窗口的寬度為3 000個語音序列,即語音塊的時間為68 ms,每處理完3 000個數(shù)據(jù),滑動到下一窗數(shù)據(jù)。3 000點(diǎn)語音序列劃分為100幀,每幀為30個語音數(shù)據(jù)。每幀的能量為根據(jù)每幀的能量判定語音端點(diǎn),語音信號端點(diǎn)檢測的滑動窗策略如圖2所示。
由圖2中可知,第1窗的數(shù)據(jù)需要至少68 ms處理時間,當(dāng)一段語音送入電臺時,鍵控PTT需要延時68 ms啟動電臺發(fā)射。電話語音轉(zhuǎn)接電臺發(fā)射時,遠(yuǎn)端的電臺收到的語音,68 ms字頭將缺失,但不會影響完整的語義。
圖2 語音信號端點(diǎn)檢測的滑動窗圖
TMS320F28335的外設(shè)多通道緩沖串口(McBSP)具有中斷功能,當(dāng)多通道緩沖串口數(shù)據(jù)接收滿時將觸發(fā)中斷,在中斷函數(shù)中,用戶代碼讀取語音信號的ADC轉(zhuǎn)換值。
需要定義一個全局變量,即狀態(tài)機(jī)計(jì)數(shù)器(STATUS_CNT)。每次執(zhí)行讀取語音引號ADC的轉(zhuǎn)換值的中斷函數(shù),狀態(tài)機(jī)計(jì)數(shù)器累計(jì)加1,根據(jù)狀態(tài)計(jì)數(shù)器的值,程序需要做如下任務(wù)。
(1)每次執(zhí)行讀取語音信號ADC的轉(zhuǎn)換值的中斷函數(shù),狀態(tài)計(jì)數(shù)器累計(jì)加1,當(dāng)達(dá)到3 000時,狀態(tài)機(jī)計(jì)數(shù)器置位1。
(2)將包含30個序列的語音信號幀的能量進(jìn)行迭代,結(jié)果儲存在模為100的數(shù)組中。
(3)判斷每幀的能量,當(dāng)大于設(shè)定的閾值,變量nCNT累計(jì)加1,當(dāng)該變量大于20時,斷定語音到來,小于20時,沒有語音。
圖3為語音信號的端點(diǎn)檢測軟件算法流程圖[3]。
圖3 語音信號端點(diǎn)檢測軟件算法流程圖
根據(jù)語音信號端點(diǎn)檢測軟件算法流程,實(shí)現(xiàn)的代碼如下:
int STATUS_CNT=0; //定義狀態(tài)機(jī)計(jì)數(shù)器;
int temp=0; //定義全局變量,去讀ADC轉(zhuǎn)換結(jié)果;
int nPower=0; //定義全局變量,用于語音幀能量迭代;
int nPower_cnt[100]; //定義模為100的數(shù)組,轉(zhuǎn)存語音幀的能量;
int nCNT=0; //定義全局變量,用于判斷語音是否到來;
在讀取語音信號ADC的轉(zhuǎn)換值的中斷函數(shù),實(shí)現(xiàn)的代碼:
STATUS_CNT=STATUS_CNT+1; // 狀態(tài)機(jī)計(jì)數(shù)器累計(jì)加1;
temp=McbspaRegs.DRR1.all; // 讀取ADC語音信號的轉(zhuǎn)換結(jié)果;
nPower=nPower+temp*temp; // 迭代,能量儲存;
if(STATUS_CNT==30)
{
nPower_cnt[0]=nPower; //能量轉(zhuǎn)存數(shù)組;
nPower=0; //一定要清零,用于下幀能量的迭代;
}
if(STATUS_CNT==60)
{
nPower_cnt[1]=nPower; //能量轉(zhuǎn)存數(shù)組;
nPower=0; //一定要清零,用于下幀能量的迭代;
}
if(STATUS_CNT==3 000)
{
nPower_cnt[99]=nPower; //所有幀的能量全部轉(zhuǎn)存數(shù)組;
nPower=0; //一定要清零,用于第下幀能量的迭代;
STATUS_CNT=1; //狀態(tài)機(jī)計(jì)數(shù)器置位1,滑動下一窗數(shù)據(jù);
for(j=0;j<100;j++) {if(nPower_cnt[j]>10 000)nCNT=nCNT+1;}
if(nCNT>20)PTT_OUT=0; else PTT_OUT=1; //觸發(fā)PTT
//如果100個語音幀能量,其中大于1 000的個數(shù)超過20個,斷定語音到來。
}
使用數(shù)字信號處理器TMS320F28335來檢測語音信號的端點(diǎn),運(yùn)算速度快,延時小,輸入至無線電臺的鍵控PTT幾乎與語音同步。