C# - 麦克风噪音检测

时间:2015-09-01 11:31:52

标签: c# audio naudio microphone recording

我正在使用nAudio Library来捕获麦克风输入。但我遇到了一个问题。 我正在使用nAudio示例应用程序中的代码(我稍微修改过)。 代码生成基于麦克风输入的WAV文件并将其呈现为波形。这是代码。

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文件的结果,没有声音,只有麦克风噪音。

-54.089102453893 in dB
-51.9171950072361 in dB
-53.3478098666891 in dB
-53.1845794096928 in dB
-53.8851764055102 in dB
-57.5541358628342 in dB
-54.0121140454216 in dB
-55.5204248291508 in dB
-54.9012326746571 in dB
-53.6831017096011 in dB
-52.8728852678309 in dB
-55.7021600863786 in dB

正如我们所看到的,当没有输入声音时,db级别会在-55左右徘徊,只有静音。如果我记录说&#34;你好&#34;在正常音调的麦克风中,db值将转到-20左右。我在某处读到平均人声约为20dB,-3dB到-6dB是麦克风的ZERO值范围。

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

我在codeplex搜索了nAudio文档但没有找到答案。在我的观察中,那里的文档需要更加解释,然后只是一堆Q&amp; A [没有冒犯nAudio:]]

1 个答案:

答案 0 :(得分:3)

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

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

总而言之,看起来,就像你已经做好了一切。 希望它有所帮助。

编辑:顺便说一句,正如你所看到的,沉默与人类言语之间确实存在~23-25dbm的差异