javascript - 从频谱功率电平(FFT 输出)中恢复 RMS 和/或峰值

标签 javascript math audio fft web-audio-api

WebAudio API 允许我 create an AnalyserNode这可以让我访问一组音频样本的 FFT 计算频谱(在无符号字节数组或 float 组 -11 中)。我希望我可以使用这些值来计算同一组样本的总功率 (RMS)。

我不认为它像获取 32 个窗口值、将它们相加并除以 32 这样简单。(0dB 的正弦波只会填满一个窗口,而一些相邻的窗口会稍微亮起,而0dB 的白噪声会填满所有窗口。)是否可以从 FFT/DFT 输出中计算出 RMS 值?

我想这样做的原因是我需要构建一个高效的 RMS 表。虽然我可以访问原始样本,但对它们进行处理以找到每个缓冲区的峰值开销太大。浏览器在 native 代码中运行 FFT,这比尝试在 JavaScript 中进行所有这些计算要高效得多。如果我可以从 32 个 FFT 窗口计算 RMS,那会更有效率。

最佳答案

它的值(value) -- 我有一个应用程序可以计算 requestAnimationFrame 中 12 到 20 个轨道的 RMS。使用 getByteTimeDomainData() 的循环而且速度很快。在这些计算和将结果绘制为 <canvas> 上的米之间每 16.7 毫秒,我在 Chrome 和 Firefox 中始终获得 60fps。

现代 JS 引擎非常擅长相当快地进行数学运算。

关于javascript - 从频谱功率电平(FFT 输出)中恢复 RMS 和/或峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744176/

相关文章:

c++ - math.h 的问题

algorithm - 逻辑:将重力应用于矢量

c# - 这个 if 语句有多少种组合

javascript - 如何使用clearTimeout停止特定的setTimeout循环

javascript - mySwiper 没有用 jquery 和 cordova 定义

javascript - 有向无环层次图实现

javascript - 从维基百科中提取文本内容 - iframe?

javascript - 如何根据数据集大小调整 Chart.js 高度。 ionic 3

python - 直接使用 QtMultimedia.QAudioOutput 播放 gtts 缓冲区

Android 无缝音频循环