2013-01-05 95 views
25

Web Audio API有一個分析器節點,它允許您獲取正在處理的音頻的FFT數據,並且具有獲取數據的字節和浮點數方式。字節版本有點意義,返回看起來像標準化(取決於最小和最大分貝值)強度頻譜的東西,其中0不是特定頻率倉處音頻的分量,255是最大值。解釋Web Audio API FFT結果

但我想比8位更詳細,使用浮動版本,但是,給出奇怪的結果。

freqData = new Float32Array(analyser.frequencyBinCount); 
analyser.getFloatFrequencyData(freqData); 

這讓我重視-891.048828125和0 -891之間顯示了相應的沉默,所以它的莫名其妙的最低值,而我猜0等同於最大值。

發生了什麼事?爲什麼-891.048828125顯着?爲什麼一個很大的消極沉默和零是最大的?我使用了錯誤的FloatArray還是存在配置錯誤? Float64給出0值。

回答

29

因爲似乎有什​​麼數據實際上代表了零的文檔,我看着的WebKit的相關源代碼:RealtimeAnalyser.cpp

簡短的回答:從Float32Array的每一個值減去analyser.minDecibels得到正數並且與(analyser.maxDecibels - analyser.minDecibels)相乘以獲得與getByteFrequencyData相似的表示形式,只是分辨率更高。

龍回答

兩個getByteFrequencyData和getFloatFrequencyData給你分貝的大小。這只是不同的比例尺度和getByteFrequencyData一個minDecibels常數減去:

在WebKit的相關代碼getByteFrequencyData:

const double rangeScaleFactor = m_maxDecibels == m_minDecibels ? 1 : 1/(m_maxDecibels - m_minDecibels); 
float linearValue = source[i]; 
double dbMag = !linearValue ? minDecibels : AudioUtilities::linearToDecibels(linearValue); 

// The range m_minDecibels to m_maxDecibels will be scaled to byte values from 0 to UCHAR_MAX. 
double scaledValue = UCHAR_MAX * (dbMag - minDecibels) * rangeScaleFactor; 

相關代碼WebKit中爲getFloatFrequencyData:

float linearValue = source[i]; 
double dbMag = !linearValue ? minDecibels : AudioUtilities::linearToDecibels(linearValue); 
destination[i] = float(dbMag); 

因此,要積極值,您可以簡單地減去minDecibels,這是暴露在analyzer node

//The minimum power value in the scaling range for the FFT analysis data for conversion to unsigned byte values. 
attribute double minDecibels; 

另一個細節是默認情況下,分析器節點會進行時間平滑,可以通過將smoothingTimeConstant設置爲零來禁用時間平滑。

WebKit中的默認值是:

const double RealtimeAnalyser::DefaultSmoothingTimeConstant = 0.8; 
const double RealtimeAnalyser::DefaultMinDecibels = -100; 
const double RealtimeAnalyser::DefaultMaxDecibels = -30; 

可悲的是,儘管分析節點計算複雜的FFT,它並沒有給進入複雜的陳述,只是它的大小。

+1

通過從浮點值減去minDecibels,我有時不會得到正數。設置minDecibels值實際上並不限制我的情況,我不斷收到更小的值。有什麼想法嗎? – nevos

2

您在使用Float32Array時是正確的。我發現了一個關於使用Audio Data API的有趣教程,雖然它與Web Audio API不同,但它爲我提供了一些有用的信息,幫助您瞭解您正在嘗試做什麼here。我有一個快速的目光,看看爲什麼這些數字是負數,並沒有注意到任何明顯的,但我想知道這些數字可能是以分貝,dB,這通常是負數,零是峯值。這個理論唯一的問題是-891似乎是一個非常小的dB值。

+1

該教程是在標準出來之前用於折舊的Moz實現的,試着看過它! 我認爲你實際上是對的。浮點數可以變得非常小,-891非常接近2分貝-128分,這似乎是正確的浮點數可以存儲。 – Newmu

+0

如果我做ln(2^-128),在HP15c(在我的mac上模擬)計算器上得到-88.7。我無法想象任何音頻設備能夠具有如(-891分貝)那麼小的噪音。嗯 –

+0

這是數字,所以本底噪聲可能很難0,並沒有模擬噪聲保持較高,我猜。 Db是10 * ln(x)而不是ln(x)。它更精確到2^-128.55。假設它是db,轉換回十進制值給了我合理的數據,就像我以前從fft看過的那樣,如果縮放比例不同。 – Newmu

2

在前面的答案和註釋中的兩個點都正確 - 數字以分貝爲單位,所以0是最大值,-infinity是最小值(絕對無聲)。 -891.0 ...我相信,只是一個浮點轉換奇怪。