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


采样率:44100 Hz
单声道
PCM-16位
我用于AudioRecord.read()的数组的大小:100(短数组)


使用这个小尺寸可以让我每0.5ms(平均值)读取一次,因此我可以稍后将该时间戳用于多边定位(至少我认为是这样的:-))。如果我可以使用互相关来确定TDoA?!?,也许这已经过时了。 (见下文)



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


频率1:17500 Hz
频率2:18500 Hz
频率3:19500 Hz
信号长度:200毫秒+增益节点的淡入和淡出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/ B1.1。genTone()节中的代码)不能清楚地解决我的问题,因为这将生成比记录的样本大的数组。到目前为止,我知道互相关需要两个大小相同的数组才能起作用。那么如何生成示例数组?

另一个问题:到目前为止,如何确定TDoA的想法正确吗?

最佳答案

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


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


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

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

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

关于java - 互相关:Android AudioRecord为TDoA创建示例数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36979059/

10-10 06:45