APP下载

基于TMS320F28335语音信号端点检测的硬件与软件设计

2019-10-16季卫松

通信电源技术 2019年9期
关键词:状态机计数器端点

季卫松

(南京莱斯信息技术股份有限公司,江苏 南京 210007)

1 语音信号端点检测硬件架构图

语音信号端点检测硬件电路由TI公司的TLV320-AIC23语音输入集成电路、TI公司数字信号处理器TMS320F28335及外围接口电路组成,其硬件架构如图1所示。

来自电话的语音信号输入TLV320AIC23语音集成电路,经A/D转换后,进入数字信号处理器TMS320F28335进行能量运算,同时经过TLV320AIC23集成电路进行D/A转换,将语音输入至电台。当语音到来时,处理器的一个GPIO端口设置为低电平,将电台的键控PTT电平拉低,触发电台发射;当语音结束时,处理器的一个GPIO端口设置为高电平,将电台的键控PTT电平拉高,关闭电台功率放大器,电台将处于收听值守状态。

图1 语音信号端点检测硬件电路架构图

2 数字信号处理器TMS320F28335及TLV320AIC23语音集成电路功能简介

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相配套的专用语音处理集成电路。

3 语音信号端点检测软件算法的设计

3.1 通话特征分析及处理策略

一般电话和无线电台的通话,一句话大概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 语音信号端点检测的滑动窗图

3.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 语音信号端点检测软件算法流程图

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个,断定语音到来。

}

4 结 论

使用数字信号处理器TMS320F28335来检测语音信号的端点,运算速度快,延时小,输入至无线电台的键控PTT几乎与语音同步。

猜你喜欢

状态机计数器端点
采用虚拟计数器的电子式膜式燃气表
例谈求解“端点取等”不等式恒成立问题的方法
五十一进制计数器的设计与仿真实现
基于有限状态机的交会对接飞行任务规划方法
不等式求解过程中端点的确定
基于Spring StateMachine的有限状态机应用研究
SR620型与53230A型计数器的性能测试
算盘是个“小气鬼”
基丁能虽匹配延拓法LMD端点效应处理
基于VHDL的一个简单Mealy状态机