声音检测和测距有许多与回声定位、导航和地理定位相关的应用。所有这些都依赖于使用声音延迟准确定位声源的位置。
在这项研究中,我们组装了一个设备,该设备可以利用声音到达时间的差异来精确定位声源的位置。它由连接到 Arduino 电路板的三个声音传感器组成,该电路板发送数据至电脑,在 Python 中进行处理。我们发现其误差的大小随声源和传感器的相对位置而变化,致使生成一个误差模型,该模型让机器将任何单个测量与设备中实验确定的不确定性相结合,生成一个二维概率分布作为声源位置的热图。概率分布通常与机器的实际输出分布相匹配。
概述
声音检测和测距有许多应用,包括民用和军用。 通过时间延迟测量,准确定位波源位置的能力在许多应用中存在。 如,天文学领域,射电天文学通过使用大型射电望远镜,通过检测天体的无线电发射来研究天体。 然而,单个望远镜实现的图像分辨率受到几个因素的限制,如望远镜天线孔径的大小。 为了克服这个限制,可以使用一种称为超长基线干涉测量的干涉测量,其中许多遥远的望远镜同步在一起模拟更大的奇异望远镜。 为了实现这一点,不同望远镜的无线电信号到达时间之间的延迟被组合和处理。 这项研究采用了一种称为到达时间差的类似技术,构建一种可以精确定位声源位置的装置。
到达时间差
到达时间差 (TDOA) 是一种用于对射频源进行地理定位的技术。 它需要三个或更多能够检测感兴趣信号的远程接收器(探针)。 每个探针在时间上同步到捕获相应的 I/Q 数据块。 软件移动每个 I/Q 数据集的时间特征以找到每个探测器到达时间的差异,这给出了源与每组探头的距离差异。 使用多个探针提供一组曲线,指示距离的解方程。
如文中所述,这种方法广泛用于定位系统。 本文设备包括三个通过 Arduino 电路板同步在一起的 Arduino 声音传感器。 我们假设三个声音传感器足够远且没有干扰,可以测量到声源的范围和方向。
方法 | 理论
数学模型
模拟代码片段:
def makePlot(xBoundL=-50,xBoundR=50,yBoundL=-50,yBoundR=50,
xPixScal=1,yPixScal=1,
micSize=1,
errConst=2,
xMic=[0,1],yMic=[0,0],
source=[0,0],
):
x = np.arange( xBoundL, xBoundR, xPixScal )
y = np.arange( yBoundL, yBoundR, yPixScal )
X = np.tile( x, [y.size,1])
Y = np.tile( y, [x.size,1])
Y = np.rot90(Y)
d12 = getDelay(source[0],source[1],xMic[0],yMic[0],xMic[1],yMic[1])
d13 = getDelay(source[0],source[1],xMic[0],yMic[0],xMic[2],yMic[2])
d23 = getDelay(source[0],source[1],xMic[1],yMic[1],xMic[2],yMic[2])
data = function(X, Y,
xMic[0],yMic[0],xMic[1],yMic[1],xMic[2],yMic[2],
d12,d13,d23,
errConst)
plt.imshow(data,extent=[xBoundL,xBoundR,yBoundL,yBoundR])
plt.contour(X,Y,
curve(X,Y,xMic[0],yMic[0],xMic[1],yMic[1]),
[d12],colors="red") # mics 1, 2
plt.contour(X,Y,
curve(X,Y,xMic[0],yMic[0],xMic[2],yMic[2]),
[d13],colors="red") # mics 1, 3
plt.contour(X,Y,
curve(X,Y,xMic[1],yMic[1],xMic[2],yMic[2]),
[d23],colors="red") # mics 2, 3
plt.plot(xMic,yMic,marker='o',linestyle='None',
color='red',markersize=micSize)
plt.show()
def curve(x,y,x1,y1,x2,y2):
return np.sqrt((x-x1)**2+(y-y1)**2)-np.sqrt((x-x2)**2+(y-y2)**2)
连接示意图
趋势图
误差传递趋势图
源代码
详情参阅 - 亚图跨际