Naudio - 计算音频电平上升到一个电平以上的次数

Posted

技术标签:

【中文标题】Naudio - 计算音频电平上升到一个电平以上的次数【英文标题】:Naudio - Count the times audio level rises above a level 【发布时间】:2013-07-03 18:50:55 【问题描述】:

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

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;
    

【问题讨论】:

这个问题应该是和编程有关的,你要具体一点。 【参考方案1】:

首先,您应该以分贝为单位处理音频。 此处的这篇文章包含一个 c# 尖锐示例,说明如何将音频缓冲区计算为以分贝为单位的 RMS 值:

Calculate decibels in 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) 值,这可能是你所追求的。

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

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

【讨论】:

以上是关于Naudio - 计算音频电平上升到一个电平以上的次数的主要内容,如果未能解决你的问题,请参考以下文章

NAudio 通过我的代码设置左右扬声器电平(平衡控制)

音频:如何设置默认麦克风的电平?

上升沿

上升沿和下降沿

iPhone 4,录音后的音频电平问题

Core Audio:用于提升信号电平的音频单元