因爲似乎有什麼數據實際上代表了零的文檔,我看着的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,它並沒有給進入複雜的陳述,只是它的大小。
通過從浮點值減去minDecibels,我有時不會得到正數。設置minDecibels值實際上並不限制我的情況,我不斷收到更小的值。有什麼想法嗎? – nevos