2014-11-04 61 views
0

我一直在用Web Audio一些玩。我有一個簡單的振盪器節點,以context.sampleRate/analyzerNode.fftSize * 5的頻率播放(在這種情況下爲107.666015625)。當我打電話給analyzer.getByteFrequencyData時,我希望它在第5個分箱中有一個值,並且沒有其他地方。我實際看到的是[0,0,0,240,255,255,255,240,0,0...]爲什麼正弦波的FFT在多個分箱中有大小

爲什麼我在多個箱子中獲取值?

+1

您的FFT窗口大小有多長?你通過計算的時間序列向量? – 2014-11-04 07:39:43

+0

context.sampleRate = 44100 analyzer.fftSize = 2048 – gusto 2014-11-04 07:41:34

+1

因此,頻率118.4326171875Hz有多少頻譜泄漏? – Goz 2014-11-05 22:12:23

回答

0

這必須這樣做,你的序列是有限的,因此你的信號應該持續一段有限的時間。當然你用一個矩形窗口來計算FFT,即你的信號只考慮生成的樣本數量,而「不連續性」(即信號具有有限數量的樣本)創建了spectral leakage。爲了最大限度地減少這種影響,您可以嘗試在FFT計算之前應用於您的數據的幾個窗口函數,從而減少這種影響。

+0

當未調製的信號在FFT窗口中的精確週期性爲107.66 Hz時,在2048窗口中44.1k採樣率時沒有不連續性。 – hotpaw2 2014-11-05 02:02:10

0

看起來你可能會在你的計算中的某個地方使用一個對你的數據或算術格式來說太大的測試信號。再次使用浮點格式再試一次。

+0

如果不清楚,我實際上並沒有做任何計算,而是在AnalyserNode上調用getByteFrequencyData。如果我改爲調用getFloatFrequencyData,結果似乎遵循類似的模式'-183.1167755126953,-178.00262451171875,-190.38323974609375,-33.979400634765625,-18.06180191040039,-13.55561637878418,-18.06180191040039,-33.979400634765625,-195.78549194335938 ...' – gusto 2014-11-05 05:40:47

1

webaudio AnalyserNode在計算FFT之前應用Blackman窗口。這個窗口功能會抹掉單音。

+1

的FFT將塗抹進入周圍的箱子...矩形窗口(即不開窗口)會更糟糕。 – Goz 2014-11-05 22:06:13