按音量规范化getByteFrequencyData中的音频数据

Normalize audio data from getByteFrequencyData by volume

本文关键字:音频 数据 getByteFrequencyData 规范化      更新时间:2023-09-26

我已经在Web Audio API的分析器节点上使用getByteFrequencyData方法创建了一个getSpectrum方法。返回的音频数据数组是相对于音频源的(el或audio()实例)volume的,值从0到1。

使用音频源的音量,我试图对从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规范引用了用于计算给定maxDecibels和minDecibels的返回值的公式。根据我的初步理解,我试图对数学进行逆运算,这样我就得到了一个归一化的值,但我无法使它完全正确。我很难用从0到1的音量值来实现这一点。

任何煽动都将不胜感激!以下是该问题的一个工作示例。更改音量滑块可以说明问题。

2016年7月22日更新:感谢@raymond toy的回答,我学会了如何将0到1的音量值转换为分贝。

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

在得到DB后,我在W3C规范中颠倒了等式

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

不幸的是,value在某种程度上仍然相对于volume结束。有人看到我缺了什么吗?

getByteFrequencyData返回以dB为单位的值。你不想用audioE1.volume除以这些值。你想(以某种方式!)将audioE1.volume转换为dB值,并将其从getByteFrequencyData 的值中相加(或相减)

如果您先使用getFloatFrequencyData来了解发生了什么,可能会更容易理解。

显然我是在做傻事。正如@raymond toy所指出的,Spectrum值隐含地相对于体积。规范化将意味着丢失"光谱底部"的一部分数据,这不是我的目标。

如果有人好奇的话,我最终只是将audioDataValue除以255,得到了从0到1的浮点值。