1. 基于能量的检测方法
这个能量指的是短时能量,原理就是近端说话的时候,理论上应该声音能量明显大于只有回声的时候。
1.1 GEIGEL算法
把扬声器输出的信号与麦克风采集到的信号做能量比较,采集到的信号如果能量高于输出信号的话,则说明一定有回声。除非麦克风有放大输入信号的作用。由于输入信号和播放信号之间有一定的时延,所以拿当前的输入信号和一段时间之内(取大于等于时延的最小值)的输出信号的最大值做对比,如果输入信号大于这个值,则认为有double talk。 当然精确的说,应该是取正好是从当前时间向前推时延个时间单位的扬声器输出信号和输入做对比。但。。。GEIGEL木有这么做。
例子代码在 https://www.ietf.org/mail-archive/web/avt/current/msg04629.html
int dtdNdx;
/* For Normalized Least Means Square - Pre-whitening */
#define NLMS_LEN (240*8) /* maximum NLMS filter length in taps
#define DTD_LEN 16 // block size in taps to optimize DTD