这一项目是准确的找出DTMF信号的起点,当检测到后,触发DTMF decoder, 对此后接收的数据进行解码,等到相应的拨号键值。
1. 分析输入信号特征: 信号是DTMF信号加信道中的电路噪声,现初步分析,这背景噪声是高斯背景噪声,这种噪声好在对DTMF频率特性损失不是很大,这样问题会好解决一点。
2. 信号是由一个或一串 DTMF 信号,但处理情况一样。这有一个难点,就是在有背景噪声的情况下,能很准确的检测出信号的起始点,常用的端点检测算法可能会失效。常用算法是以帧为单位,一帧长128samples或256samples, 误差往往有一到五帧,但DTMF标准信号是一个拨号键声音持续100ms, 采样率为8KHz,也就是800samples, 其中只有400samples有信号, 剩下的是静音。这就得好好研究一下VAD算法,确保至少保留住每个拨号的信号75%的samples,也即200samples+400sample 静音,才能在后续DTMF decoder中解析出相应的数值。
3. 对算法的复杂度有要求,要实时对电话信道中的(P(CM+ 电路背景噪声的信号)进行检测。
4. 实现软件的结构要好好考虑一下,之间怎么个调用关系,数据流怎么流。初步分析:VAD 这个程序要一直运行,当检测到信道中有信号时,再去触发DTMF decoder, 经过DTMF decoder得到相应的键值或状态号。
While(1)
{
DTMF_real_VAD();
if(flag)
{
DTMF_Dec();
}
}
现分析这么多,到时边写代码再修改。