javascript - 为什么分析数组的大小需要是 fftSize 又名FrequencyBinCount 的一半

标签 javascript web-audio-api

尝试理解 WebAudioAPI 的规范。

在获取频率数据时,我们使用 FrequencyBinCount 而不是 fftSize 作为分析数组的大小,原因是什么?

获取时域数据时,我们应该使用FrequencyBinCount还是fftSize作为数组的大小?

最后一个问题。在规范中,提到如果我们传递一个比FrequencyBinCount更大的数组,多余的元素将被忽略,但是如果你传递一个更小的数组怎么办?

所以:

var analyser = new context.createAnalyser();
analyser.fftSize = 1024;

//should fft.size be used? 
//or frequency.binCount
//what happens if the size is smaller than fftSize?
var timeArray = new Float32Array(analyser.fftSize);

//why are we using frequencyBinCount and not fftSize?
var freqArray = new Uint8Array(analyser.frequencyBinCount);

analyser.getByteFrequencyData(freqArray);
analyser.getFloatTimeDomainData(timeArray);

最佳答案

确实,一般来说,大小为 N 的 FFT 将为您提供 N 个频率仓。然而,当您分析“真实”信号时,这些箱的一半将是多余的。具体来说,FFT 的前半部分将镜像后半部分:容器 [2..(N/2)+1] 将等于容器 [N..(N/2)+1]。由于所有音频信号都是“真实的”,因此该对称属性对于您在 Web Audio API 中执行的任何 FFT 都适用。结果将仅包含 N/2 个唯一值。

换句话说,分析数组的大小为 N/2,因为这是结果的大小。更大的数组会造成浪费。

关于 FFT 对称性的更严格的讨论在这里:https://dsp.stackexchange.com/questions/4825/why-is-the-fft-mirrored

关于javascript - 为什么分析数组的大小需要是 fftSize 又名FrequencyBinCount 的一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25444403/

相关文章:

javascript - 确保不调用 javascript 函数(如果已调用)

javascript - 带有组合框的第二列

javascript - 队列获取多个视频帧

html - 使用带有 Chromium WebAudio API 的纯 javascript 生成音调

javascript - 如何使用 Web Audio API 将音频从合成器渲染到缓冲区(PCM 值数组)

javascript - 我无法更改我的 ck 编辑器的位置

javascript - 使用 "raining images"的 JS 脚本。似乎无法隐藏预加载的图像

html - 在 nodejs 服务器上保存 wav

javascript - 如何用新录制的音频覆盖部分网络音频?

javascript - 如何控制输出增益?