尝试理解 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/