Android使用两个设备之间的声音获取距离

时间:2013-03-04 22:28:15

标签: android bluetooth fft audiorecord audiotrack

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

在实践中,我得到的结果不一致,延迟时间为90ms-160ms。 我尽可能地尝试优化两端。

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

在接收端:
再两个单独的线程
系统时间记录在每个AudioRecord.read

之前

采样规格:
44.1
读取整个缓冲区
使用fft一次一次采样100个样本 考虑自初始读取()

以来转换了多少样本

2 个答案:

答案 0 :(得分:6)

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

考虑您收到的延迟的低端。在90ms内,声音可以传播slightly over 30m。这是上市的蓝牙系列的最终结果,甚至没有考虑到你可能处于非理想的传输条件。

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

修改:

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

答案 1 :(得分:1)

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

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

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