【问题标题】:Android Getting distance using sound between two devicesAndroid使用两台设备之间的声音获取距离
【发布时间】:2013-03-04 22:28:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果您澄清并扩展您的问题,您可能会得到更好的答复。很难说你到底在问什么。
  • 声音以 331 米/1000 毫秒或 3.31 米/10 毫秒传播。是什么让您认为您可以使用商用设备计时蓝牙信号和音频信号的到达时间?
  • 这个商业设备的工作频率为 1.4 ghz,在光传播 1 英尺之前将运行 4 个 cpu 周期。周期不等于命令,但我正在计时非常慢的声音延迟(每英尺 1 毫秒)~1400000 个 cpu 周期

标签: android bluetooth fft audiorecord audiotrack


【解决方案1】:

您的方法在整个管道中基本上依赖于零延迟,这实际上是不可能的。您只是无法以那种准确度同步它。如果您可以将延迟降低到 5 到 6 毫秒,那是可能的,但在此之前您会用力敲击键盘。即便如此,也只能精确到 1.5 米左右。

考虑您收到的延迟的下限。在 90 毫秒内,声音可以传播slightly over 30m。这就是已上市蓝牙范围的尽头,甚至没有考虑到您可能处于非理想的传输条件。

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

编辑:

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

【讨论】:

  • 感谢您的回复 声音一直在录制,我只计时了需要 44-48 毫秒才能读取 2048 个样本的声音记录,这非常接近应该的 46 毫秒。 fft 需要 0-1 毫秒。我看不出 90ms 的延迟是从哪里来的。我目前正在通过声音发送比特,所以我可以发送时间戳,但我想避免同步时钟。如果蓝牙硬件/开销太慢但速度非常快,我认为这种方法是必要的。
  • 从您的代码说“播放”到声音从扬声器发出物理声音之间需要多长时间?麦克风一侧也是如此。这是大多数音频应用程序中延迟的最大来源之一,并且由于它通常不是很一致,因此很难弥补。如果您不确定何时这些样本到达手机,那么在约 46 毫秒内记录 2048 个样本这一事实并没有多大意义。任何方法都必须与之抗争,但 Android 上的音频延迟是出了名的糟糕。
  • 使用 setPlaybackPositionUpdateListener 在调用函数之前我得到了大约 14 毫秒的延迟。除了那个功能,我没有办法测量延迟。
  • 如果你得到 14 毫秒,那么我认为这不是衡量延迟的可靠方法。我已经对此应用程序进行了大量研究,并且从未见过任何消费者 Android 设备上延迟如此之低的报告。
  • +1:很好的回答和充分的理由。 (嵌入的时间戳特别聪明。)
【解决方案2】:

这为您提供了一个很好的方法 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 开始计算) 但在如此敏感的环境中,噪音可能会破坏整个事情,只是一个想法,如果我是你我会怎么做。

【讨论】:

  • 我认为这与使用蓝牙信号强度一样不准确。
  • 也许是的。但是您不必担心延迟,因为您只需开始不断地发出 1kHz 频率的声音并测量一段时间的镇静作用。平均可能是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2013-10-06
  • 2013-08-21
  • 1970-01-01
  • 2012-07-17
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多