当前位置:   article > 正文

声源定位之GCC-PHAT算法

gcc-phat

声源定位之GCC-PHAT算法

1.GCC-PHAT介绍
Generalized Cross Correlation-Phase Transform,GCC-PHAT
广义互相关-相位变换

Notes:
①Generalized adj.笼统的;普遍的;概括性的;全面的
②Cross Correlation 互相关
③Correlation n.相互关系;相关;关联
④Phase n.阶段;时期;月相;相位
⑤Transform v.使改变形态;使改变外观(或性质);变换

2.远场模型
远场模型

如图所示,s(k)为声音信号位于远场,视为平面波,入射角为θ,两个麦克风y1(k)、y2(l)之间的距离为d。
在这里插入图片描述

当我们算出入射角θ时,即可定位出声音信号的位置。
当声源位于近场时,可以估计声源到达传感器的角度,并且能够估计声源与麦克风之间的距离。
但声源位于远场时,可以估计入射角度,但难以确定声源与麦克风阵列的距离。

3.互相关方法
互相关函数,CCF,Cross-Correlation Function
对于两个观测信号y1(k)、y2(k)之间的互相关函数定义为

当p=τ时,τ为相对时延,互相关值达到其最大值
在这里插入图片描述
Notes:互相关方法易于实现,但容易受多种因素影响,如信号自相关、混响,另外还有空间混叠。

4.广义互相关方法
广义互相关函数,GCCF,Generalized CCF
与互相关方法相同,但此时两个麦克风之间的TDOA估计可以等效为能够使麦克风输出的滤波信号之间的CCF最大的时间间隔
在这里插入图片描述
GCC函数:
在这里插入图片描述

广义互频谱:
在这里插入图片描述

互频谱:
在这里插入图片描述
这个公式实际应该是CC函数的互相关函数傅里叶变换

y信号离散傅里叶变化:
在这里插入图片描述

Notes:
①DOA(到达方向估计)
②TDOA(到达时间差)

5.相位变换
相位变换,Phrase Transform ,PHAT
TDOA的估计信息是通过互频谱相位而不是幅度表示的。简单的舍弃幅度而仅保留相位:
在这里插入图片描述
理想GCC函数:
在这里插入图片描述

6.具体定位实现(matlab)

clc
clear 
close all

%加载一段声音(matlab自带敲锣声)
load gong;
%采样频率
Fs = 8192;  
%采样周期
dt=1/Fs;
%music_src为声源
music_src=y;       

%设置两个麦克风坐标
mic_d=1;
mic_x=[-mic_d mic_d];
mic_y=[0 0];
plot(mic_x,mic_y,'x');
axis([-5 5 -5 5])
hold on;
quiver(-5,0,10,0,1,'color','black');
quiver(0,-5,0,10,1,'color','black');

%声源位置
s_x=10;
s_y=10;
plot(s_x,s_y,'o');
quiver(s_x,s_y,-s_x-mic_d,-s_y,1);
quiver(s_x,s_y,-s_x+mic_d,-s_y,1);

%求出距离
dis_s1=sqrt((mic_x(1)-s_x).^2+(mic_y(1)-s_y).^2);
dis_s2=sqrt((mic_x(2)-s_x).^2+(mic_y(2)-s_y).^2);
c=340;
delay=abs((dis_s1-dis_s2)./340);

%设置延时
music_delay = delayseq(music_src,delay,Fs);
figure(2);
subplot(211);
plot(music_src);
axis([0 length(music_src) -2 2]);
subplot(212);
plot(music_delay);
axis([0 length(music_delay) -2 2]);

%gccphat算法,matlab自带
[tau,R,lag] = gccphat(music_delay,music_src,Fs);
disp(tau);
figure(3);
t=1:length(tau);
plot(lag,real(R(:,1)));

%cc算法
[rcc,lag]=xcorr(music_delay,music_src);
figure(4);
plot(lag/Fs,rcc);
[M,I] = max(abs(rcc));
lagDiff = lag(I);
timeDiff = lagDiff/Fs;
disp(timeDiff);

%gcc+phat算法,根据公式写
RGCC=fft(rcc);
rgcc=ifft(RGCC*1./abs(RGCC));
figure(5);
plot(lag/Fs,rgcc);
[M,I] = max(abs(rgcc));
lagDiff = lag(I);
timeDiff = lagDiff/Fs;
disp(timeDiff);


%计算角度,这里假设为平面波
dis_r=tau*c;
angel=acos(tau*c./(mic_d*2))*180/pi;
if dis_s1<dis_s2
    angel=180-angel;
end
disp(angel);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/756227
推荐阅读
相关标签
  

闽ICP备14008679号