我正在尝试从安卓麦克风计算响度级。我使用了AudioRecord获取了麦克风的原始数据,进行了一些正常化处理并计算了分贝值。但结果不正确。我得到的分贝值不稳定且不能反映声音。例如,即使我拍手,分贝值也无法反映声音。如果我想实时计算来自麦克风的响度级,该如何更改代码或应该做什么?非常感谢。
recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize);
iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize);
for (int i = 0; i < buffer.length-1; i++)
{
ByteBuffer bb = ByteBuffer.wrap(buffer, i, 2);
int isample = bb.getShort();
double dsample =(double) isample / 32768.0;
sum += (dsample*dsample);
double rms = Math.sqrt(sum/(buffer.length*0.5));
double decibel = 20*Math.log10(rms);
sum = 0;
}
}
AudioRecord
类支持直接读取到short[]
或ByteBuffer
中,那么为什么要将其读入byte[]
,再将其包装为ByteBuffer
并作为shorts访问呢? - Michael