验证方案
安装在精确测量位置重新获得多组数据;
在实验中分别将拾音的MIC放置在距离蓝牙音箱15cm,50cm,100cm,145cm的位置接收蓝牙音箱发送的Chirp信号。Chirp信号的频率从250Hz线性变化到2000Hz,声音长度为250ms。
每组数据都同时使用外部示波器进行同步采样;
可以监视声音是否收到外部噪声的干扰。
通过相关差分计算得到每组对应的延迟数据;
可以消除测量基点位置定义不同而带来的系统误差。
具体实验场景和手持测距激光仪如下图所示。
音箱和MIC都距离地面15厘米左右。
实验中的音箱和拾音器的位置和高度
配置示波器DS6104双通道采集发送和接收的数据
测试声音发送时间为2.048ms。需要设置DS6104时间基轴速度为,这样可以在满屏14格内的采集时间可以的达到:
配置代码为:
ds6104open()
ds6104timebase(15e-3)
下面是采集到的一帧发送和接收到的声音信号。由于DS6014的采样数据只能是1400个,AD分辨率只有8BIT,所以在时间和幅值上相对于STM32所采集到的数据都有损失。
示波器双通道采集到的发送和接收音频信号
STM32F103RE发送的信号和AD采集到的信号幅值分辨率都是12bit,采样时间为0.1ms(10kHz采样率)。下面是一帧STM32发送和采样的数据。其中发送信号是直接读取的DA内存数据,不是真正的DA输出同时又通过AD转换的数据,所以这其中有一定的延迟时间: 。
STM32AD采集到的声音信号
测量MCU板的AD,DA时间延时
为了测量,通过前后改变MCU的IO管脚电平和设置DAC输出信号,从外部通过示波器观察这两个信号之间的延迟,来测量 。下面是在main.c主循环(周期为1ms)中的测试代码。
if(nCount & 0x1) {
ON(IO1);
DACOutput2(0xfff);
} else {
OFF(IO1);
DACOutput2(0x0);
}
下面波形显示了DA输出延迟的情况,通过波形可以测量大约为:3.1us。
MCU的IO与DA输出波形
从单片机的输入一个方波,单片机读取AD输入之后直接将结果发送的DA输出,可以测量到单片机的AD,DA之间的延迟:
while(1) {
nCount ++;
if(nCount & 0x800) {
ON(IO1);
DACOutput1(0xfff);
} else {
OFF(IO1);
DACOutput1(0x0);
}
DACOutput2(GetADC1());
}
从下图中可以看到这个延迟时间为:
根据前面测量得到的=3.1us,可以确定下单片机的AD输出时间延迟大约为:。
从MCU的AD输入到DA输出之间的时延
采集实验数据
分别在不同距离采集数据
在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次结果的均值和方差。结果如下表所示:
根据前面测量得到的各个位置相关峰值位置,再根据采样时间声音传播距离,可以计算出根据声音时间差所得到的距离:
可以看到根据声音信号延迟所得到的及算距离比起实际测量的距离普遍大大了5厘米左右。这可能是因为所测量距离都是按照蓝牙音箱的前面面板的位置开始计量的,但实际上音箱内部的喇叭的振动膜要比音箱前面板还是往后的,所以实际距离应该比测量距离大。
根据上面表格,可以计算出四个位置之间的差值,如下表所示,这样就消除了测量距离的系统误差。
通过处理后的结果可以看出根据声音传播速度差所得到的距离差与实际测量值是很接近的。其中数据误差最大不超过5%。
结论
根据本次测量结构,可以看到根据声音延迟所测量得到的距离与实际测量值之间的误差不大于5%。在距离更远的时候,这个距离误差更小。
因此,昨天的实验中的结果有可能是测量有误造成的。特别是测量的数据只进行一次的测量。而本实验中每个位置都采取了50次的声音数据,利用平均值完成的测量,所以精度就提高了。
上一篇:电灯泡内通有交流电,为什么看不到灯泡在闪烁?
下一篇:信号正常吗?
推荐阅读最新更新时间:2024-11-03 22:04
- DC943A,使用 LTC4067 USB 电源控制和锂离子/聚合物充电器的演示板
- 一个基于msp430F149的红外感应计时器
- DIY zigbee2mqtt zigbee3.0网关
- 使用 Analog Devices 的 LT3088IDD 的参考设计
- AM2G-2409SH30Z 9V 2 瓦 DC-DC 转换器的典型应用
- 开源实用电流和磁场探头little-bee
- AM30EW-480512TZ 5V 单路输出 DC/DC 转换器的典型应用
- LTC2293IUP 演示板,MUX 双路 ADC,VDD=+3.0V,65Msps,12Bit,1MHz < AIN< 70MHz
- 消费电子 MCU 开发系统
- 使用 ON Semiconductor 的 ADP1148 的参考设计