声音定位的距离误差到底有多高?
在昨天的实验记录中测量声音定位出现了23%的误差,这个误差哪来的呢?
下面再次通过实验来考察一下根据声波传递速度测量距离的实际精度是多少。
重新验证方法和实验
验证方案
- 安装在精确测量位置重新获得多组数据;
在实验中分别将拾音的MIC放置在距离蓝牙音箱15cm,50cm,100cm,145cm的位置接收蓝牙音箱发送的Chirp信号。Chirp信号的频率从250Hz线性变化到2000Hz,声音长度为250ms。 - 每组数据都同时使用外部示波器进行同步采样;
可以监视声音是否收到外部噪声的干扰。 - 通过相关差分计算得到每组对应的延迟数据;
可以消除测量基点位置定义不同而带来的系统误差。
具体实验场景和手持测距激光仪如下图所示。
音箱和MIC都距离地面15厘米左右。
实验中的音箱和拾音器的位置和高度
配置示波器DS6104双通道采集发送和接收的数据
测试声音发送时间为2.048ms。需要设置DS6104时间基轴速度为 t b = 15 m s t_b = 15ms tb=15ms ,这样可以在满屏14格内的采集时间可以的达到: T s a m p l e = t b × 14 = 210 m s T_{sample} = t_b \times 14 = 210ms Tsample=tb×14=210ms
配置代码为:
ds6104open()
ds6104timebase(15e-3)
下面是采集到的一帧发送和接收到的声音信号。由于DS6014的采样数据只能是1400个,AD分辨率只有8BIT,所以在时间和幅值上相对于STM32所采集到的数据都有损失。
示波器双通道采集到的发送和接收音频信号
STM32F103RE发送的信号和AD采集到的信号幅值分辨率都是12bit,采样时间为0.1ms(10kHz采样率)。下面是一帧STM32发送和采样的数据。其中发送信号是直接读取的DA内存数据,不是真正的DA输出同时又通过AD转换的数据,所以这其中有一定的延迟时间:
T
D
A
T_{DA}
TDA。
STM32AD采集到的声音信号
测量MCU板的AD,DA时间延时
为了测量 T D A T_{DA} TDA,通过前后改变MCU的IO管脚电平和设置DAC输出信号,从外部通过示波器观察这两个信号之间的延迟,来测量 T D A T_{DA} TDA。下面是在main.c主循环(周期为1ms)中的测试代码。
if(nCount & 0x1) {
ON(IO1);
DACOutput2(0xfff);
} else {
OFF(IO1);
DACOutput2(0x0);
}
下面波形显示了DA输出延迟的情况,通过波形可以测量
T
D
A
T_{DA}
TDA大约为:3.1us。
MCU的IO与DA输出波形
从单片机的输入一个方波,单片机读取AD输入之后直接将结果发送的DA输出,可以测量到单片机的AD,DA之间的延迟: T A D + T D A T_{AD} + T_{DA} TAD+TDA
while(1) {
nCount ++;
if(nCount & 0x800) {
ON(IO1);
DACOutput1(0xfff);
} else {
OFF(IO1);
DACOutput1(0x0);
}
DACOutput2(GetADC1());
}
从下图中可以看到这个延迟时间为: T A D + T D A = 9 u s T_{AD} + T_{DA} = 9us TAD+TDA=9us
根据前面测量得到的
T
D
A
=
3.1
u
s
T_{DA} = 3.1us
TDA=3.1us,可以确定下单片机的AD输出时间延迟大约为:
T
A
D
=
9
−
3.1
=
5.9
u
s
T_{AD} = 9 - 3.1 = 5.9us
TAD=9−3.1=5.9us。
从MCU的AD输入到DA输出之间的时延
在室温25℃时,声音传播速度 V s o u n d = 346.65 V_{sound} = 346.65 Vsound=346.65 (m/s)。延迟时间 T A D = 5.9 u s T_{AD} = 5.9us TAD=5.9us对应的声音传播距离 D s o u n d = T A D × 346.65 = 0.00204 m D_{sound} = T_{AD} \times 346.65 = 0.00204m Dsound=TAD×346.65=0.00204m。
采集实验数据
分别在不同距离采集数据
在100厘米处采集音频数据对应的示波器得到的输入输出波形。
示波器显示的发送和接收到的音频信号
在53厘米处采集音频数据对应的示波器得到的输入输出波形。
示波器采集到的输出和反射的声音信号
在15厘米处采集音频数据对应的示波器得到的输入输出波形。
示波器采集到的输入输出音频
数据处理和分析
1. 数据处理方法
通过计算发送和接收之间的相关结果,求得相关峰值所在的位置则可以求出信号传播时间延迟。
在文章“如何提高声音测距的分辨率”中介绍了使用FFT,插值等方法加速计算信号数据相关以及细化相关峰值位置的方法。
数据处理PYTHON函数代码如下。其中send,rece分别是发送和接收到的声音采集数据,在本实验中数据长度为2500,采样时间间隔0.1ms。interptime是对相关结果进行插值倍数,这样所求的峰值可以是小于一个数据采样时间间隔。在本实验中interptime取20。
def procdatafftinterpolation(send, rece, interptime):
sm = mean(send)
rm = mean(rece)
send = [d - sm for d in send]
rece = [d - rm for d in rece]
datalen = len(send)
sendspace = zeros(datalen*2)
sendspace[0:datalen] = send
recespace = zeros(datalen*2)
recespace[0:datalen] = rece
tempfft = fft.fft(sendspace) * conj(fft.fft(recespace))
expandfft = zeros(datalen*2*interptime, dtype=complex64)
expandfft[0:datalen] = tempfft[0:datalen]
expandfft[-datalen:] = tempfft[datalen:]
cor = list(fft.ifft(expandfft).real)
maxpos = cor.index(max(cor))
return maxpos
2. 数据处理结果
总共有四个位置的四组数据,每个位置采集了50次发送和接收的数据波形。将每组数据使用前面的方法获得相关系数峰值位置,并求出50次结果的均值和方差。结果如下表所示:
序号 | 距离(cm) | 相关峰值 | 方差 |
---|---|---|---|
1 | 15 | 4994.6 | 0.0 |
2 | 50 | 4983.855 | 0.000225 |
3 | 100 | 4969.485 | 0.00883 |
4 | 145 | 4956.079 | 0.00361 |
现在室温温度 T r o o m = 25 T_{room} = 25 Troom=25摄氏度。声音速度为(m/s): V s o u n d = 331.4 + 0.6 × T a i r = 346.65 V_{sound} = 331.4 + 0.6 \times T_{air} = 346.65 Vsound=331.4+0.6×Tair=346.65
数据采样时间 T s = 0.1 m s T_s = 0.1ms Ts=0.1ms,那么一个采样时间声音传播距离: D s = T s × V s o u n d = 3.4665 c m D_s = T_s \times V_{sound} = 3.4665 \:\:cm Ds=Ts×Vsound=3.4665cm
根据前面测量得到的各个位置相关峰值位置,再根据采样时间声音传播距离 D s = 3.4665 c m D_s = 3.4665\,\,cm Ds=3.4665cm,可以计算出根据声音时间差所得到的距离:
序号 | 位置实测距离(cm) | 相关峰值差 | 计算距离(cm) |
---|---|---|---|
1 | 15 | 5.40 | 18.66 |
2 | 50 | 16.15 | 55.79 |
3 | 100 | 30.52 | 105.45 |
4 | 145 | 43.92 | 151.77 |
可以看到根据声音信号延迟所得到的及算距离比起实际测量的距离普遍大大了5厘米左右。这可能是因为所测量距离都是按照蓝牙音箱的前面面板的位置开始计量的,但实际上音箱内部的喇叭的振动膜要比音箱前面板还是往后的,所以实际距离应该比测量距离大。
根据上面表格,可以计算出四个位置之间的差值,如下表所示,这样就消除了测量距离的系统误差。
序号 | 距离差(cm) | 峰值位置 | 计算距离差(cm) |
---|---|---|---|
1 | 50-15 | 10.7450 | 37.13 |
2 | 100-50 | 14.37 | 49.66 |
3 | 145-100 | 13.406 | 46.33 |
通过处理后的结果可以看出根据声音传播速度差所得到的距离差与实际测量值是很接近的。其中数据误差最大不超过5%。
结论
根据本次测量结构,可以看到根据声音延迟所测量得到的距离与实际测量值之间的误差不大于5%。在距离更远的时候,这个距离误差更小。
因此,昨天的实验中的结果有可能是测量有误造成的。特别是测量的数据只进行一次的测量。而本实验中每个位置都采取了50次的声音数据,利用平均值完成的测量,所以精度就提高了。
相关文章
- 移动端城市定位,城市区域代码adcode
- 如何从ecs的pid定位到运行该进程的docker
- Android GIS开发系列-- 入门季(9) 定位当前的位置
- SAP错误消息调试之七种武器:让所有的错误消息都能被定位
- 基于广义互相关的声源定位研究(Matlab代码实现)
- 网页块元素定位建议使用的xpath方式
- 绝对定位多个字居中显示的css
- CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法
- 无法定位序数XX于动态链接库XX.dll的解决的方法
- web自动化测试之Selenium基础 — XPath定位大全
- Appium基础 — Appium Inspector定位工具(一)
- 页表、地址重定位、地址保护的名词解释
- Selenium基础应用知识&Web元素定位