首页 > 解决方案 > 来自库的 FFT 的级别低于 Web 音频 FFT

问题描述

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

网络音频 api 分析器 fft 的图

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

看起来几乎没有填充的 FFT 图

我觉得有一个概念我错过了,我想知道:为什么两个 FFT 的结果如此不同?我是否需要将输入或输出从一个比例调整为另一个?

标签: signal-processingfftweb-audio-api

解决方案


你可能在这里比较苹果和橘子。根据 的规范getByteFrequencyData,您获得的值以 dB 为单位。

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

另请注意,WebAudio 在计算结果之前应用了一个窗口函数。除非您还应用相同的窗口函数,否则这可能会使其与您的 FFT 结果不同。


推荐阅读