C# Naudio-计算音频级别上升到某个级别以上的次数

C# Naudio-计算音频级别上升到某个级别以上的次数,c#,naudio,C#,Naudio,我对这个很陌生,所以我会尽力解释。 我想计算音频级别超过某个级别的次数。我发现/创建了一些代码,可以检测级别是否超过某个阈值,但无法确定如何可靠地计算其超过该阈值的次数。声音/噪音是由连接到麦克风的开关产生的,每次开关时,开关都会产生噪音。我需要使用某种过滤吗 Naudio图书馆 史蒂夫 public-void-listening() { WaveIn waveInStream=新的WaveIn(); waveInStream.Buffer毫秒=500; waveInStream.DataAva

我对这个很陌生,所以我会尽力解释。 我想计算音频级别超过某个级别的次数。我发现/创建了一些代码,可以检测级别是否超过某个阈值,但无法确定如何可靠地计算其超过该阈值的次数。声音/噪音是由连接到麦克风的开关产生的,每次开关时,开关都会产生噪音。我需要使用某种过滤吗

Naudio图书馆 史蒂夫

public-void-listening()
{
WaveIn waveInStream=新的WaveIn();
waveInStream.Buffer毫秒=500;
waveInStream.DataAvailable+=新事件处理程序(waveInStream_DataAvailable);
waveInStream.StartRecording();
}
//声音侦听器的处理程序
私有无效waveInStream_数据可用(对象发送方,WaveInEventArgs e)
{
bool结果=过程数据(e);
如果(结果)
{
intCounter++;
label1.Text=intCounter.ToString();
}
其他的
{
//声音没有峰值
}
}
//根据AudioThresh计算声级
专用布尔过程数据(WaveInEventArgs e)
{
布尔结果=假;
bool Tr=假;
双Sum2=0;
int Count=e.BytesRecorded/2;
对于(int index=0;index音频阈值)
{
结果=真;
}
其他的
{
结果=假;
}
返回结果;
}

首先,你应该处理分贝的音频。 这篇文章包括一个c#夏普示例,介绍如何将音频缓冲区计算为以分贝为单位的RMS值:

其次,拆分方法,使其名称有意义,从而更易于阅读和管理。您已将方法命名为ProcessData,它返回bool,但对该方法的评论是:基于AudioThresh计算声级。我建议您拆分它,例如:

private float calculateDBinRMS(buffer){
 // This method calculates and returns the RMS value of the buffer in DB
}

private bool hasReachedThreshold(buffer, AudioThres) {
 if(calculateDBinRMS(buffer) >= AudioThres)
  return true;
 return false;
}
我不确定你的音频是从哪里来的,但使用上面的代码,它应该是分贝

滤波不会完全消除瞬态信号,即使它们往往位于较高的频率范围内(一般来说,使用麦克风录制的家庭音频)。缓冲区长度将在确定总体峰值与平均RMS值时产生最大影响。较小的缓冲区将为您提供更多的“峰值”结果,较大的缓冲区将为您提供更多的平均总体(RMS)值,这可能是您所追求的

此外,麦克风发出的噪音通常可能来自脏开关或从麦克风到计算机的脏连接


在考虑了所有这些之后,计算达到阈值的次数应该是微不足道的。

问题应该与编程有关,您应该更具体一些。
private float calculateDBinRMS(buffer){
 // This method calculates and returns the RMS value of the buffer in DB
}

private bool hasReachedThreshold(buffer, AudioThres) {
 if(calculateDBinRMS(buffer) >= AudioThres)
  return true;
 return false;
}