C# - Обнаружение шума микрофона

Я использую библиотеку 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, когда нет входного звука, только тишина. если я записываю со словами "Hello" в микрофоне обычным тоном, значение d b будет равно -20 или около того. Я где-то читал, что средний уровень разговора между людьми составляет около 20 дБ, а от -3 дБ до -6 дБ - это нулевой диапазон значений для микрофона.

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

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

1 ответ

Решение

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

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

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

РЕДАКТИРОВАТЬ: Кстати, как вы можете видеть, есть действительно ~23-25 ​​дБм разница между тишиной и человеческой речью

Другие вопросы по тегам