2017-02-11 48 views
0

私はlumiereアプリケーションを開発中です。私は、特定の周波数のキャリア信号(19.2kHzより正確な場合)を持っており、オーディオが再生されている間、その振幅を取得する必要があります。 私はオーディオ処理に関するいくつかの情報を探せ、周波数スペクトルを取得するにはFFTアルゴリズムを使用する必要があることを知りました。特定の周波数のオーディオ信号をリアルタイムで取得する方法android

私はTarsosDSPライブラリとそのFFTクラスを試しました。

TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false); 
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format); 

float[] buff = new float[bufferFloatSize]; 
final float[] amps = new float[fftSize]; 

converter.toFloatArray(tmpBuffer, buff); 

FFT fft = new FFT(bufferFloatSize, new HannWindow()); 
fft.forwardTransform(buff); 
fft.modulus(buff, amps); 

は、それから私は、周波数帯域のインデックスを取得し、その振幅

int amp = (int) (10 * Math.log10(amps[index]); 

を計算しかし、私は間違って振幅を取得します。 私は19.2kHzの信号を持つオーディオファイルを持っています。このファイルは一定の振幅が0dBですが、19207Hzの振幅の結果値は-39dBから-46dBまで変化します。私は近隣の周波数をチェックし、その中には0dBを持つものもあれば、ないものもあります。 -36 dBと-60 dBのファイルもチェックしましたが、結果はそれぞれ-39〜-48 dBと-44〜-61 dBでした。

最後のファイルについてはわかりましたが、それは近いですが、それは一定ではなく、正しい時と間違った時を予測できません。

この問題に直面した人がいる場合は、私を助けてください。 あなたは確かに実行可能である任意の他の良いFFTのlibがわかっている場合は - 私に

UPDATE言う: [OK]を、私はTSGの機能を追加したと(私のfft.forwardTransform前にそれを呼び出す)をし、結果を比較した後、 結果は以下の通りであった 0デシベル19.2kHzのオーディオファイルのために: 前:-39 dBの 後に - 10デシベル

-36 dBの19.2kHzのオーディオファイルのために: 前:-75 dBの 後:-46デシベル-60 dBの19.2kHzのオーディオファイルのための

:後デシベル -97.7::-69 dBの

今すぐ結果が一定であり、時間とともに変化したりしないでください 前に。 結果には一定のパターンがあることもわかります。 fftの前には、-39dBsと-10dBの間は正しい結果と異なります。 質問には、なぜこれらの間違いがありますか?

答えて

0
In the TarsosDSP manual , the following example was given sound pressure level in db where , 

db=audioEvent.getdBSPL(); or Amplitude=audioEvent.getRMS() //root mean square of the signal. 



    float[] buffer = audioEvent.getFloatBuffer(); 



    private double soundPressureLevel(final float[] buffer) { 
    double power = 0.0D; 
    for (float element : buffer) { 
    power += element*element; 
    } 

    double value = Math.pow(power, 0.5)/ buffer.length;; 
    return 20.0*Math.log10(value); 
    } 
    }); 
+0

20.0 * Math.log10(value)で20を掛ける理由を説明してください。私は同じ表現に10を乗じたのを見たので、10 * Math.log10(value); –

+0

0 dB 19.2 kHzオーディオファイルでのファンクションの結果は、FFTを呼び出す前に-39 dB、FFTを呼び出した後で-10 dBです。 Log.d( "テスト"、 "パワーレベル前:" + soundPressureLevel(バフ)+ "dB"); fft.forwardTransform(buff); fft.modulus(buff、amp); Log.d( "test"、 "パワーレベル後:" + soundPressureLevel(buff)+ "dB"); –

+0

私は、3つのファイルすべてが常に同じ結果を持っていることを確認しました。これは、以前のようなバラツキがなく、正しい結果と間違った点の差が約39 dB(fft前の結果) 。それは0dBと同様に-39dB、-36dB、-75dB、-60dB、-98dBでなければなりません。 –

関連する問題