2016-07-22 4 views
6

Я создал метод getSpectrum с использованием метода getByteFrequencyData в узле анализатора Web Audio API. Массив возвращенных аудиоданных относится к источнику звука (либо к экземпляру el, либо к аудио()) volume, значение от 0 до 1.Нормализовать аудиоданные из getByteFrequencyData по объему

Используя громкость аудиоисточника, я пытаюсь нормализовать каждое полученное значение из getByteFrequencyData, так что пользователю getSpectrum не нужно беспокоиться об объеме, когда они визуализируют аудиоданные.

Это полосатая вниз версия getSpectrum

var audioData = new Uint8Array(analyser.binCount); 
var spectrum = []; 

analyser.getByteFrequencyData(audioData); 

for (var i = 0; i < audioData.length; i++) { 
    var value = audioData[i]; 

    //Where I'm trying to calculate the value independent of volume 
    value = ((value/audioEl.volume)/255); 

    spectrum.push(value); 
} 

return spectrum; 

В W3C spec ссылается на уравнении, используемое для вычисления возвращаемого значения дано maxDecibels и minDecibels. С моим рудиментарным пониманием я попытался изменить математику, чтобы получить нормализованное значение, но я не могу заставить его работать правильно. У меня возникли проблемы с достижением этого только с величиной объема от 0 до 1.

Любое подстрекательство было бы высоко оценено! Heres a working example вопроса. Изменение слайдера объема покажет проблему.

Обновление 7/22/16: Благодаря ответу @ raymond-toy я выяснил, как преобразовать значение 0 в 1 в децибелы.

volumeDB = Math.abs((Math.log(volume)/Math.LN10)*20); 

После получения DB, я на противоположный уравнение в W3C спецификации,

value = ((audioDataValue * volumeDB)/255) - volumeDB 

К сожалению, value как-то по-прежнему заканчивается относительно volume. Кто-нибудь видит, что мне не хватает?

+1

Вы можете обойти эту проблему, поставив GainNode в между 'analyser' и вашей' контексте. destination'. Тогда у вас будет ползунок громкости, который регулирует GainNode вместо громкости звука. Таким образом, громкость корректируется только после прохождения вашего анализатора. – idbehold

+0

Для чего я работаю, я бы не стал контролировать то, что задает том, поэтому я не смог бы поставить GainNode перед тем, что было бы. Это хорошая идея. Будет рассматривать его для других проектов. –

ответ

1

Видимо, я был по ошибке. Как указывал @raymond-toy, значения спектра неявно относительно объема. Нормализация означала бы потерю части данных «с нижней части спектра», что не было моей целью.

Если кто-то любопытно, я в конечном итоге просто разделив audioDataValue на 255, получая поплавок от 0 до 1.

1

getByteFrequencyData возвращает значения в дБ. Вы не хотите делить эти значения на аудиоэкземпляр. Вы хотите преобразовать (как-то!) AudioE1.volume до значения дБ и добавить (или вычесть), что из значений из getByteFrequencyData

Это может быть легче понять вещи, если вы использовали getFloatFrequencyData первый, чтобы увидеть, что происходит.

+0

Это был отличный первый шаг. Нашел математику, чтобы превратить от 0 до 1 объема в DB 'Math.abs ((Math.log (volume) /Math.LN10) * 20)'. Подключить это к обратному уравнению спецификации w3c тоже не удалось. 'value = ((audioDataValue * volumeDB)/255) - volumeDB;' 'значение' по-прежнему заканчивается по отношению к тому как-то. IDK, что я делаю неправильно. –

+1

Я думаю, что вам лучше со значением = audioDataValue - volumedB. Не разделяйте по объемуDB; деление двух значений дБ действительно не имеет смысла. И я не понимаю, почему вы хотите нормализовать спектр. Это не будет работать правильно с getByteFrequency, потому что по мере уменьшения объема вы все равно потеряете значения от нижней части спектра. –

+0

Я вижу, что вы говорите. Вычитание имеет смысл, просто не знал, что это сработало. Я предположил, что изменение в audioDataValue как-то пропорционально уровню громкости. Я попробую это –

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