signal-processing - 来自库的 FFT 的级别低于 Web 音频 FFT
问题描述
我正在尝试从网络浏览器中的麦克风输入绘制 FFT。我创建了一个将 FFT 结果绘制到画布中的对象。我首先使用了网络音频分析仪(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 的结果如此不同?我是否需要将输入或输出从一个比例调整为另一个?
解决方案
你可能在这里比较苹果和橘子。根据 的规范getByteFrequencyData
,您获得的值以 dB 为单位。
FFT 库中的值可能是线性的。如果是这样,您需要在比较结果之前将其转换为 dB。(或将字节频率数据转换为线性)。
另请注意,WebAudio 在计算结果之前应用了一个窗口函数。除非您还应用相同的窗口函数,否则这可能会使其与您的 FFT 结果不同。
推荐阅读
- c# - 绑定到集合 Xamarin 中的索引
- javascript - 暂停 foreach 循环 unitl 事件发生,之后循环继续(JavaScript)
- javascript - Chrome 中不显示推送通知
- html - 绝对位置的中心下拉菜单
- python - Python 将 8 位分配到 4 x 8 位的开头,两个两个
- java - 无法在 maven+cucumber 中运行测试
- html - 通过用撇号分隔的字符串中的反斜杠撇号替换撇号来修复 HTML
- python - 如何在 Python 或 C++ 中执行严格的整数优化?
- clojure - 为什么我在 Luminus (Clojure) 中看到参数不匹配错误?
- python - 如果行不包含熊猫中的模式,则使用 groupby 删除 groupbs