---
description: Python | Arduino | 二维 | 概率分布 | 热图 | Matplotlib | numpy | 统计 | scipy | 散点图
---

# Python计算Arduino声音方向范围和绘制声音位置二维概率分布热图

声音检测和测距有许多与回声定位、导航和地理定位相关的应用。所有这些都依赖于使用声音延迟准确定位声源的位置。

在这项研究中，我们组装了一个设备，该设备可以利用声音到达时间的差异来精确定位声源的位置。它由连接到 Arduino 电路板的三个声音传感器组成，该电路板发送数据至电脑，在 Python 中进行处理。我们发现其误差的大小随声源和传感器的相对位置而变化，致使生成一个误差模型，该模型让机器将任何单个测量与设备中实验确定的不确定性相结合，生成一个二维概率分布作为声源位置的热图。概率分布通常与机器的实际输出分布相匹配。

### 概述

声音检测和测距有许多应用，包括民用和军用。 通过时间延迟测量，准确定位波源位置的能力在许多应用中存在。 如，天文学领域，射电天文学通过使用大型射电望远镜，通过检测天体的无线电发射来研究天体。 然而，单个望远镜实现的图像分辨率受到几个因素的限制，如望远镜天线孔径的大小。 为了克服这个限制，可以使用一种称为超长基线干涉测量的干涉测量，其中许多遥远的望远镜同步在一起模拟更大的奇异望远镜。 为了实现这一点，不同望远镜的无线电信号到达时间之间的延迟被组合和处理。 这项研究采用了一种称为到达时间差的类似技术，构建一种可以精确定位声源位置的装置。

#### 到达时间差

到达时间差 (TDOA) 是一种用于对射频源进行地理定位的技术。 它需要三个或更多能够检测感兴趣信号的远程接收器（探针）。 每个探针在时间上同步到捕获相应的 I/Q 数据块。 软件移动每个 I/Q 数据集的时间特征以找到每个探测器到达时间的差异，这给出了源与每组探头的距离差异。 使用多个探针提供一组曲线，指示距离的解方程。

如文中所述，这种方法广泛用于定位系统。 本文设备包括三个通过 Arduino 电路板同步在一起的 Arduino 声音传感器。 我们假设三个声音传感器足够远且没有干扰，可以测量到声源的范围和方向。

### 方法 | 理论

### 数学模型

模拟代码片段：

```python
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)
```

### 连接示意图

#### 趋势图

#### 误差传递趋势图

### 源代码

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
