背景
最近做刷牙声场分析的时候遇到这样一个问题:
同时采集了两个通道的声信号,其中一路,喉麦信号
那么如何解决时间同步的问题?通过分析这两路信号的特征,可以发现有以下特点:
在录制的过程中,物理世界发声的声源只有一个,因此两个MIC录到的一定是同一个振动产生的声信号,当这个振动源的特性发生改变时(如达到共振峰,或者瞬时能量为0),一定会在两个通道的信号中都有所体现,也就是说,虽然两路信号的绝对时间戳没有对齐,但是以声源的时间为参考,这两路信号在任意时刻的变化趋势一定是与发声源相同的。
以图1为例,在声源出现三次振荡时,可以观察到,T和B两个通道都记录到了三次振荡,只不过由于时延,B记录到的振荡是比T要稍微靠前的。直观来讲,如果B和T是同步的,那么当B达到峰值时,T也应该达到峰值;B达到0值时,T也应该达到0值,但是在图1中,以较为明显的第二次振荡为例,B达到峰值时,T等待了若干ms的时间才达到峰值。因此,在这个有偏差的系统中,B和T在任意时刻,有相同变化的趋势(B是峰值T也是峰值,B是0点T也是0点的趋势)都是比较小的。
这时我们就可以考虑,保持B不动,如果把信号T往前滑动几ms,那么B和T有相同变化的趋势就大一点;再往前移几ms,那么B和T有相同变化的趋势就又大一点.......那什么时候B和T有相同变化的趋势是最大的呢?
——没错,就是当B和T完全对齐的时候,这个时候,B和T永远是同步变化的,如果振动源到达了峰值,那么B和T同时为峰值,振动源为0,那么B和T就同时为0。
反过来思考,什么时候B和T是对齐的呢?
——就是当B和T有相同变化的趋势最大的时候!
因此,我们就有了对齐B和T这两路信号的比较Naive的算法:
保持其中一个通道的信号B不动,从左到右滑动另一通道的信号T,每滑动一步,就计算一下B和T的相同变化趋势,如果滑动到第n步时B和T的相同变化趋势达到了最大,这就说明B和T的时间差是n步(即n个采样点),那么把T平移n个采样点就可以与B对齐了。
实际上,上述思想就是信号分析中一个非常经典的方法:互相关分析(Cross-Correlation Analysis)。
互相关函数
我们都知道,在统计学里互相关用来表示两个随机向量