我是一名意大利学生,我正在使用 p5 的库来创建一个网络吉他调音器。
我想知道是否有办法获取麦克风输入的频率。
图书馆链接:https://p5js.org/reference/#/libraries/p5.sound https://p5js.org/reference/#/libraries/p5.sound
接受不同库的不同解决方案
Thanks
建立在这个例子 https://p5js.org/examples/sound-frequency-spectrum.html,如果你使用P5.sound的FFT对象,你可以调用fft.analyze()
获得分为不同频率区间的振幅数组。
默认为 1024 个 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()
,找到峰值的索引,然后使用奈奎斯特与数组长度(bins)的比率将该索引转换回频率。
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])
. The 文件说 https://p5js.org/reference/#/p5.FFT最大的 bin 数量是 1024,但我只是尝试使用 8192(分辨率为 2.69Hz),它似乎对我来说工作得很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)