gpt4 book ai didi

JavaScript - WebAudio API ScriptProcessorNode InputBuffer getChannelData 精度

转载 作者:行者123 更新时间:2023-11-30 17:26:45 28 4
gpt4 key购买 nike

我正在尝试使用 JavaScript 的 WebAudio API 以及其他一些 SO 文章( How to get frequency from fft result?How do I obtain the frequencies of each value in an FFT? )来确定输入信号(来自音调发生器,或者可能是乐器)的基频,但是我似乎只能确定大约 5-10Hz 内的频率。

我正在使用适用于 iPad 的信号发生器应用程序进行测试,该应用程序位于安静房间内的高质量麦克风旁边。

对于 500Hz,它始终返回 506;对于 600Hz,我得到 592。1kHz 是 1001Hz,但 2kHz 是 1991。我还注意到,在看到来自 FFT 的数据发生任何变化之前,我可以将频率调制 5Hz(以 1Hz 为增量)。我只能通过对两个最高的 bin 进行平均来得到这个准确度。

这是否意味着 FFT 数据的分辨率不足以准确确定 1Hz 以内的基频,还是我的处理方式有误?

我试过使用两个原生 FFT 库(例如,像这样):

var fFrequencyData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(fFrequencyData);

(你可以假设我已经正确初始化并连接了一个 Analyzer 节点),它只显示大约

的灵敏度/分辨率

并且还使用 DSP.js 的 FFT 库,如下所示:

var fft = new FFT();
fft.forward(e.inputBuffer.getChannelData(0));
fFrequencyData = fft.spectrum;

其中 e 是传递给 onaudioprocess 的事件对象。

我似乎对 FFT 数据(如 FFT::spectrum)为空有疑问 - 这正常吗?来自 fft.spectrum 的数据毫无意义,除非我通过 analyser.getFloatFrequencyData 运行它,我认为这会用原生 FFT 的内容覆盖数据,从而完全违背目的?

希望有人能帮助我指引正确的方向 - 谢谢! :)

最佳答案

您需要非常大的 FFT 才能通过这种方式获得高质量的音调检测。例如,要获得 1Hz 的分辨率和 44,100kHz 的采样率,您需要 64k(-ish) FFT 大小。最好使用自相关来进行单音音高检测。

关于JavaScript - WebAudio API ScriptProcessorNode InputBuffer getChannelData 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24104082/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com