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

问题描述 投票:0回答:2

我不需要可视化,只是想获得频率的实际当前数字,但是使用

getFloatFrequencyData(freqDomain)
我将得到一个数组。我怎样才能实时获得一个完全变化的频率?所以这里我用
freqDomain[1]
作为频率的值,但是这个值是错误的。它总是大约-100。我想我们的语气应该是min。 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));
};
audio real-time frequency
2个回答
3
投票

阵列具有每个 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 大小的限制。


0
投票

这种基本技术仅适用于人工信号。它对于任何类型的真实音频信号都会严重失败,尤其是由几乎任何一种依赖空气或弦振动柱或人声的乐器产生的信号。

通过使用 STFT,您可以通过计算每个 bin 与先前 FFT 中的 bin 的相位差来获得比每个 bin 的中心频率更好的分辨率。这取决于关系

F = dPhi/dt

或者换句话说,该频率就是相位的变化率。

但是,您需要 2048 点 FFT 才能在 100Hz 以下获得不错的分辨率。

© www.soinside.com 2019 - 2024. All rights reserved.