2015-09-01 6 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); 
} 

Ниже немного кусок из результате 2second файла WAV, без звука, но только микрофонный шум.

-54,089102453893 в дБ
-51,9171950072361 в дБ
-53,3478098666891 в дБ
-53,1845794096928 в дБ
-53,8851764055102 в дБ
-57,5541358628342 в дБ
-54,0121140454216 в дБ
-55,5204248291508 в дБ
-54.9в дБ
-53.6831017096011 в дБ
-52.8728852678309 в дБ
-55.7021600863786 в дБ

Как мы видим, уровень db колеблется около -55, когда нет входного звука, только тишина. если я сделаю запись «Hello» в микрофоне обычным тоном, значение db будет достигнуто -20 или около того. Я где-то читал, что средний человеческий разговор составляет около 20 дБ, а от -3 дБ до -6 дБ - диапазон значений ZERO для микрофона.

Вопрос: Я правильно вычислил значение дБ? (я использовал формулу, предложенную здесь кем-то другим) ... Почему дБ всегда появляется отрицательно? Мне не хватает принципиальной концепции или механизма?

Я искал документацию nAudio в кодексе и не нашел ответа. По моим наблюдениям, документация там должна быть более объяснительной, а затем просто связкой Q & A [no offense nAudio :)]

ответ

3

Если я правильно понял формулу, фактическое значение, которое вы вычисляете, равно дБм, и это абсолютно нормально, так как дБ является всего лишь единицей измерения усиления и не может использоваться для измерения силы сигнала/амплитуды (т. е. вы можете сказать, что я усилил сигнал на 3 дБ, но не могу сказать, что сила сигнала составляет 6 дБ).

Отрицательные значения существуют только из-за логарифмической части преобразования формулы (преобразования ваттов/miliWatts в db), и поскольку сигналы, с которыми вы имеете дело, являются относительно слабыми.

Итак, в заключение, похоже, что вы все сделали правильно. Надеюсь, это поможет.

EDIT: Кстати, как вы можете видеть, на самом деле ~ разница 23-25dbm между молчанием и человеческой речью

+2

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

+0

Спасибо за быстрый ответ. @Felix Av, мое задание говорит, что если микрофонный шум <10 дБ, отобразите сообщение с низким уровнем шума, а если выше 10 дБ, отобразите сообщение «высокий уровень шума». просто глупый вопрос, диапазон заданий дается с точки зрения человека ??? .... поскольку я получаю все значения отрицательными от моей программы (перспектива микрофона), как мне сопоставить два диапазона дБ, т.е. моя программа диапазон генерации и диапазон присвоения? ... спасибо большое – imran2155

+0

Я думаю, если уровень тишины X (скажем, микрофон даже не подключен, а сигнал -80db, вы, вероятно, должны проверить уровень), то низкий уровень шума - это все < X + 10, высокий уровень шума> X + 10. –