太好了,我正在尝试编写一个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/