2013-12-10 66 views
1

我不需要可視化,只是想獲得實際的頻率數。但與getFloatFrequencyData(freqDomain)我會得到一個數組。我怎樣才能從實時獲得一個完全變化的頻率?所以在這裏我使用freqDomain [1]作爲頻率的值。但價值是錯誤的。它總是大約-100。我認爲我們的語氣應該是最小的。 250赫茲。有人可以幫助我嗎?我想獲得當前的頻率與Web音頻API

這是我的代碼:

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

這種基本技術只能用於人造信號。它會對任何一種真實的音頻信號產生不良影響,尤其是對任何一種依靠空氣或絃線振動柱或人聲產生的樂器而言。

通過使用STFT,通過計算前一個FFT中的bin中每個bin的相位差,可以獲得比每個bin的中心頻率好得多的分辨率。這取決於關係

F = dPhi/dt 

或者換句話說,該頻率的相位變化率。

但是,您需要2048點的FFT才能在低於100Hz時獲得像樣的分辨率。

2

該陣列具有每個FFT bin的振幅。由於第二個bin是-100,我猜這些值是以dB爲單位(20 * log10(x))。要查找主頻率,您需要在陣列中搜索最大值,然後將其編號轉換爲頻率。 第一個bin將在DC上,第二個Fs/N等等。例如,如果你的採樣率爲48kHz,你的FFT是1024,那麼頻率如下:

 
0: 0 * 48000/1024 = 0Hz 
1: 1 * 48000/1024 = 46.85Hz 

等。

頻率計的分辨率將受到FFT大小的限制。