Naudio-计算音频级别上升到某个级别以上的次数
本文关键字:计算 音频 Naudio- | 更新日期: 2023-09-27 18:20:50
我对此很陌生,所以我会尽力解释。我想计算音频级别超过某个级别的次数。我发现/创建了一些代码,可以检测级别是否超过了某个阈值,但不知道如何可靠地计算它超过该阈值的次数。声音/噪音是由连接到麦克风的开关产生的,每次开关都会产生噪音。我需要使用某种过滤吗?
C#.net Naudio库史蒂夫。
public void StartListening()
{
WaveIn waveInStream = new WaveIn();
waveInStream.BufferMilliseconds = 500;
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
waveInStream.StartRecording();
}
//Handler for the sound listener
private void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
{
bool result = ProcessData(e);
if (result)
{
intCounter++;
label1.Text = intCounter.ToString();
}
else
{
//no peak in sound
}
}
//calculate the sound level based on the AudioThresh
private bool ProcessData(WaveInEventArgs e)
{
bool result = false;
bool Tr = false;
double Sum2 = 0;
int Count = e.BytesRecorded / 2;
for (int index = 0; index < e.BytesRecorded; index += 2)
{
double Tmp = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]);
Tmp /= 32768.0;
Sum2 += Tmp * Tmp;
if (Tmp > AudioThresh)
Tr = true;
}
Sum2 /= Count;
// If the Mean-Square is greater than a threshold, set a flag to indicate that noise has happened
if (Sum2 > AudioThresh)
{
result = true;
}
else
{
result = false;
}
return result;
}
首先,您应该处理以分贝为单位的音频。这篇文章包括一个关于如何将音频缓冲区计算为以分贝为单位的RMS值的尖锐例子:
计算c#中的分贝
其次,拆分方法,使它们的名称更有意义,从而更易于阅读和管理。您已将方法命名为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;
}
我一开始不确定你的AudioShres是从哪里来的,但使用上面的代码,它应该以分贝为单位。
滤波并不能完全消除瞬态信号,即使它们往往位于较高的频率范围内(通常来说,是用麦克风录制的家用音频)。缓冲区长度对确定总峰值与平均RMS值的影响最大。小缓冲区会给你更多的"峰值"结果,而大缓冲区会让你得到更多的平均总(RMS)值,这可能就是你想要的。
此外,麦克风发出的噪音通常可能来自脏开关或麦克风与计算机的连接。
在考虑了所有这些之后,计算达到阈值的次数应该是微不足道的。