基于广义二次互相关的信号时延估计算法

前言

       广义互相关(Generalized Cross Correlation,GCC)利用权函数有效提高了信号时延估计精度,但是抗噪声性能有限,当信噪比较低时,算法性能急剧下降。针对这一问题,广义二次互相关得到了广泛应用,本文将对这一算法的原理以及代码实现进行总结。

广义二次互相关

       信号时延模型以及一次互相关算法可以参考我的另一篇文章:信号时延估计算法—Gcc-Phat原理及实现。

       所谓二次互相关,顾名思义,即做两次互相关运算。具体表现为:先对信号进行自相关和互相关运算,然后利用得到的自相关和互相关函数,再进行一次互相关运算,以提高信号抗噪声鲁棒性。

       针对如下两个信号:

x_1 (t)=s(t)+n_1 (t)

x_2 (t)=s(t-\tau _{12}) +n_2 (t)

       首先对x_1 (t)作自相关以及对x_1 (t)x_2 (t)作互相关。

R_{x1x1}=E\left \{ x_1(t)x_1(t-\tau)\right \}

R_{x1x2}=E\left \{ x_1(t)x_2(t-\tau)\right \} 

       根据噪声假设为零均值的高斯噪声且与信号互不相关,可推得

R_{x1x1}=R_{ss}(\tau )

以及

R_{x1x2}=R_{ss}(\tau -\tau _{12})

        然后再对这两个相关函数作互相关

R_{R_{x1x1}R_{x1x2}}=E\left \{ R_{x1x1}(t)R_{x1x2}(t-\tau)\right \}

        最终得到

R_{R_{x1x1}R_{x1x2}}=R_{Rs}(\tau -\tau _{12})

        同样由互相关函数性质可知,当\tau =\tau _{12}时,R_{R_{x1x1}R_{x1x2}}取最大值,即两个麦克风之间的时延。再加上合适的权函数,即可实现广义二次互相关算法。

        流程可总结如下:

基于广义二次互相关的信号时延估计算法_第1张图片

  算法实现

        基于上述理论,本文在频域实现广义二次互相关算法,仅供参考。

        输入:信号x1、x2,采样频率fs,信号长度N

        输出:信号x1、x2的时延

function delay = Gqcc(x1,x2,fs,N)

% 自相关
x1dft = fft(x1);
Gx1x1 = x1dft.*conj(x1dft);

% 互相关
x2dft = fft(x2);
Gx1x2 = x1dft.*conj(x2dft);

% 二次互相关
G = Gx1x1.*conj(Gx1x2);

% ROTH加权
w = 1./Gx1x1;
Gw = G.*w;

R12 = ifft(Gw);
R12_shift = fftshift(R12);

[~, idx] = max(abs(R12_shift));

sIndex = -N/2 : N/2-1;
delay = -sIndex(idx)/fs;

测试验证

       接下来仿真生成两个存在时延的信号,并使用上述函数进行时延估计

load gong;
N = numel(y);
tau = 1;
x = delayseq(y,tau,Fs);
delay = Gqcc(x,y,Fs,N);

>> delay = 1

输出估计时延与理论值一致,验证了编写算法的正确性。

算法性能对比

       前面提到二次互相关能够提升抗噪声性能,下面将其与一次互相关算法进行对比。

       同样使用上述两个信号,在信号x中加入白噪声。然后进行1000次蒙特卡洛对比这两种算法,结果如下图:

基于广义二次互相关的信号时延估计算法_第2张图片

       显然,由于噪声较大,一次互相关算法的性能急剧下降,而二次互相关的估计精度依然较高,验证了该算法的抗噪声性能。

结语

       感兴趣的可以继续深入探索互相关算法在实际应用中的性能,也欢迎与我私信交流。

总结不易,点个赞吧(●'◡'●)

你可能感兴趣的:(信号处理,时延估计,声源定位,算法)