gpt4 book ai didi

java - 互相关 : Android AudioRecord create sample data for TDoA

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:22 28 4
gpt4 key购买 nike

在我的 Android 智能手机的一侧,我使用 AudioRecord.read() 录制音频流。对于录制,我使用以下规范

  • 采样率:44100 Hz
  • 单 channel
  • PCM-16Bit
  • 我用于 AudioRecord.read() 的数组大小:100(短数组)
    • 使用这个小尺寸可以让我每 0.5 毫秒读取一次(平均值),因此我可以稍后使用这个时间戳进行多边定位(至少我这么认为:-))。如果我可以使用互相关来确定 TDoA,也许这会过时?!? (见下文)

在另一边,我有三个扬声器,使用 WebAudio API 和以下规范发出不同的声音

  • 频率1:17500赫兹
  • 频率2:18500赫兹
  • 频率3:19500赫兹
  • 信号长度:200 ms + 增益节点的淡入和淡出 5 ms,总共 210 ms

我的目标是确定发出的声音之间的到达时间差 (TDoA)。因此,在每次迭代中,我从 AudioRecord 缓冲区中读取 100 个字节,然后我想确定时间差(如果我找到了其中一个声音)。到目前为止,我已经使用了一个简单的频率滤波器(使用 fft)来确定 TDoA,但这在现实世界中确实不准确。

到目前为止,我发现我可以使用互相关来更好地确定 TDoA 值(http://paulbourke.net/miscellaneous/correlate/ 以及此处的一些线程)。现在我的问题是:目前我认为我必须将记录的信号(我的短阵列)与上面三个声音中每个声音的生成信号相关联。但我正在努力生成这个信号。使用(http://repository.tudelft.nl/view/ir/uuid%3Ab6c16565-cac8-448d-a460-224617a35ae1/ B1.1.genTone() 节)中找到的代码并不能清楚地解决我的问题,因为这将生成一个比我记录的样本大得多的数组。到目前为止,我知道互相关需要两个相同大小的数组才能起作用。那么如何生成示例数组呢?

另外一个问题:目前如何确定TDoA的思路是否正确?

最佳答案

以下是我过去几天学到的一些教训:

  • 我可以使用互相关 (xcorr) 或频率识别技术来确定 TDoA。后一种说法更加不精确。所以我专注于 xcorr。
  • 我可以通过对记录的信号和两个引用信号应用 xcorr 来实现 TDoA。例如。我的记录长度为 1000 个样本。使用 xcorr,我在样本 500 处识别出声音 A,在样本 600 处识别出声音 B。因此我知道它们的时间差为 100 个样本(可以根据采样率转换为秒)。

因此,我使用 this code found on SO 生成线性调频脉冲(比简单的正弦波更好的线性调频脉冲(参见文献))。 。作为一个简单的示例并检查我的实验是否有效,我将我的记录以及生成的 chirp 声音保存为 .wav 文件(有大量代码示例如何执行此操作)。然后我使用 MatLab 作为计算 xcorr 的简单方法:see here

还有一点:“xcorr 的输入必须是相同的大小?”我对这部分不太确定,但我认为必须这样做。我们可以通过将两个信号零填充到相同的长度(最好是 2 的幂,这样我们可以使用 FFT 的高效 Radix-2 实现)来实现这一点,然后使用 FFT 计算 xcorr(请参阅 SO 的另一个链接)

我希望到目前为止这是正确的并涵盖了其他人的一些问题:-)

关于java - 互相关 : Android AudioRecord create sample data for TDoA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36979059/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com