【问题标题】:AnalyserNode.getFloatFrequencyData() returns negative valuesAnalyserNode.getFloatFrequencyData() 返回负值
【发布时间】:2020-05-29 23:01:07
【问题描述】:

我正在尝试使用 AnalyserNode.getFloatFrequencyData() 使用 Web 音频 API 获取麦克风输入的音量。

规范声明“数组中的每个项目代表特定频率的分贝值”,但它只返回负值,尽管它们看起来确实对声音级别做出反应 - 哨声将返回大约-23 和 -80 附近的静音(dataArray 中的值也都是负数,所以我认为这与我如何将它们相加无关)。相同的代码使用 AnalyserNode.getByeFrequencyData() 给出了我期望的值(正),但返回的分贝值已在 0-255 之间标准化,因此更难将它们加在一起以确定整体音量。

为什么我没有得到我期望的值?和/或这可能不是首先获得麦克风输入音量的好方法吗?

function getVolume(analyser) {
  analyser.fftSize = 32; 
  let bufferLength = analyser.frequencyBinCount;
  let dataArray = new Float32Array(bufferLength);
  analyser.getFloatFrequencyData(dataArray);
  let totalAntilogAmplitude = 0;
  for (let i = 0; i < bufferLength; i++) {
    let thisAmp = dataArray[i]; // amplitude of current bin
      let thisAmpAntilog = Math.pow(10, (thisAmp / 10)) // antilog amplitude for adding
      totalAntilogAmplitude = totalAntilogAmplitude + thisAmpAntilog; 
  }
  let amplitude = 10 * Math.log10(totalAntilogAmplitude);
  return amplitude;
}

【问题讨论】:

  • 我也遇到了同样的问题,我想知道这些值是否由于某种原因全部向下移动,也许你可以将它们全部向上移动最低值,对我来说,沉默似乎已经解决了-891.048828125 处的值。

标签: javascript web-audio-api


【解决方案1】:

您的代码看起来正确。但是如果没有示例,很难判断它是否产生了您期望的值。此外,由于您只是(基本上)计算变换系数的所有值的总和,因此您刚刚完成了对时域信号的平方求和的更昂贵的版本。

另一种方法是对信号进行平方,稍微过滤以消除变化,并在不同时间获得输出值。类似于以下内容,其中s 是具有您感兴趣的信号的节点。

let g = new GainNode(context, {gain: 0});
s.connect(g);
s.connect(g.gain);
// Output of g is now the square of s

let f = new BiquadFilterNode(context, {frequency: 10});
// May want to adjust the frequency some to other value for your needs.
// I arbitrarily chose 10 Hz.
g.connect(f).connect(analyser)

// Now get the time-domain value from the analyser and just take the first 
// value from the signal.  This is the energy of the signal and represents 
// the volume.

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2012-01-26
    • 2011-07-22
    • 2011-03-05
    • 2018-03-02
    相关资源
    最近更新 更多