Ответ 1
Поскольку, как представляется, существует нулевая документация по фактическим представлениям данных, я просмотрел соответствующий исходный код webkit: RealtimeAnalyser.cpp
Короткий ответ: subtract analyser.minDecibels от каждого значения Float32Array для получения положительных чисел и умножения с (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 самостоятельно, который отображается в анализаторе node:
//The minimum power value in the scaling range for the FFT analysis data for conversion to unsigned byte values.
attribute double minDecibels;
Еще одна деталь заключается в том, что по умолчанию анализатор node выполняет сглаживание времени, что можно отключить, установив сглаживаниеTimeConstant в ноль.
Значения по умолчанию в webkit:
const double RealtimeAnalyser::DefaultSmoothingTimeConstant = 0.8;
const double RealtimeAnalyser::DefaultMinDecibels = -100;
const double RealtimeAnalyser::DefaultMaxDecibels = -30;
К сожалению, хотя анализатор node вычисляет комплекс fft, он не дает доступа к комплексным представлениям, а только его значениям.