如何在Javascript中获取频率值?

7

我是一名意大利学生,正在使用p5的库创建一个网络吉他调音器。我想知道是否有办法获取麦克风输入的频率。

库链接:https://p5js.org/reference/#/libraries/p5.sound

接受不同库的不同解决方案

谢谢


1
你有研究过FFT吗?https://p5js.org/reference/#/p5.FFT - Akin Hwan
1
是的,那些方法返回振幅值。 - Strimply
1
这不就是这个例子所讨论的内容吗?(https://p5js.org/examples/sound-frequency-spectrum.html) - h2ooooooo
我已经尝试过这个例子,但它返回的频率值在0到255之间,例如A4的频率为440Hz,高于255。 - Strimply
1个回答

8
建立在这个样例的基础上,如果你使用P5.sound的FFT对象,你可以调用fft.analyze()来获取一个被分成不同频率区间的振幅数组。
默认是1024个区间。这些区间在0Hz到奈奎斯特频率之间平均分布,奈奎斯特频率是你音频采样率的一半(默认采样率为44100Hz,所以默认的奈奎斯特频率是22050Hz)。
还要注意每个区间的默认分辨率是22050Hz / 1024个区间≈21.53Hz/区间。如果你使用P5.sound,你将会得到最好的21.53赫兹精度(假设你的电脑设置与我的相同)。
所以,0号区间(或spectrum[0])包含了频率约为0-21.5Hz的振幅,1号区间(spectrum[1])包含了频率约为21.5Hz - 43.0Hz的振幅,依此类推。
这意味着任何给定区间的频率是:freq = binIndex * (nyquist / numberOfBins)
如果你认为这已经足够好,你可以循环遍历由fft.analyze()返回的数组,找到峰值的索引,然后使用奈奎斯特与数组长度(区间数)相除的比率将该索引转换回频率。
function getLoudestFrequency() {
    var nyquist = sampleRate() / 2; // 22050
    var spectrum = fft.analyze(); // array of amplitudes in bins
    var numberOfBins = spectrum.length;
    var maxAmp = 0;
    var largestBin;

    for (var i = 0; i < numberOfBins; i++) {
        var thisAmp = spectrum[i]; // amplitude of current bin
        if (thisAmp > maxAmp) {
            maxAmp = thisAmp;
            largestBin = i;
        }
    }

    var loudestFreq = largestBin * (nyquist / numberOfBins);
    return loudestFreq;
}

假设±21.53Hz对您来说不够准确。那么...您可以使用更多的bins初始化FFT对象:new p5.FFT(0.8,[bins])文档显示最大bin数为1024,但我刚试过8192(分辨率为2.69Hz),感觉效果不错。

1
我能够使用最大16384!FYI - M.Viking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接