Android MediaRecorder には関数があります
.getMaxAmplitude();これは、APIが教えてくれるように、「このメソッドへの最後の呼び出し以降にサンプリングされた最大絶対振幅を返します」。しかし、私はこれがどの振幅であるかを見つけることができませんか? パスカルですか、それともワットですか。
Web 上のいくつかのページで、デシベルに密接に関連する値を計算できることを発見しました (ここで提案されているように)。
double db = (20 * Math.log10(amplitude / REFERENCE));
これにより、戻り値が線形スケールであると仮定できます(おそらくミリパスカルのようなものです...)
REFERENCE=0.1 (これは 2*10^(-5) Pascal ((20 uPascal)) のようなものであるべきだと認識していますが、それは奇妙な値を返します... 0.1 は奇妙にうまく機能します。)
今、私は MaxAmplitude() を使用して測定します
getMaxAmplitude()これを可変振幅に入れます。
これは方法です:
public double getNoiseLevel()
{
//Log.d("SPLService", "getNoiseLevel() ");
int x = mRecorder.getMaxAmplitude();
double x2 = x;
Log.d("SPLService", "x="+x);
double db = (20 * Math.log10(x2 / REFERENCE));
//Log.d("SPLService", "db="+db);
if(db>0)
{
return db;
}
else
{
return 0;
}
}
これは 0.5 秒間に 5 回行われ、平均のようなものになります。
for(int i=0; i<5; i++)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
return 0;
}
level = level+getNoiseLevel();
if(level>0)
{
counter++;
}
}
level=level/counter;
Log.d(LOG_TAG, "level="+level);
デシベルのように見えるものがありますが、実際のデシベルはまったくわかりません...
それで、誰かがこれについて私を助けることができますか?APIが返されるものをまったく指定しないのは非常に奇妙に思えます...