我不需要可视化,只想获得频率的实际当前数字。但是使用getFloatFrequencyData(freqDomain)我会得到一个数组。如何从实时中获得一个确切变化的频率?所以这里我使用freqDomain [1]作为频率的值。但价值是错误的。它总是在-100左右。我认为我们的语气应该是分钟。 250赫兹。有人可以帮帮我吗?
这是我的代码:
MicrophoneSample.prototype.visualize = function() {
this.canvas.width = this.WIDTH;
this.canvas.height = this.HEIGHT;
var drawContext = this.canvas.getContext('2d');
var freqDomain = new Float32Array(this.analyser.frequencyBinCount);
this.analyser.getFloatFrequencyData(freqDomain);
var f = Math.round(freqDomain[1]);
var text = f + ' Hz';
document.getElementById('frequency').innerHTML = text ;
requestAnimFrame(this.visualize.bind(this));
};
非常感谢你!
答案 0 :(得分:2)
阵列具有每个FFT bin的幅度。由于第二个bin是-100,我猜这些值是以dB为单位(20 * log10(x))。要查找主频,您需要在数组中搜索最大值,然后将其bin编号转换为频率。 第一个bin将在DC,第二个Fs / N然后依此类推。例如,如果您的采样率为48kHz且FFT为1024,则频率如下:
0: 0 * 48000/1024 = 0Hz 1: 1 * 48000/1024 = 46.85Hz
等等。
频率计的分辨率将受到FFT大小的限制。
答案 1 :(得分:0)
这种基本技术只适用于人工信号。对于任何类型的真实音频信号,它都会失败,特别是几乎任何一种乐器依赖于振动的空气或弦 - 或人声。
通过使用STFT,您可以通过计算先前FFT中来自bin的每个bin处的相位差来获得比每个bin的中心频率更好的分辨率。这取决于关系
F = dPhi/dt
或换句话说,该频率是相位的变化率。
但是,您需要2048点FFT才能在100Hz以下获得不错的分辨率。