通过android上的麦克风计算响度级别
我正试图通过android上的麦克风计算音量。 我使用AudioRecord从麦克风获取原始数据,并进行了一些标准化,然后计算了分贝。但结果并不正确。我得到的分贝值不稳定,不能反映声音。例如,即使我拍手,分贝值也不能反映声音。如果我想实时计算麦克风的响度,我应该如何更改代码或怎么做?非常感谢通过android上的麦克风计算响度级别,android,audio,microphone,decibel,Android,Audio,Microphone,Decibel,我正试图通过android上的麦克风计算音量。 我使用AudioRecord从麦克风获取原始数据,并进行了一些标准化,然后计算了分贝。但结果并不正确。我得到的分贝值不稳定,不能反映声音。例如,即使我拍手,分贝值也不能反映声音。如果我想实时计算麦克风的响度,我应该如何更改代码或怎么做?非常感谢 recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO,
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;
}
}
recorder=新的音频记录(AudioSource.MIC、iSampleRate、AudioFormat.CHANNEL、AudioFormat.ENCODING、PCM、iAudioBufferSize);
IBufferredResult=记录器读取(缓冲区,0,iAudioBufferSize);
for(int i=0;i
这里有两个问题。首先,您是从单个样本计算RMS,因为您不是在计算整个缓冲区的总和,而是在每个样本中重置它。因此,sum
包含一个样本的平方大小,然后除以样本长度
第二个问题是,你不容易创建一个仪表来测量响度。您计算的分贝值仅为功率比,其中最大值0dB表示峰值。它与物理声压没有任何关系,这通常是人们说“响度”时的意思(dB(SPL)是音阶,其中50dB是讲话的响度,110dB是摇滚音乐会,等等)
另请参见:目的可能是根据响度检测环境声音变化。我该怎么做?谢谢。我想你应该检查一下音频管理器中的音量。到目前为止,我还没有使用过麦克风,但我假设你的计算结果总是一样的。假设没有噪音,那么你会有50%的样本,如果数字是真的有符号的话,这将是0。另一方面,当有声音时,会有许多具有相似正振幅和负振幅的样本,加起来也是0。我想说的是,你只需要取绝对值,例如,如果你真的收到正数和负数,就要消除符号。
AudioRecord
类支持直接读入short[]
或ByteBuffer
-那么为什么要读入byte[]
,包裹是作为一个ByteBuffer
,并作为短裤访问它?我认为关闭它的人是越轨的。