1

getMaxAmpitude を取得してデシベルに変換するアプリケーションを作成しましたが、30dB の範囲しか取得できません。

Androidフォンの範囲は30dBしかありませんか、それとも私のコードに問題がありますか?

public class getMaxAmpitude extends AsyncTask<Void, Float, Void>{
     String dB = "";    
     int ampitude;
     float db;
     @Override
    public Void doInBackground(Void... params) {
        while(rec == true){
            try{
                Thread.sleep(250);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            ampitude = recorder.getMaxAmplitude();
            db =(float) (20 * Math.log10(ampitude/700.0));
            publishProgress(db);
        }
        return null;
    }
    public void onProgressUpdate(Float... progress){

        //database.addSoundData(dB);
        dB = (progress[0].toString());
4

1 に答える 1

9

デシベル スケールは、常に何かに対する相対的な尺度です。デジタル オーディオの場合、その何かは通常、サンプルが保持できる最大値です。これは1.0、サンプルの浮動小数点表現と32767符号付き 16 ビット サンプルのいずれかです。計算された dB 値は負であり、0dB がクリップされます。

インスタンスが正確に何であるかがわからないので、署名付きの16ビット整数を使用するrecorderAndroidのものであると想定します。MediaRecorder

したがって、この場合の正しい式は次のようになります。

db = 20.0 * log10(peakAmplitude/32767.0)

ただし、上記で使用した方程式は、以下と同等であるため、結果にバイアスをかけるだけです。

db = 20.0 * log10(peakAmplitude) - 20.0 * log10(700)

=20.0*log10(peakAmplitude) - ~56.9

オンボード マイクを録音していて、自動ゲイン コントロールが有効になっている場合、30dB というダイナミック レンジの数字は驚くに値しないかもしれません。

于 2013-04-18T23:09:20.537 に答える