太好了,我正在尝试编写一个Android应用来测量环境的声音水平。

我知道这类问题已经问过很多次了,我已经阅读了很多,但是我仍然不确定我的代码是否不错。

private MediaRecorder mRecorder = null;
private TextView AmpCur, DbCur;

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        //change text to actual amplitude
        int Amp = mRecorder.getMaxAmplitude();
        double db = 20 * Math.log10((double)Amp / 32767.0);
        double db2 = 20 * Math.log10((double)Amp);
        int db2I = (int) Math.round(db2);
        Log.i("SoundMeasure", "amp=" + Amp + " db=" + db + " db2=" + db2);

        AmpCur.setText(Integer.toString(Amp));
        DbCur.setText(Integer.toString(db2I));
        timerHandler.postDelayed(this, 250);
    }
};

public void RecorderInit() {

    String mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    mFileName += "/audiorecordtest.3gp";

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mRecorder.setOutputFile(mFileName);

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e("SoundMeasure", "prepare() fail");
    }

    mRecorder.start();
    timerHandler.postDelayed(timerRunnable, 250);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sound_measure);

    AmpCur = (TextView) findViewById(R.id.amp_cur);
    DbCur = (TextView) findViewById(R.id.db_cur);
}
@Override
public void onPause() {
    super.onPause();
    if (mRecorder != null) {
        timerHandler.removeCallbacks(timerRunnable);
        mRecorder.release();
        mRecorder = null;
    }
}

@Override
public void onResume() {
    super.onResume();
    if (mRecorder == null) {
        RecorderInit();
    }
}

应用程序正常运行,但值...有点奇怪。

在非常安静的房间中,其他应用显示〜15dB,

安培〜80分贝〜-50分贝〜40

当进入麦克风时,其他应用显示110 + dB,我的显示

放大器32767 db 0 db2 90

我读过maxAmplitude不能超过32767,而手机麦克风的测量不能超过90dB,但是其他应用程序如何做到这一点?

最佳答案

至少您的引用值32767似乎错误。您可以从获得的db值推论得出。您使用的值是this post手机麦克风可以录制的最大值。由于您使用此函数进行缩放,因此,除了对数最大的情况外,由于对数的工作原理,您将获得负值。 (32767.0 / 32767.0)的Log10将为0,因为log(1) = 0。小于1的值将接近负无穷大。

您的db2公式也将是错误的,因为您实际上使用了1的引用。this question的最后一个答案似乎已经找到了正确的引用值,但它也指出您不应该单独使用getMaxAmplitude。他还使用0.00002引用将值转换为帕斯卡。这可能是其他应用程序如何计算分贝的方法。

关于android - 如何使Android分贝测量更准确?完全正确吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31771703/

10-09 06:11