2015-09-01 105 views
5

我正在使用nAudio库来捕获麦克风输入。但我遇到了一个问题。 我正在使用nAudio示例应用程序中的代码(我稍微修改了该代码)。 这些代码根据麦克风输入生成WAV文件并将其呈现为波形。这是代码。C# - 麦克风噪声检测

private void RenderFile() 
{ 
     SampleAggregator.RaiseRestart(); 
     using (WaveFileReader reader = new WaveFileReader(this.voiceRecorderState.ActiveFile)) 
     { 
      this.samplesPerSecond = reader.WaveFormat.SampleRate; 
      SampleAggregator.NotificationCount = reader.WaveFormat.SampleRate/10; 
      //Sample rate is 44100 

      byte[] buffer = new byte[1024]; 
      WaveBuffer waveBuffer = new WaveBuffer(buffer); 
      waveBuffer.ByteBufferCount = buffer.Length; 
      int bytesRead; 
      do 
      { 
       bytesRead = reader.Read(waveBuffer, 0, buffer.Length); 
       int samples = bytesRead/2; 
       double sum = 0; 
       for (int sample = 0; sample < samples; sample++) 
       { 
        if (bytesRead > 0) 
        { 
         sampleAggregator.Add(waveBuffer.ShortBuffer[sample]/32768f); 
         double sample1 = waveBuffer.ShortBuffer[sample]/32768.0; 
         sum += (sample1 * sample1); 

        } 
       } 
       double rms = Math.Sqrt(sum/(SampleAggregator.NotificationCount)); 
       var decibel = 20 * Math.Log10(rms); 



       System.Diagnostics.Debug.WriteLine(decibel.ToString() + " in dB"); 
      } while (bytesRead > 0); 
      int totalSamples = (int)reader.Length/2; 
      TotalWaveFormSamples = totalSamples/sampleAggregator.NotificationCount; 
      SelectAll(); 
     } 
     audioPlayer.LoadFile(this.voiceRecorderState.ActiveFile); 
} 

下面是没有声音,但只有麦克风噪音2秒WAV文件的结果有点块。

以dB -54.089102453893
以dB -51.9171950072361
以dB -53.3478098666891
-53.1845794096928以dB
-53.8851764055102以dB
以dB -57.5541358628342
-54.0121140454216以dB
-55.5204248291508以dB为单位
-54.9单位dB
-53.6831017096011单位dB
-52.8728852678309单位dB
-55.7021600863786以dB为单位

正如我们所看到的,db级别在-55没有输入声音时徘徊,只有沉默。如果我用普通的音调在麦克风中录制“你好”,那么db的值就会变成-20左右。我在某处读到平均人类谈话约为20dB,而-3dB至-6dB是麦克风的ZERO值范围。

问题:我正确计算dB值吗? (我使用了其他人在此提出的公式)......为什么dB总是出现负值?我是否缺少关键的概念或机制?

我在codeplex上搜索了nAudio文档,但没有找到答案。在我的观察,文档,需要有更多的解释则只是一堆Q的& A [无意冒犯n音讯:)]

回答

3

如果我理解正确的公式,你计算的实际值dBm的,这是绝对没问题,因为dB只是测量放大的单位,不能用于测量信号强度/幅度(也就是说你可以说我放大了3分贝的信号,但不能说我的信号强度是6分贝)。

负值仅仅是因为公式的对数转换部分(将瓦特/ miliWatts转换为db),因为你处理的信号相对较弱。

所以总之,看起来,就像你做的一切都是正确的。 希望它有帮助。

编辑:顺便说一句,你可以看到,实在是沉默和人的讲话

+2

https://en.wikipedia.org/wiki/DBFS –

+0

感谢快速反应之间〜23-25dbm差异。 @Felix Av,我的任务是,如果话筒噪音<10db,显示“低噪音”信息,如果高于10db,则显示“高噪音”信息。只是一个愚蠢的问题,是分配范围是从人的角度给出??? ....因为我从我的程序(麦克风的角度来看所有的负值),我应该如何关联两个dB范围,即我的程序生成范围和分配范围?...非常感谢 – imran2155

+0

我认为,如果沉默水平是X(假设麦克风连接不上,信号是-80db,你可能应该检查水平),那么低噪音就是一切< X + 10,高噪声> X + 10。 –