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

Audio 从麦克风实时检测音频峰值,audio,detection,Audio,Detection,我需要从拾音麦克风检测现场音频中的峰值,并在.txt文件中输出峰值的精确时间(毫秒或最好是纳秒) 我一直在寻找两种可能的解决办法。第一种方法是在linux中设置一个shell脚本,通过nohup函数记录5秒的音频增量,然后在matlab中对其进行分析,但这里的问题是,记录的文件的结尾和开头并不完全相隔5秒。新文件开始录制时会有50-150毫秒的延迟 第二个选择是做一些类似于他们用于clap灯开关的事情,但我不知道如何从中提取准确的时间。我也不知道这是否适用于拾音麦克风,还是只适用于声音传感器(用

我需要从拾音麦克风检测现场音频中的峰值,并在.txt文件中输出峰值的精确时间(毫秒或最好是纳秒)

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

第二个选择是做一些类似于他们用于clap灯开关的事情,但我不知道如何从中提取准确的时间。我也不知道这是否适用于拾音麦克风,还是只适用于声音传感器(用于Arduino…),如图所示


我想知道是否有更好的解决办法。我可以用C++或java做这个吗?请记住,我需要以毫秒或纳秒为单位输出准确的时间。

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

首先,您需要从众多可用的音频捕获播放API中选择一个。你没有提到你在哪个平台上,但如果你在linux上,你可以看看ALSA、Jack、OSS、SDL等等。一旦您能够配置捕获设备并开始接收样本,那么每个样本的方法都将是相似的。您将获得接收样本的某种函数回调,并需要扫描样本以查找峰值和计算时间等

下面是一个回调的示例。请记住,您选择的API有其自身的微妙之处,您可能需要将字节数组转换为双精度数组,等等。。。
时间
将是精度为1/采样器的
双精度值

 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++;
     }
 } 
int sampleCount=0;
void BufferCallback(双*样本,整数样本)
{
对于(int i=0;i阈值)
{
//超过峰值阈值,记录时间
双倍时间=采样计数/(双倍)取样器;
}
sampleCount++;
}
}