季衛松
(南京萊斯信息技術股份有限公司,江蘇 南京 210007)
語音信號端點檢測硬件電路由TI公司的TLV320-AIC23語音輸入集成電路、TI公司數字信號處理器TMS320F28335及外圍接口電路組成,其硬件架構如圖1所示。
來自電話的語音信號輸入TLV320AIC23語音集成電路,經A/D轉換后,進入數字信號處理器TMS320F28335進行能量運算,同時經過TLV320AIC23集成電路進行D/A轉換,將語音輸入至電臺。當語音到來時,處理器的一個GPIO端口設置為低電平,將電臺的鍵控PTT電平拉低,觸發電臺發射;當語音結束時,處理器的一個GPIO端口設置為高電平,將電臺的鍵控PTT電平拉高,關閉電臺功率放大器,電臺將處于收聽值守狀態。

圖1 語音信號端點檢測硬件電路架構圖
TMS320F28335[1]是TI公司一款高性能、采用靜態CMOS技術的32位高速數字信號處理器,CPU最高時鐘150 MHz,內置單精度浮點運算FPU單元,6個通道總線總裁控制器DMA,主要用于ADC、McBSP、ePWM、XINF及SARAM之間的數據高速傳輸。先進的哈佛總線架構,程序空間、數據空間、特殊寄存器、外設控制寄存器統一編址,映射成連續的地址空間,極大地方便編程人員編寫程序代碼。
TLV320AIC23是TI公司推出的高性能立體聲音頻編解碼器,采用先進的過采樣技術,可以在8~96 kHz的采樣率下提供16 bit、20 bit、24 bit、32 bit的采樣數據。內置數字濾波器,ADC和DAC的輸出信噪比可達90 dB和 100 dB[2]。支持麥克風輸入和線路輸入,輸入和輸出具有可編程的增益調節功能。TLV320AIC23具有SPI總線和多通道緩沖串口(McBSP),是與TI公司DSP相配套的專用語音處理集成電路。
一般電話和無線電臺的通話,一句話大概0.5~20 s不等,然后是幾秒的間隔停頓休息。如果使用短時能量法來檢測語音信號的端點,必須將一句話的語音分成若干塊,每塊大約50 ms。通常處理器TMS320F28335通過SPI總線將TLV320AIC23的ADC采樣率設定為44.1 kHz。為了簡化軟件代碼,設定塊的時間長度為68 ms,即采樣3 000個語音序列的時間。
為了加快運算速度,減小延遲,在軟件處理上,采用滑動窗的方式,窗口的寬度為3 000個語音序列,即語音塊的時間為68 ms,每處理完3 000個數據,滑動到下一窗數據。3 000點語音序列劃分為100幀,每幀為30個語音數據。每幀的能量為根據每幀的能量判定語音端點,語音信號端點檢測的滑動窗策略如圖2所示。
由圖2中可知,第1窗的數據需要至少68 ms處理時間,當一段語音送入電臺時,鍵控PTT需要延時68 ms啟動電臺發射。電話語音轉接電臺發射時,遠端的電臺收到的語音,68 ms字頭將缺失,但不會影響完整的語義。

圖2 語音信號端點檢測的滑動窗圖
TMS320F28335的外設多通道緩沖串口(McBSP)具有中斷功能,當多通道緩沖串口數據接收滿時將觸發中斷,在中斷函數中,用戶代碼讀取語音信號的ADC轉換值。
需要定義一個全局變量,即狀態機計數器(STATUS_CNT)。每次執行讀取語音引號ADC的轉換值的中斷函數,狀態機計數器累計加1,根據狀態計數器的值,程序需要做如下任務。
(1)每次執行讀取語音信號ADC的轉換值的中斷函數,狀態計數器累計加1,當達到3 000時,狀態機計數器置位1。
(2)將包含30個序列的語音信號幀的能量進行迭代,結果儲存在模為100的數組中。
(3)判斷每幀的能量,當大于設定的閾值,變量nCNT累計加1,當該變量大于20時,斷定語音到來,小于20時,沒有語音。
圖3為語音信號的端點檢測軟件算法流程圖[3]。

圖3 語音信號端點檢測軟件算法流程圖
根據語音信號端點檢測軟件算法流程,實現的代碼如下:
int STATUS_CNT=0; //定義狀態機計數器;
int temp=0; //定義全局變量,去讀ADC轉換結果;
int nPower=0; //定義全局變量,用于語音幀能量迭代;
int nPower_cnt[100]; //定義模為100的數組,轉存語音幀的能量;
int nCNT=0; //定義全局變量,用于判斷語音是否到來;
在讀取語音信號ADC的轉換值的中斷函數,實現的代碼:
STATUS_CNT=STATUS_CNT+1; // 狀態機計數器累計加1;
temp=McbspaRegs.DRR1.all; // 讀取ADC語音信號的轉換結果;
nPower=nPower+temp*temp; // 迭代,能量儲存;
if(STATUS_CNT==30)
{
nPower_cnt[0]=nPower; //能量轉存數組;
nPower=0; //一定要清零,用于下幀能量的迭代;
}
if(STATUS_CNT==60)
{
nPower_cnt[1]=nPower; //能量轉存數組;
nPower=0; //一定要清零,用于下幀能量的迭代;
}
if(STATUS_CNT==3 000)
{
nPower_cnt[99]=nPower; //所有幀的能量全部轉存數組;
nPower=0; //一定要清零,用于第下幀能量的迭代;
STATUS_CNT=1; //狀態機計數器置位1,滑動下一窗數據;
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; //觸發PTT
//如果100個語音幀能量,其中大于1 000的個數超過20個,斷定語音到來。
}
使用數字信號處理器TMS320F28335來檢測語音信號的端點,運算速度快,延時小,輸入至無線電臺的鍵控PTT幾乎與語音同步。