Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 互相关:Android AudioRecord为TDoA创建样本数据_Java_Android_Signal Processing_Audio Recording_Cross Correlation - Fatal编程技术网

Java 互相关:Android AudioRecord为TDoA创建样本数据

Java 互相关:Android AudioRecord为TDoA创建样本数据,java,android,signal-processing,audio-recording,cross-correlation,Java,Android,Signal Processing,Audio Recording,Cross Correlation,在我的Android智能手机一侧,我正在使用AudioRecord.read()录制音频流。对于录音,我使用以下规格 采样频率:44100赫兹 单通道 PCM-16位 我用于AudioRecord.read()的数组大小:100(短数组) 使用这个小尺寸可以让我每0.5ms读取一次(平均值),所以我可以在以后使用这个时间戳进行多边测量(至少我这么认为:-))。如果我能用互相关来确定时差,这可能就过时了?!?(见下文) 另一方面,我有三个扬声器使用WebAudio API和以下规范发出不同

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

  • 采样频率:44100赫兹
  • 单通道
  • PCM-16位
  • 我用于AudioRecord.read()的数组大小:100(短数组)
    • 使用这个小尺寸可以让我每0.5ms读取一次(平均值),所以我可以在以后使用这个时间戳进行多边测量(至少我这么认为:-))。如果我能用互相关来确定时差,这可能就过时了?!?(见下文)
另一方面,我有三个扬声器使用WebAudio API和以下规范发出不同的声音

  • 频率1:17500赫兹
  • 频率2:18500赫兹
  • 频率3:19500赫兹
  • 信号长度:200ms+5ms增益节点的淡入淡出,所以总计210ms
我的目标是确定发出的声音之间的到达时差(TDoA)。因此,在每次迭代中,我从我的录音缓冲区读取100字节,然后我想确定时间差(如果我找到了我的一个声音)。到目前为止,我已经使用了一个简单的频率滤波器(使用fft)来确定时差,但这在现实世界中确实是不准确的

到目前为止,我发现我可以使用互相关更好地确定TDoA值(这里的一些线程也是如此)。现在我的问题是:目前我认为我必须将录制的信号(我的短阵列)与上面三个声音中的每一个的生成信号相关联。但我正在努力产生这个信号。使用(第B1.1.genTone()节)中的代码显然不能解决我的问题,因为这将生成比我记录的样本更大的数组。到目前为止,我知道互相关需要两个相同大小的数组才能工作。那么,如何生成样本数组呢


另一个问题:到目前为止,如何确定时差的想法是否正确?

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

  • 我可以使用互相关(xcorr)或频率识别技术来确定时差。后者远不精确。所以我把重点放在xcorr上
  • 我可以通过在我记录的信号和两个参考信号上应用xcorr来实现时差。我的记录有1000个样本。使用xcorr,我可以识别样本500处的声音A和样本600处的声音B。因此,我知道它们的时间差为100采样(根据采样率可以转换为秒)
因此,我使用以下方法生成线性啁啾(啁啾比简单的正弦波好(参见文献))。作为一个简单的例子,为了检查我的实验是否有效,我将我的记录以及生成的啁啾声音保存为.wav文件(有很多代码示例可以执行此操作)。然后,我使用MatLab作为计算xcorr的简单方法:

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


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

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

  • 我可以使用互相关(xcorr)或频率识别技术来确定时差。后者远不精确。所以我把重点放在xcorr上
  • 我可以通过在我记录的信号和两个参考信号上应用xcorr来实现时差。我的记录有1000个样本。使用xcorr,我可以识别样本500处的声音A和样本600处的声音B。因此,我知道它们的时间差为100采样(根据采样率可以转换为秒)
因此,我使用以下方法生成线性啁啾(啁啾比简单的正弦波好(参见文献))。作为一个简单的例子,为了检查我的实验是否有效,我将我的记录以及生成的啁啾声音保存为.wav文件(有很多代码示例可以执行此操作)。然后,我使用MatLab作为计算xcorr的简单方法:

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

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