1

WebAudio API を使用すると、AnalyserNode を作成して、一連のオーディオ サンプルの FFT 計算スペクトルにアクセスできます (符号なしバイト配列または float 配列-1から へ1)。これらの値を使用して、同じサンプル セットの全体的な電力 (RMS) を計算できることを願っています。

32 個のウィンドウ値を取得し、それらを加算して 32 で割るという単純な方法ではないと思います (0dB の正弦波は 1 つのウィンドウのみを満たし、隣接するウィンドウの一部がわずかに点灯しますが、 0dB はすべてのウィンドウを埋めます。) FFT/DFT 出力から RMS 値を計算することは可能ですか?

これを行う理由は、効率的な RMS メーターを構築する必要があるためです。生のサンプルにアクセスできますが、サンプルを処理してすべてのバッファでピークを見つけることは、オーバーヘッドが大きすぎます。ブラウザーはネイティブ コードで FFT を実行し、これらすべての計算を JavaScript で実行しようとするよりもはるかに効率的です。32 個の FFT ウィンドウから RMS を計算できれば、はるかに効率的です。

4

2 に答える 2

1

ええ、FFT から RMS 値を見つけることは可能です。AnalyserNote が信号にウィンドウ (ハニング、ブラックマン、カイザーなど) を適用しないことを確認する必要があります。

同じ結果を得る 2 つの簡単な方法:

RMS1 = FFOutput の絶対値の二乗和をサンプルの長さで割った値

RMS2 = FFOutput の絶対値の 2 乗の合計をサンプルの長さで割った値をサンプルの長さで割った値

ここでテストしたところ、450 ヘルツで db = 50 の正弦波を作成しました

dbimput = 50;
t  = [ 0 : 1 : 10000];         
f  = 450;                      
Fs = 44100;                    
data =10^(dbimput/20)*sin(2*pi*f/Fs*t)';        


FFTDATA = fft(data);

rms1 = sum(abs(FFTDATA /length(data)).^2)

rms2 = sum(abs(FFTDATA .^2) / length(data)) / (length(data) )

dblevel1 = 20 * log10(sqrt(rms1))

dblevel2 = 20 * log10(sqrt(rms2))

その結果は次のとおりです。

rms1 =  4.9976e+04
rms2 =  4.9976e+04
dblevel1 =  46.988
dblevel2 =  46.988
于 2013-11-02T21:47:53.403 に答える