2016-08-09 3 views
1

Я пытаюсь реализовать метр объема, чтобы помочь пользователям выбрать свой микрофон, используя NAudio. Мне нужно сделать все возможное, чтобы отсеять устройства, которые имеют только фоновый шум и застраховать, когда я говорю что-то, когда они говорят.Как рассчитать дБ из StreamVolumeEventArgs.MaxSampleValues ​​NAudio?

В настоящее время мы используем версию 1.7.3 в приложении Unity3D, поэтому ни один из связанных подходов MMDevice не доступен при их сбое.

Я использую WaveInEvent, который я подаю в WaveInProvider, который затем передаю в SampleChannel. Я подаю SampleChannel в MeteringSampleProvider, который я подписал на событие StreamVolume.

В моем обработчике событий OnPostVolumeMeter, когда я получаю StreamVolumeEventArgs (я назвал параметр e) Мне интересно, как рассчитать децибелы. Я видел множество примеров, которые вылавливают максимальный объем (или иногда его называют амплитудой) от e.MaxSampleValues[0]. Некоторые примеры проверяют, является ли это стереофоническим сигналом и хватит максимум между e.MaxSampleValues[0] или e.MaxSampleValues[1].

В любом случае, каковы значения этого числа? Это процент? Они являются относительно небольшими десятичными знаками (10^-3 или 10^-4), когда я откидываюсь на консоль.

ли расчет что-то вроде

var peak = e.MaxSampleValues[0]; 
if (e.MaxSampleValues.Length > 1) 
{ 
    peak = Mathf.Max(e.MaxSampleValues[0], e.MaxSampleValues[1]); 
} 
var dB = Mathf.Max(20.0f*Mathf.Log10(peak), -96.0f); 

или мне нужно разделить пик на 32768.0? Как и в,

var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f); 

Является ли этот подход в корне неверно, и мне нужно собрать буфер образцов, что я делаю RMS вид расчета, где я вычислить квадратный корень из суммы средних значений, деленная на количество образцов все разделены на 32768 и подаются в Log10?

Я видел несколько ссылок, чтобы смотреть на AudioPlaybackPanel в NAudioDemo и устанавливает volumeMeter Amplitude быть значения e.MaxSampleValues[0] и e.MaxSampleValues[1]

+0

Я также рассматривал эту статью [1] Wikipedia, и теперь мне интересно, является ли значение, которое я получаю в e.MaxSampleValues ​​[], «отношение амплитуды»? [1] https://en.wikipedia.org/wiki/Decibel#Absolute_measurements – Scott

ответ

0

глядя на дату вашего поста это, вероятно, решена проблема для вы, но в интересах других здесь.

Звуковые сигналы колебаются между отрицательными и положительными значениями в волне. Частота колебания и амплитуда или высота эффекта качания - то, что вы слышите.

Вы правильно говорите, что ищете амплитуду, чтобы увидеть, присутствует ли звук.

Для измерителя, так как частота дискретизации намного выше, чем частота обновления любого измерителя, которую вы, вероятно, будете отображать, вам нужно либо записать пик с помощью math.max, либо выполнить среднее значение по нескольким образцам. В вашем случае либо будет работать, если вы не попытаетесь показать точный метр в bdFS, расчет db не понадобится.

В приложениях, где я искал, чтобы запускать вещи, основанные на наличии звука или отсутствии их. Я обычно конвертирую образцы в float, это даст вам диапазон от 0 до 1, а затем выберите пороговое значение 0,2 и скажем, если какой-либо образец выше, чем у нас есть звук.

Поплавок также обеспечивает приятный показательный счетчик для отображения.Обратите внимание, если ваше приложение предназначено для профессионального аудио приложения, и вы спрашивали о точном измерении, мой ответ будет совершенно другим.