【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】

1,060 阅读2分钟

一、简介

最近在优化频谱监测系统中的TDOA定位精度。TDOA中最重要的问题无外乎是信号时差的提取。看了国内外的文献,一致首推“广义相关(Generalized Cross Correlation–GCC)算法”。
查文献,在matlab中使用模拟正弦波仿真测试了一下广义相关算法,没有达到预期效果,百思不得其解。浏览了一下网络上关于GCC的评论,国内外不少人都抱怨无法得到预期仿真结果。最后,想到广义相关算法公式中,影响计算结果的主要参数是相位信息,应该需要使用仿真调制信号来测试。使用Matlab仿真FM/FSK/PSK之后,效果果然不错。在C++程序中实现这个算法只是工作量的问题了。matlab仿真源代码展示在这里,供大家参考。注意,不同版本Matlab需要使用不同的调制函数。
你可以使用广义互相关( Generialized Cross-Correlation )来估计一个信号达到两个传感器的时间延迟。比如应用麦克风阵列来确定声源方位的应用背景。问题可以用以下模型来描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、源代码

clear all;
close all;
clc
load s.mat;
s1=s1_10db(:)';             %变为行向量
s2=s2_10db(:)';             %变为行向量
wnd=512;
inc=256;

[delay]=GCC_Method('standard',s1,s2,wnd,inc);
subplot(411)
plot(delay-wnd,'*')
ylim([0,12])
title('标准GCC')
xlabel('帧数')
ylabel('延时/点')

[delay]=GCC_Method('phat',s1,s2,wnd,inc);
subplot(412)
plot(delay-wnd,'*')
ylim([0,12])
title('Phat-GCC')
xlabel('帧数')
ylabel('延时/点')

[delay]=GCC_Method('scot',s1,s2,wnd,inc);
subplot(413)
plot(delay-wnd,'*')
ylim([0,12])
title('Scot-GCC')
xlabel('帧数')
ylabel('延时/点')

[delay]=GCC_Method('ml',s1,s2,wnd,inc);
 subplot(414)
plot(delay-wnd,'*')
ylim([0,12])
unction frameout=enframe(x,win,inc)

nx=length(x(:));            % 取数据长度
nwin=length(win);           % 取窗长
if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数
   len = win;               % 是,帧长=win
else
   len = nwin;              % 否,帧长=窗长
end
if (nargin < 3)             % 如果只有两个参数,设帧inc=帧长
   inc = len;
end
nf = fix((nx-len+inc)/inc); % 计算帧数
frameout=zeros(nf,len);            % 初始化
indf= inc*(0:(nf-1)).';     % 设置每帧在x中的位移量位置
inds = (1:len);             % 每帧数据对应1:len
frameout(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 对数据分帧

三、运行结果

在这里插入图片描述

四、备注

版本:2014a