来自库的 FFT 的电平低于 Web 音频 FFT

FFT from libraries have lower levels than Web audio FFT

我正在尝试根据 Web 浏览器中的麦克风输入绘制 FFT 图形。我创建了一个将 FFT 结果绘制成 canvas 的对象。我首先使用了网络音频分析器 (https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getByteFrequencyData) 的频率数据,得到了以黑色显示的图。它检测到大多数频率的相当大的水平,直到每个样本接近 0.5。第一张图是 FFT,第二张图是捕获的麦克风噪声。

后来我完全一样,这次使用fft.js(https://www.npmjs.com/package/fft.js)。结果 FFT 看起来几乎没有填充,即使我已经扩展了垂直轴(左上角的数字是图中的最大值)

感觉漏掉了一个概念,我想知道:为什么两次FFT的结果如此不同?我是否需要将一个尺度的输入或输出整形为另一个尺度?

您可能在这里比较苹果和橘子。根据 spec for getByteFrequencyData,您获得的值是分贝级的。

FFT 库中的值可能是线性的。如果是这样,您需要在比较结果之前将其转换为 dB。 (或将字节频率数据转换为线性)。

另请注意,WebAudio 在计算结果之前应用窗口函数。这可能会使它与您的 FFT 结果不同,除非您也应用相同的窗口函数。