互相关:Android AudioRecord 为 TDoA 创建示例数据
Posted
技术标签:
【中文标题】互相关:Android AudioRecord 为 TDoA 创建示例数据【英文标题】:Cross Correlation: Android AudioRecord create sample data for TDoA 【发布时间】:2016-05-02 09:22:51 【问题描述】:在我的 android 智能手机的一侧,我正在使用 AudioRecord.read() 录制音频流。对于录制,我使用以下规格
采样率:44100 赫兹 单声道 PCM-16 位 我用于 AudioRecord.read() 的数组大小:100(短数组) 使用这个小尺寸可以让我每 0.5 毫秒读取一次(平均值),所以我可以稍后使用这个时间戳进行多点定位(至少我是这么认为的 :-))。如果我可以使用互相关来确定 TDoA,这可能会过时?!? (见下文)另一方面,我有三个扬声器使用 WebAudio API 和以下规范发出不同的声音
频率 1:17500 赫兹 频率2:18500赫兹 频率 3:19500 赫兹 信号长度:200 ms + 5ms 的增益节点的淡入和淡出,因此总和为 210ms我的目标是确定发出的声音之间的到达时间差 (TDoA)。所以在每次迭代中,我从我的 AudioRecord 缓冲区中读取 100 个字节,然后我想确定时间差(如果我找到了我的声音之一)。到目前为止,我使用了一个简单的频率滤波器(使用 fft)来确定 TDoA,但这在现实世界中确实不准确。
到目前为止,我发现我可以使用互相关来更好地确定 TDoA 值(http://paulbourke.net/miscellaneous/correlate/ 和 SO 上的一些线程)。现在我的问题是:目前我认为我必须将记录的信号(我的短阵列)与上面三个声音中的每一个的生成信号相关联。但我正在努力产生这个信号。使用在 (http://repository.tudelft.nl/view/ir/uuid%3Ab6c16565-cac8-448d-a460-224617a35ae1/ section B1.1. genTone()) 找到的代码并不能清楚地解决我的问题,因为这将生成一个比我记录的样本大得多的数组。到目前为止,我知道互相关需要两个相同大小的数组才能工作。那么如何生成样本数组呢?
另一个问题:目前为止关于如何确定TDoA的想法是否正确?
【问题讨论】:
【参考方案1】:以下是我过去几天学到的一些经验教训:
我可以使用互相关 (xcorr) 或频率识别技术来确定 TDoA。后一种则更加不精确。所以我专注于 xcorr。 我可以通过在我记录的信号和两个参考信号上应用 xcorr 来实现 TDoA。例如。我的记录有 1000 个样本。使用 xcorr,我可以识别样本 500 处的声音 A 和样本 600 处的声音 B。所以我知道它们有 100 个样本的时间差(可以根据采样率转换为秒)。因此,我使用this code found on SO 生成了一个线性啁啾(啁啾比简单的正弦波更好(参见文献))。举一个简单的例子,为了检查我的实验是否有效,我将我的记录以及我生成的啁啾声音保存为 .wav 文件(有很多代码示例如何做到这一点)。然后我使用 MatLab 作为计算 xcorr 的简单方法:see here
另一点:“xcorr 的输入必须是相同的大小?”我不太确定这部分,但我认为必须这样做。我们可以通过将两个信号零填充到相同长度来实现这一点(最好是 2 的幂,因此我们可以使用 FFT 的有效 Radix-2 实现)然后使用 FFT 计算 xcorr(参见 SO 的另一个链接)
我希望到目前为止这是正确的,并且涵盖了其他人的一些问题:-)
【讨论】:
以上是关于互相关:Android AudioRecord 为 TDoA 创建示例数据的主要内容,如果未能解决你的问题,请参考以下文章
安卓Android开发:使用AudioRecord录音将录音保存为wav文件使用AudioTrack保存录音
安卓Android开发:使用AudioRecord录音将录音保存为wav文件使用AudioTrack保存录音