我试图使用JavaScript的WebAudio API以及其他一些SO文章({{3})来确定输入信号的基频(来自音源,或者可能是乐器) },How to get frequency from fft result?),但我似乎只能确定大约5-10Hz的频率。
我正在使用适用于iPad的信号发生器应用程序进行测试,该应用程序位于安静房间内的高品质麦克风旁边。
对于500Hz,它始终返回506;对于600Hz,我得到592.1kHz是1001Hz,但2kHz是1991.我还注意到我可以在看到来自FFT的数据的任何变化之前将频率调制5Hz(以1Hz的增量)。而且我只能通过平均两个最高的垃圾箱来获得准确性。
这是否意味着FFT数据中的分辨率不足以准确地确定1Hz内的基频,或者我是否采用了错误的方式?
我尝试过使用原生的FFT库(例如,这样):
var fFrequencyData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(fFrequencyData);
(你可以假设我已经正确初始化并连接了一个Analyzer节点),它只显示大约的灵敏度/分辨率
并且还使用DSP.js' FFT lib,如下所示:
var fft = new FFT();
fft.forward(e.inputBuffer.getChannelData(0));
fFrequencyData = fft.spectrum;
其中e
是传递给onaudioprocess
的事件对象。
我似乎有一个FFT数据(如FFT ::频谱)为空的问题 - 这是正常的吗?来自fft.spectrum的数据是徒劳的,除非我通过analyser.getFloatFrequencyData
运行它,我想用来自原生FFT的东西覆盖数据,完全击败目的?
希望有人可以帮助引导我朝着正确的方向前进 - 谢谢! :)
答案 0 :(得分:2)
您需要一个非常大的FFT才能以这种方式获得高质量的音调检测。要获得1Hz的分辨率,例如,采样率为44,100kHz,则需要64k(-ish)FFT大小。使用自相关进行单声道音调检测要好得多。