我想通过Web音频API获得当前频率

时间:2013-12-10 12:39:51

标签: api audio web real-time frequency

我不需要可视化,只想获得频率的实际当前数字。但是使用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));
};

非常感谢你!

2 个答案:

答案 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以下获得不错的分辨率。