繁体   English   中英

Android通过两台设备之间的声音获取距离

[英]Android Getting distance using sound between two devices

这个想法是电话A同时发送声音信号和蓝牙信号,电话B将计算两个信号之间的延迟。

实际上,从90ms-160ms的延迟中,我得到的结果不一致。 我尽可能地尝试优化两端。

在输出端:
一旦蓝牙和音频输出都有自己的线程,就会生成音调
AudioTrack.write和AudioTrack处于流模式后蓝牙仅输出
应该在写入完成之前开始输出。

在接收端:
同样是两个单独的线程
在每个AudioRecord.read之前记录系统时间

采样规格:
44.1
读取整个缓冲区
使用fft一次采样100个样本
考虑到自初始read()以来转换了多少样本

您的方法依赖于整个管道的基本零延迟,这实际上是不可能的。 您只是无法以这种准确性进行同步。 如果你可以将延迟降低到5-6毫秒,那么它可能是可能的,但是在你发生这种情况之前你会把头撞到你的键盘上。 即使这样,它也可能精确到1.5米左右。

考虑一下您收到的延迟的下限。 在90毫秒内,声音可以传播超过30m 这就是市售蓝牙产品系列的最后一个,甚至没有考虑到您可能处于非理想的传输条件下。

这是一个讨论Android中低延迟音频的线程 TL; DR是它很烂,但是越来越好。 使用最新的API和最新的设备,假设您运行了一些手动调整的音频功能,则可以将其降低到30毫秒左右。 这里没有简单的AudioTrack。 即便如此,这仍然是一个很好的10米圆形错误概率。

编辑:

假设您可以同步设备的时钟,更好的方法是使用简单的am / fm调制或脉冲序列将时间戳嵌入音频信号中。 然后你可以在另一端解码它,并知道它何时被发送。 您仍然需要处理延迟问题,但它可以很好地简化整个过程。 根本不需要蓝牙,因为它实际上并不是一个可靠的时钟,因为它本身就被认为具有延迟问题。

这为您提供了一个很好的方法http://netscale.cse.nd.edu/twiki/pub/Main/Projects/Analyze_the_frequency_and_strength_of_sound_in_Android.pdf

您必须创建一个具有一定幅度(以dB为单位)的1 kHz声音,然后尝试测量到达另一台设备的声音的幅度。 从镇静剂中,您也许可以测量距离。

我记得:a0 = 20 * log(4 * pi * distance / lambda)其中a0是镇静剂并给出lambda(你可以从1kHz算起)但是在如此敏感的环境中,噪音可能会破坏整个事物,只是一个想法,如果我是你我该怎么办。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM