目录
[3.1 GCC‑PHAT广义互相关时延估计](#3.1 GCC‑PHAT广义互相关时延估计)
[3.2 球面插值SI闭式最小二乘粗定位](#3.2 球面插值SI闭式最小二乘粗定位)
[3.3 最大似然ML迭代精确位置估计](#3.3 最大似然ML迭代精确位置估计)
1.引言
声源定位是无线声学传感器阵列的核心技术,在反狙击探测、室内声源追踪、设备故障声学检测领域具备重要应用价值。本文结合GCC‑PHAT广义互相关时延估计、球面插值SI与最大似然ML优化算法,构成两步式混合麦克风阵列声源定位方案。第一步利用GCC‑PHAT对多路阵列接收信号做互相关运算,获取各阵元相对参考阵元的到达时间差TDOA,进一步换算得到距离差RDOA;第二步采用球面插值SI对RDOA观测值做闭式最小二乘求解,得到声源位置的粗估计,将SI输出作为迭代初值送入最大似然ML估计器,得到高精度声源坐标。该混合架构兼顾闭式算法计算快速的优势与最大似然算法统计最优的特性,SI 提供可靠初值规避ML迭代发散问题,ML补偿SI带来的估计偏差,适合麦克风阵列实测信号的定位求解。
2.算法测试效果


3.算法涉及理论知识概要
整个算法的整理结构如下图所示:

3.1 GCC‑PHAT广义互相关时延估计
设参考阵元接收信号为m1(t),第i个阵元接收信号为mi(t),二者傅里叶变换分别为M1(w)、Mi(w)。广义互相关GCC通过频域加权后做逆傅里叶变换求取互相关函数,互相关表达式为:

工程MATLAB实现中,对信号做补零FFT提升频率分辨率,加汉明窗抑制频谱泄露,fftshift将零频分量搬移至数组中心,搜索互相关峰值得到采样点延迟,再转换为时间与距离差,输出距离差向量 d,保存供球面插值模块使用。
3.2 球面插值SI闭式最小二乘粗定位
球面插值SI属于距离差的闭式最小二乘求解算法,不需要迭代运算,快速输出声源位置粗估计。阵元 i 到声源的欧氏距离:

SI输出得到声源二维粗坐标SI。SI是闭式解,运算速度快,但在噪声较大条件下存在估计偏差,因此将该结果作为最大似然迭代算法的初始迭代值,避免ML迭代陷入局部最优或者发散。
3.3 最大似然ML迭代精确位置估计
假设距离差观测噪声服从零均值多元高斯分布,噪声协方差矩阵为Sigma。定义残差向量h(s),代表理论距离差与GCC‑PHAT实测距离差之间的残差:

最大似然估计等价于最小化马氏距离代价函数

该式为非线性最小二乘优化问题,没有解析闭式解,需要数值迭代求解。MATLAB程序采用 Levenberg‑Marquardt算法,将SI粗解SI~设置迭代初值,迭代不断更新声源坐标,收敛之后输出高精度声源位置估计SI_ML。
完整混合定位实现流程:①读取麦克风阵列多路实测声学信号;②GCC‑PHAT频域广义互相关,求取各个阵元相对参考阵元TDOA时延;③声速换算得到RDOA距离差观测;④球面插值SI 闭式最小二乘求解,得到声源粗位置;⑤将SI输出作为初值送入最大似然非线性最小二乘迭代,输出精确声源坐标;⑥蒙特卡洛统计误差均值、方差、RMS,计算CRB理论下界,绘制定位散点图,输出文本记录实验结果。
该混合方案解决单纯SI算法噪声下偏差大,单纯ML对迭代初值敏感容易发散的矛盾。GCC‑PHAT抗混响,适合实际采集的阵列数据;SI快速提供可靠初值,ML完成统计最优迭代求精。阵元数量增加、阵元间距增大可以降低RMS定位误差;该算法对一定程度观测噪声具备鲁棒性,可用于二维麦克风阵列的声源位置估计。
4.核心程序
title('Sensor and Source Location');
str1=sprintf('[Xs, Ys, Zs, Rs, Bearing], Noise Std = %s*Rs',Noise_Factor);
str2=sprintf('SI Method');
str3=sprintf('RMS = [%s, %s, %s, %s, %s]', rmsxs_SI, rmsys_SI,rmsrs_SI, rmsbear_SI);
str4=sprintf('Mean = [%s, %s, %s, %s, %s]', meanxs_SI, meanys_SI,meanrs_SI, meanbear_SI);
str5=sprintf('Variance = [%s, %s, %s, %s, %s]', varxs_SI, varys_SI,varrs_SI, varbear_SI);
if (bML==1)
str6=sprintf('ML Method');
str7=sprintf('RMS = [%s, %s, %s, %s, %s]', rmsxs_ML, rmsys_ML,rmsrs_ML, rmsbear_ML);
str8=sprintf('Mean = [%s, %s, %s, %s, %s]', meanxs_ML, meanys_ML, meanrs_ML, meanbear_ML);
str9=sprintf('Variance = [%s, %s, %s, %s, %s]', varxs_ML, varys_ML, varrs_ML, varbear_ML);
str=sprintf('%s \n%s \n%s \n%s \n%s \n%s \n%s \n%s \n%s', str1, str2, str3, str4,str5, str6, str7, str8, str9);
legend('sensor location', 'calculated source location(SI)','calculated source location (ML)','actual source location ' );
else
str=sprintf('%s \n%s \n%s \n%s \n%s \n%s \n%s \n%s \n%s', str1, str2, str3, str4,str5);
legend('sensor location', 'actual source location', 'calculated source location (SI)');
end
xlabel('Distance (metres) in X direction');
ylabel('Distance (metres) in Y direction');
% generate results output files
fid = fopen('results.txt','w');
for k=1:nRun,
fprintf(fid,'%e\t%e\t%e\t%e\n',bias_Xs_SI(k,1),bias_Xs_SI(k,2), bias_Rs_SI(k), bias_bearing_SI(k));
end
fprintf(fid,'\n%e\t %e\t %e\t %e\t %e\n', meanxs_SI, meanys_SI, meanrs_SI, meanbear_SI);
fprintf(fid,'%e\t %e\t %e\t %e\t %e\n', varxs_SI, varys_SI, varrs_SI, varbear_SI);
fprintf(fid,'%e\t %e\t %e\t %e\t %e\n', rmsxs_SI, rmsys_SI, rmsrs_SI, rmsbear_SI);
fclose(fid);
axis([-0.1,0.35,-0.05,0.5]);
5.完整算法代码文件获得
完整程序见博客首页左侧或者打开本文底部GZH名片
( V关注后回复码: X152)
V