如何获取 javascript 中的频率值?

how to get frequency value in javascript?

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

图书馆link:https://p5js.org/reference/#/libraries/p5.sound

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

谢谢

建立在 this example 的基础上,如果您使用 P5.sound 的 FFT 对象,您可以调用 fft.analyze() 来获得一个幅度数组,分为不同的频率仓。

默认为 1024 个 bin。这些 bin 从 0Hz 到奈奎斯特频率均匀分布,奈奎斯特频率是音频采样率的一半。 (默认采样率为44100Hz,所以默认奈奎斯特频率为22050Hz)。

另请注意,每个 bin 的默认分辨率为 22050Hz / 1024 bin ≈ 21.53Hz/bin。如果您使用 P5.sound(假设您的计算机设置方式与我的相同),您最多只能获得 21.53Hz 的精度。

因此,bin 0(或 spectrum[0])包含频率为 ~ 0 - 21.5Hz 的幅度,bin 1(spectrum[1])包含频率为 ~ 21.5Hz - 43.0Hz 的幅度,等等等等。

这意味着任何给定 bin 的频率为: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 对您来说不够准确。好吧...您可以使用更多 bin 初始化 FFT 对象:new p5.FFT(0.8,[bins])documentation says bin 的最大数量是 1024,但我只是尝试使用 8192(分辨率为 2.69Hz)并且它对我来说似乎工作正常。