从麦克风实时进行音频峰值检测

时间:2016-01-18 19:26:42

标签: audio detection

我需要检测来自拾音麦克风的实时音频中的峰值,并在.txt文件中输出精确时间到毫秒或最好是纳秒的峰值。

我一直在寻找两种可能的解决方案。第一个是在linux中设置一个shell脚本,通过nohup函数记录5秒的音频增量,然后在matlab中分析它们,但这里的问题是记录文件的结尾和开头不完全是5秒分开。新文件开始录制时会有50-150毫秒的延迟。

第二种选择是做类似于他们用于拍手灯开关的东西,但我不知道如何从中提取确切的时间。而且我也不知道是否可以使用拾音麦克风,或者只是使用声音传感器(对于Arduino ......),如此处所示。http://en.code-bude.net/2014/12/08/how-to-build-a-clap-switch-using-arduino/

我想知道那里是否有更好的解决方案。我可以用C ++或java这样做吗?请记住,我需要以毫秒或纳秒输出准确的时间。

1 个答案:

答案 0 :(得分:0)

为了获得准确的时间信息,您需要对样本进行计数,然后计算从记录开始的时间。

首先,您需要决定可用的众多音频捕获回放API之一。你还没有提到你在哪个平台上,但如果你在linux上,你可以看一下ALSA,Jack,OSS,SDL等等。一旦你能够配置捕获设备并开始接收样本,那么每个方法的方法都是类似的。您将获得与接收到的样本进行某种函数回调,并且需要扫描样本的峰值并计算时间等...

以下是回调可能的示例。请记住,您选择的API将有自己的细微之处,并且您可能需要将字节数组转换为双精度等... time将是double精度值准确度为1 / SAMPLERATE。

 int sampleCount = 0;
 void BufferCallback(double* samples, int numSamples)
 {
     for (int i = 0 ; i < numSamples ; i++)
     {
         if (abs(samples[i]) > threshold)
         {
             // exceeded peak threshold, record the time
             double time = sampleCount / (double)SampleRate;
         }
         sampleCount++;
     }
 }