C# - 麦克风噪音检测

6

我正在使用nAudio库来捕获麦克风输入,但我遇到了一个问题。我使用的是从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 分贝 -51.9171950072361 分贝 -53.3478098666891 分贝 -53.1845794096928 分贝 -53.8851764055102 分贝 -57.5541358628342 分贝 -54.0121140454216 分贝 -55.5204248291508 分贝 -54.9012326746571 分贝 -53.6831017096011 分贝 -52.8728852678309 分贝 -55.7021600863786 分贝
我们可以看到,在没有输入声音,只有沉默的情况下,分贝级别围绕着-55左右。如果我以正常音调在麦克风中录制说“你好”,分贝值将达到约-20左右。我在某处读到,人类平均谈话为20dB,而-3dB至-6dB是麦克风的零值范围。
问题:我是否正确计算了分贝值?(我使用了此处某人提出的公式)...为什么分贝总是呈负数?我是否缺少重要的概念或机制?
我在codeplex上搜索了nAudio文档,但没有找到答案。据我观察,那里的文档需要更多解释性内容,而不仅仅是一堆问答。
1个回答

3
如果我理解这个公式正确的话,你计算的实际值是dBm,这是完全可以的,因为dB只是用来衡量放大的单位,不能用来衡量信号强度/振幅(例如你可以说我将信号放大了3 dB,但不能说我的信号强度是6 dB)。
负值只是由于公式中的对数转换部分(将瓦特/毫瓦转换为dB),并且由于你处理的信号相对较弱。
所以总之,看起来你已经做得很好了。希望能有所帮助。
编辑:顺便说一下,正如你所看到的,静音和人类语音之间确实存在约23-25dbm的差异。

感谢您的快速回复。@Felix Av,我的任务要求如果麦克风噪音<10db,则显示“低噪音”消息,如果高于10db,则显示“高噪音”消息。只是一个愚蠢的问题,任务范围是从人类角度给出的吗?因为我从程序中得到的所有值都是负数(从麦克风的角度),我应该如何将两个dB范围相关联,即我的程序生成的范围和任务范围?非常感谢。 - imran2155
我认为,如果静音级别为X(假设麦克风未连接且信号为-80db,则应检查级别),则低噪声是小于X + 10的所有内容,高噪声是大于X + 10的所有内容。 - Felix Av

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接