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;
    }

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

首先,您应该处理以分贝为单位的音频。这篇文章包括一个关于如何将音频缓冲区计算为以分贝为单位的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)值,这可能就是你想要的。

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

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