26

Web Audio API には、作業中のオーディオの FFT データを取得できるアナライザー ノードがあり、データを取得するバイトおよびフロートの方法があります。バイト バージョンは少し意味があり、正規化された (最小デシベル値と最大デシベル値に応じて) 強度スペクトルのように見えるものを返します。0 は特定の周波数ビンでオーディオのコンポーネントではなく、255 は最大です。

しかし、8ビットよりももう少し詳細が欲しいのですが、フロートバージョンを使用すると、奇妙な結果が得られます.

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

これにより、-891.048828125 と 0 の間の値が得られます。-891 は無音に対応して表示されるため、最小値ですが、0 は最大値に相当すると推測しています。

どうしたの?-891.048828125 が重要なのはなぜですか? 大きなマイナスが無音でゼロが最大なのはなぜですか? 間違った FloatArray を使用していますか、それとも構成に誤りがありますか? Float64 は 0 の値を返します。

4

3 に答える 3

34

データが実際に何を表しているかについてのドキュメントがないように思われるので、関連する webkit のソース コードを調べました: RealtimeAnalyser.cpp

簡単な答え: Float32Array のすべての値からanalyser.minDecibels を減算して正の数を取得し、(analyser.maxDecibels -analyser.minDecibels) を掛けて getByteFrequencyData と同様の表現を取得しますが、解像度が高くなります。

長い答え:

getByteFrequencyData と getFloatFrequencyData はどちらもデシベル単位で大きさを示します。スケーリングが異なるだけで、getByteFrequencyData の場合は minDecibels 定数が減算されます。

getByteFrequencyData の Webkit 内の関連コード:

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;

getFloatFrequencyData の Webkit 内の関連コード:

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;

もう 1 つの詳細は、デフォルトでアナライザー ノードが時間平滑化を行うことです。これは、smoothingTimeConstant をゼロに設定することで無効にできます。

Webkit のデフォルト値は次のとおりです。

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

悲しいことに、アナライザー ノードは複雑な fft を計算しますが、複雑な表現にはアクセスできず、その大きさだけにアクセスできます。

于 2013-02-26T17:35:14.760 に答える
2

前の回答とコメントの両方の点を修正してください。数値はデシベル単位であるため、0が最大、-無限大が最小(完全な無音)です。-891.0 ...は、浮動小数点変換の奇妙な点だと思います。

于 2013-01-05T20:52:24.207 に答える
2

Float32Array の使用は正しいです。Audio Data API の使用に関する興味深いチュートリアルを見つけました。これは Web Audio API とは異なりますが、ここで何をしようとしているのかについて役立つ洞察を与えてくれました。数値が負である理由をざっと見てみましたが、明らかなことは何もわかりませんでしたが、これらの数値がデシベル ( dB ) で表されているのではないかと思いました。これは一般に負の数値で与えられ、ゼロがピークです。この理論の唯一の問題は、-891 が dB に対して非常に小さい数に見えることです。

于 2013-01-05T07:23:34.847 に答える