0

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

C#.net Nadio 库史蒂夫。

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

1 回答 1

0

首先,您应该以分贝为单位处理音频。这里的这篇文章包括关于如何将音频缓冲区计算为以分贝为单位的 RMS 值的 ac#sharp 示例:

在c#中计算分贝

其次,拆分您的方法,使它们的名称有意义,从而更易于阅读和管理。您已将方法命名为 ProcessData,它返回一个布尔值,但对该方法的注释是:根据 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;
}

我不确定您的 AudioThres 首先来自哪里,但使用上面的代码,它应该以分贝为单位。

过滤不会完全消除瞬态信号,即使它们确实倾向于驻留在较高的频率范围内(一般来说,用麦克风录制的家庭音频)。缓冲区长度对确定总体峰值与平均 RMS 值的影响最大。一个小的缓冲区会给你更多的“峰值”结果,一个更大的缓冲区会给你更多的平均总体 (RMS) 值,这可能是你所追求的。

此外,您从麦克风听到的一般噪音可能来自脏的开关或麦克风到计算机的脏连接。

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

于 2013-07-04T00:53:25.210 回答