赞
踩
广义互相关(Generalized Cross Correlation,GCC)利用权函数有效提高了信号时延估计精度,但是抗噪声性能有限,当信噪比较低时,算法性能急剧下降。针对这一问题,广义二次互相关得到了广泛应用,本文将对这一算法的原理以及代码实现进行总结。
信号时延模型以及一次互相关算法可以参考我的另一篇文章:信号时延估计算法—Gcc-Phat原理及实现。
所谓二次互相关,顾名思义,即做两次互相关运算。具体表现为:先对信号进行自相关和互相关运算,然后利用得到的自相关和互相关函数,再进行一次互相关运算,以提高信号抗噪声鲁棒性。
针对如下两个信号:
首先对
根据噪声假设为零均值的高斯噪声且与信号互不相关,可推得
以及
然后再对这两个相关函数作互相关
最终得到
同样由互相关函数性质可知,当时,
流程可总结如下:
基于上述理论,本文在频域实现广义二次互相关算法,仅供参考。
输入:信号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次蒙特卡洛对比这两种算法,结果如下图:
显然,由于噪声较大,一次互相关算法的性能急剧下降,而二次互相关的估计精度依然较高,验证了该算法的抗噪声性能。
感兴趣的可以继续深入探索互相关算法在实际应用中的性能,也欢迎与我私信交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。