由于关于数据实际代表什么的文档似乎为零,我查看了 webkit 的相关源代码:RealtimeAnalyser.cpp
简短的回答:从 Float32Array 的每个值中减去 analyser.minDecibels 以获得正数并乘以 (analyzer.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,它在分析器节点中公开:
//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,它也不能访问复杂的表示,只是它的大小。