基于tdoa的麦克风阵列单声源定位(附详细代码)
一、前言
人一生中接收到的所有信息中,听觉共占11%。仅仅通过双耳的听觉,人便可以分辨声源的方位,识别说话的对象,同时听取多个声音且互不干扰。而计算机自从1939年诞生起,经过摩尔定律的疯狂增长,如今的计算能力,无论是速度还是精度上都已经远超人类。那原则上讲,如果没有灵魂或者上帝作用到了人对世界的理解中,只要给了计算机以与人类所接收到的相同的信息,那么计算机也同样能完成上述这些奇妙的任务,甚至达到更高的的水平。能不能创造神迹不好说,但做一些有趣的工作不在话下~
但为什么不用视觉呢?视网膜高清所承载的信息难道不比听到充斥着杂音的听觉音频信息量含量高、信噪比低吗?某种意义上确实,但正是因为这些原因,人对听觉的信息利用率远远低于视觉,而这一个通道所承载的信息又是视觉所无法取代的。抛开这些,难道这种用无法“眼见为实”的方法,近似于魔法的方式来理解世界的方式不足以吸引你吗?话不多说
Let’s step into the Sound Era
二、信息论声学
从信息论的角度出发,声音所承载的信息可以简单地分为两种——信源和信道,或者简单点来说,声源和环境。有人可能要说了,环境不就是噪声吗?哪来的信息?这里需要说明一下,此处的环境是一种泛在的概念,指的是从发声源到接收器过程中所有参与到最终结果的合成中的信息,包括其他的非主要声源,也就是所谓的噪声。除此之外环境信息其实还包括如房间形状,物品陈设的空间信息 (自然可以想到人在小房间的回声和室外的空旷感是不同的,里面包含着所处地点的空间信息);
另外,这里还需要对刚才指一种所谓的“噪声”来一次平反,所谓噪声,都是没有被充分利用的信息,你怎么敢定义什么是噪声?假若我就是想听听窗外的喇叭声来判断交通情况而不是听电视里男女主深情告白呢?从信息论的角度来看。从信息论的角度来看,信源和信道是对立统一且本质相同的。这看起来或许有些不切实际,毕竟物理世界中有那么多参数,根本就是一个复杂系统,你又如何从进行了纷繁复杂的叠加后的复合信息中体取出原来的各个分量呢?
不得不说,物理世界诚然复杂,但不难发现它的复杂背后也有其秩序,不同变量对一个物理过程的影响程度(也就是权重)是不同的,我们只要抓住其中的主因子便能做一系列有趣的分析了,比如接下来的声源定向
三、声源定位简介
声源定位顾名思义指的就是定位声源的位置,最常见的便是我们人耳的声源定位,而在实际中,我们利用多个麦克风(麦克风阵列)在测量不同位置点对声源进行测量,而由于声信号到达不同麦克风的时间有不同程度的延迟(也被称为时延),利用算法对测量得到的声信号进行处理,由此获得声源点相对于麦克风的到达方向(包括方位角,俯仰角)和距离等
目前基于麦克风阵列的声源定位方法主要有三种:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法、基于到达时延差估计的定位方法(Time Difference of Arrival,TDOA,也就是我们这里用的方法😄)
四、单声源定位技术路线
1. 使用设备
这里使用的都是ReSpeaker Mic Array v2.0,如图有四个麦克风,采样率为16000,采样深度为16位。录音会得到6声道数据,通道0为asr处理声道,通道5是合并播放,通道1-4则为4个麦克风所接收到的数据(分别对应图中右上、左上、左下、右下)
由于该设备只有平面上的四个摄像头,难以采集竖直方向的信息,所以后续的声源定位均是针对二维的

这是它的介绍页面,也有购买链接(只是给感兴趣的朋友,真的没有收钱啊😢)
2. 数学基础
根据到达时间差的声源定位根据声源距离麦克风距离可以分为远场和近场两种模型,这里会对两者的特点以及进行tdoa的分析做详细的说明(但最终使用的是远场模型)
- 远场模型

远场即麦克风与声源之间的距离远远大于麦克风之间的距离,此时只能通过不同麦克风接收到声源的相对时间差计算出声源的方向。但声源的具体位置无法确定,因为此时麦克风阵列接收到的近似于平面波,不足以区分同一方向不同距离的声源

远场声源数学模型大致可以简化为此,即确定一个麦克风为原点并建立直角坐标系,编号为 R 0 ( 0 , 0 ) R_0(0, 0) R0(0,0); 其余的n-1个麦克风编号为 R i ( x i , y i ) , i = 1 , 2 , . . . n − 1 R_i(x_i, y_i), i = 1, 2, ... n-1 Ri(xi,yi),i=1,2,...n−1,而声源则记为 S ( a , b ) S(a, b) S(a,b)
由远场模型中声波可视为平面波的特点,声源S到 R 0 , R i R_0, R_i R0,Ri的距离差 ∣ R 0 S ∣ − ∣ R i S ∣ 可视为 ∣ R 0 P ∣ |R_0 S| - |R_i S|可视为|R_0 P| ∣R0S∣−∣RiS∣可视为∣R0P∣,所以有公式
∣ R 0 R i ∣ cos θ = ∣ R 0 P ∣ = v s o u n d Δ t i |R_0 R_i|\cos{\theta} = |R_0 P| = v_{sound}\Delta t_i ∣R0Ri∣cosθ=∣R0P∣=vsoundΔti
为更好地使用坐标信息,这里采用向量化的计算方式
∣ R 0 R i ∣ ⋅ R 0 R i ⃗ ⋅ R 0 R i ⃗ ∣ R 0 R i