2016-08-16 1 views
3

Я знаю, что getByteFrequencyData возвращает громкость в дБ каждой полосы частот. Как определить общий объем в дБ сигнала, который будет отображаться на счетчике VU?Как правильно определить объем в дБ от getByteFrequencyData

В большинстве случаев я вижу код, который просто добавляет громкость каждой полосы частот, а затем делит сумму на количество полос, но это наверняка неверно. Это означало бы, что КАЖДОЙ диапазон частот должен составлять 6 дБ для всего сигнала 6 дБ. Это, конечно, не так.

Мои вопросы:

  1. Как я могу определить общий объем сигнала правильно?

  2. Если minDecibels установлено на -96 и maxDecibels на 0, я полагаю, что значение 0 равно -96 дБ и значение от 255 до 0 дБ. Но: Что означало бы значение 128? -48 дБ?

ответ

1
  1. Я думаю, что это зависит от того, что вы имеете в виду под «объемом». Если это энергия сигнала, вы можете просто взять среднее значение от getFloatFrequencyData, но среднее значение не должно усреднять значения дБ. Перед выполнением среднего нужно преобразовать в линейный. Это дорого; вы можете просто взять данные во временной области и вычислить среднюю сумму квадратов и получить тот же ответ (почти).
  2. Да, данные БПФ преобразуются в дБ, а затем линейно отображаются между минимальными и максимальными значениями. См. https://webaudio.github.io/web-audio-api/#widl-AnalyserNode-getByteFrequencyData-void-Uint8Array-array.
+0

Спасибо за это. Под «томом» я имею в виду то же самое, что VU-метры показывают в профессиональном звуковом программном обеспечении. Я хочу создать аналогичный VU. Индикатор VU должен показывать уровень от -96 до 0 дБ. Как мне это сделать? –

+0

Google - ваш друг. Один из примеров, который я нашел, - https://github.com/cwilso/volume-meter. Это должно заставить вас начать. –

+1

Так что читаю. 1. Пример, на который вы ссылаетесь, не работает. 2. Он использует устаревший метод: https://webaudio.github.io/web-audio-api/#the-scriptprocessornode-interface---deprecated 3. Прочитайте мой вопрос: я знаю, как получить данные канала , Я не знаю, как правильно рассчитать громкость ** в дБ **. –

0

Я тоже борюсь с этой проблемой - результаты из среднего результата getByteFrequencyData выглядят не так.

Упрощенным решением было бы вернуть значение пика из данных частоты.

var array = new Uint8Array(buffer_size); 

listenerNode.onaudioprocess = function(){ 

    // Get the audio data and store it in our array. 
    volume_analyser.getByteFrequencyData(array); 

    // Get the peak frequency value. 
    var peak_frequency = Math.max.apply(null, array); 

    // ... 
} 

Это дает результаты, которые выглядят нормальный на экране прибора VU.

+0

Я не уверен, что это трюк, так как это даст вам только громкость полосы частот с наибольшей громкостью. Но «общий» объем представляет собой смесь объема всех полос частот. –

+0

Я чувствую себя немного взломанным, согласен. Однако, используя этот метод, он ведет себя как аналоговые VU-метры, к которым я привык. Если мы возьмем среднее значение, тогда мы получим максимальный объем, если ВСЕ частоты будут равны 0dBFS.В реальном мире, если одна полоса частот обрезается, вы хотите знать об этом! –

Смежные вопросы