2013-01-05 24 views
25

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

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

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

これは沈黙に対応するまで表示さ-891 -891.048828125間と0私は値与え、私は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

float値からminDecibelsを引くと、正の数が得られないことがあります。私の場合、minDecibelsの値を設定しても実際には何も制限されません。何かご意見は? – nevos

2

Float32Arrayを使用するのは正しいですか? Audio Data APIの使用に関する面白いチュートリアルを見つけましたが、これはWeb Audio APIとは異なりますが、あなたに何をしようとしているかについての有用な洞察を与えましたhere。なぜ数値が負であるのかを知るための素早い覗き見がありました。明白なことに気付かなかったのですが、これらの数値がデシベル単位であるかどうかは疑問でした。dB、通常は負の数で与えられ、ゼロがピークです。この理論の唯一の問題は、-891がdBの数が非常に少ないように思えることです。

+1

このチュートリアルは、標準が出る前に減価償却されたMozilla実装のためのものです。 私はあなたが実際に正しいと思います。浮動小数点は本当に小さくなり、-891は浮動小数点が格納できるものについてほぼ正しいと思われる2^-128のdbにかなり近くなります。 – Newmu

+0

私がln(2^-128)を実行すると、HP15c(my macでエミュレートされた)計算機で-88.7が得られます。私は、オーディオ機器のノイズが(-891db)ということは想像もできません。 Hmmm –

+0

それはデジタルですので、ノイズフロアはハード0になる可能性があり、アナログノイズがそれを高く保つことはありません。私は推測しています。 Dbはln(x)ではなく10 * ln(x)である。はるかに正確に2^-128.55です。それがdbであると仮定して10進数値に変換すると、fftの前と同じ感覚のデータが得られました。 – Newmu

2

前の回答とコメントの両方の点を修正してください。数字はデシベル単位であるため、0は最大であり、-infinityはmin(絶対的な無音)です。 -891.0 ...私は浮動小数点変換の奇妙なものだと信じています。

関連する問題