你可以使用广义互相关( Generialized Cross-Correlation )来估计一个信号达到两个传感器的时间延迟。比如应用麦克风阵列来确定声源方位的应用背景。问题可以用以下模型来描述:
r 1 ( t ) = s ( t ) + n 1 ( t ) r_1 \left( t \right) = s\left( t \right) + n_1 \left( t \right) r1(t)=s(t)+n1(t) r 2 ( t ) = s ( t − D ) + n 2 ( t ) r_2 \left( t \right) = s\left( {t - D} \right) + n_2 \left( t \right) r2(t)=s(t−D)+n2(t)
其中 s ( t ) s\left( t \right) s(t)是声音信号, n 1 ( t ) , n 2 ( t ) n_1 \left( t \right),n_2 \left( t \right) n1(t),n2(t)是两个声音传感器检测噪声,D就是声音信号在两个麦克风传感器上的到达时间差(TDOA),或称为时间延迟(Time Lag),表示以一个传感器为基准,信号到达另一个传感器的延迟。
通常假设声音信号 s ( t ) , n 1 ( t ) , n 2 ( t ) s\left( t \right),n_1 \left( t \right),n_2 \left( t \right) s(t),n1(t),n2(t)是广义稳定随机过程且三者之间不相关。可以使用两个传感器获得信号之间的互相关最大化来得到该时间延迟。
R 1 , 2 ( τ ) = E { r 1 ( t ) ⋅ r 2 ( t + τ ) } D ^ = arg max τ R 1 , 2 ( τ ) \begin{aligned} R_{1,2} \left( \tau \right) = E\left\{ {r_1 \left( t \right) \cdot r_2 \left( {t + \tau } \right)} \right\}\\\hat D = \mathop {\arg \max }\limits_\tau R_{1,2} \left( \tau \right)\\\end{aligned} R1,2(τ)=E{r1(t)⋅r2(t+τ)}D^=τargmaxR1,2(τ)
在实际应用中, r 1 ( t ) , r 2 ( t ) r_1 \left( t \right),r_2 \left( t \right) r1(t),r2(t)通常都是采集到的有限长 T T T的信号,因此 s ( t ) , n 1 ( t ) , n 2 ( t ) s\left( t \right),n_1 \left( t \right),n_2 \left( t \right) s(t),n1(t),n2(t)只要在时间 T T T内近似保持平稳和不相关即可。两个信号的互相关可以通过下面公式进行估计: R ^ 1 , 2 ( τ ) = 1 T − τ ∫ t T x 1 ( t ) ⋅ x ( t − τ ) d τ \hat R_{1,2} \left( \tau \right) = {1 \over {T - \tau }}\int_t^T {x_1 \left( t \right) \cdot x\left( {t - \tau } \right)d\tau } R^1,2(τ)=T−τ1∫tTx1(t)⋅x(t−τ)dτ
通过两个相距 L L L的传感器上所得到的信号到达时间差 τ \tau τ(TDOA),可以计算出声音的方向: sin β = c ⋅ τ L \sin \beta = {{c \cdot \tau } \over L} sinβ=Lc⋅τ
▲ 声源方向与两个相距d的传感器之间的TDOA之间的关系
公式中的 c c c是声音在空气中传播的速度。
如果声音信号 s ( t ) s\left( t \right) s(t)的频谱很宽,那么它的自相关信号就会呈现处非常窄带的尖峰,使用前面估算TDOA的公式就可以得到非常好的结果。比如Chirp信号就是一个宽带声音信号。下面是 Chirp 信号就是应用在智能车信标组的导航声音信号,它的频率范围是250Hz~2000Hz。下面是叠加有五倍幅值噪声的两个版本。
▲ Chirp信号以及两个叠加有5倍幅值随机噪声的信号
下面给出了是两个带有很大噪声的Chirp信号互相关之后的结果。得益于Chirp信号的宽带,尽快两个信号带有的噪声非常大,但相关后的峰值还是依然非常明显。
▲ 将两个叠加有随机噪声的Chirp信号互相关结果。上:全部的互相关;下:将中心峰值展开的结果
如果信号不是宽带信号,则使用普通的互相关所检测到的峰值就会不明显,而且受到噪声影响很大。
比如下面是一个带宽只有100Hz(1900~2000Hz)的Chirp信号。叠加有幅度只有0.25的随机噪声。
▲ 频带宽度只有1900~2000Hz的Chirp信号及其带有噪声的版本
下面是计算得到的信号的互相关波形。展开之后可以看到它的峰值就不是非常明显,而且在峰值附近受到噪声的影响会出现左右的偏移。
▲ 使用普通互相关得到的结果
使用广义互相关(GCC:Generallized Cross-Correlation)可以提高检测的精度。
S ( f ) = ∫ − ∞ ∞ R ( τ ) ⋅ e − j 2 π f τ d τ S\left( f \right) = \int_{ - \infty }^\infty {R\left( \tau \right) \cdot e^{ - j2\pi f\tau } d\tau } S(f)=∫−∞∞R(τ)⋅e−j2πfτdτ R ~ ( τ ) = ∫ S ( f ) ∣ S ( f ) ∣ e + j 2 π f τ d f \tilde R\left( \tau \right) = \int_{}^{} {{{S\left( f \right)} \over {\left| {S\left( f \right)} \right|}}e^{ + j2\pi f\tau } df} R~(τ)=∫∣S(f)∣S(f)e+j2πfτdf D ~ = arg max τ R ~ ( τ ) \tilde D = \mathop {\arg \max }\limits_\tau \tilde R\left( \tau \right) D~=τargmaxR~(τ)
下面就是使用GCC-PHAT重新计算上面窄带Chirp信号的互相关,可以看到所得到的相关峰值就大大改善了。从而提高了计算的精度。
▲ 使用广义互相关相位变换(GCC-PHAT)计算得到的互相关结果