我正在尝试从Android上的麦克风计算响度级别。 我使用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;
}
}
答案 0 :(得分:3)
这里有两个问题。第一个是您从单个样本计算RMS,因为您没有计算整个缓冲区的总和 - 您将每个样本重置它。因此,sum
包含一个样本的平方幅度,但之后您将除以样本长度。
第二个问题是你不能轻易地创建一个测量响度的仪表。您计算的分贝值仅为功率比,其中0dB的最大值表示峰值。它与物理声压没有任何关联,这通常是人们说“响度”时的意思(dB(SPL)是50dB是语音响度,110dB摇滚音乐会等等)。
另请参阅:sound meter android