关于Web Audio API中AnalyserNode.getByteFrequencyData()返回的bins对应赫兹频率的咨询
Web Audio API中AnalyserNode.getByteFrequencyData()返回的bins对应赫兹频率的咨询
嘿,这个问题我之前帮不少开发者捋清楚过,刚接触Web Audio的频率分析时,确实很容易对这些bin的实际频率对应关系摸不着头脑,别担心,我给你一步步讲明白~
首先你得先搞懂AnalyserNode的两个关键参数:fftSize和sampleRate,这俩是计算bin对应频率的核心:
fftSize是你设置的傅里叶变换的窗口大小,必须是2的幂(比如256、512、1024这类数值)sampleRate是音频上下文的采样率,一般默认是44100Hz或者48000Hz
然后,getByteFrequencyData()返回的数组长度其实是fftSize / 2,因为傅里叶变换后会得到对称的结果,前半部分才是我们需要的有效频率数据。
每个bin对应的中心频率可以用这个简单公式计算:
中心频率 = (bin索引值 × sampleRate) / fftSize
举个实际例子帮你理解:假设你的音频上下文采样率是44100Hz,设置的fftSize是1024,那每个bin的频率间隔就是44100 / 1024 ≈ 43.07Hz。
- 索引0的bin对应0Hz(直流分量,一般没什么音频意义)
- 索引1的bin中心频率是43.07Hz
- 索引2的bin中心频率是86.13Hz
- 以此类推,最后一个bin(索引511)的中心频率大概是22006Hz,刚好接近采样率的一半(也就是奈奎斯特频率,44100/2=22050Hz),这也符合采样定理的限制。
另外补充一点:每个bin其实对应一个小的频率范围,比如索引n的bin,它的范围是从(n-0.5)*sampleRate/fftSize到(n+0.5)*sampleRate/fftSize,不过大多数情况下,我们关注中心频率就足够满足可视化或者分析需求了。
你之前尝试把每个bin当成1Hz步长,显然不对,因为这个“步长”完全由采样率和fftSize的比值决定,不是固定的1Hz,用上面的公式就能准确算出每个bin对应的实际频率啦。
备注:内容来源于stack exchange,提问作者H3wastooshort
相关产品推荐
相关产品推荐

