2013-03-11 29 views
8

我想从android上的麦克风计算响度水平。 我用AudioRecord从麦克风获取原始数据,并做了一些归一化处理,然后计算分贝。但结果是不正确的。我得到的分贝值不稳定,无法反映声音。例如,即使当我拍手时,分贝值也不反映声音。我应该如何更改代码?如果我想实时计算麦克风的响度,我应该怎么做?非常感谢。从android麦克风计算响度水平

   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

目的可能只是检测基于响度的声音环境的变化。我应该怎么做?谢谢。 – Foreverniu 2013-03-11 08:05:18

+0

我想你在音频管理中检查音量 – DjHacktorReborn 2013-03-11 08:05:20

+0

到目前为止,我还没有与麦克风一起工作,但我会假设你的计算总是会产生相同的结果。假设没有噪音,那么你将有50%的样本数量,如果这些数字是真正签名的,这将是0。另一方面,当有声音时,您将有许多具有相似正负幅度的样本,这些样本也将总计为0。我会说你只需要绝对值,例如如果您确实收到正面和负面的数字,请消除符号? – 2013-03-11 08:12:29

回答

3

这里有两个问题。首先,您是从一个样本计算RMS,因为您并未计算整个缓冲区的总和 - 您将每个样本重置一次。因此sum包含一个样本的平方值,但是除以样本长度。

第二个问题是,你不会轻易地创建一个米来衡量响度。您计算的分贝值只会是最大值为0dB时表示峰值的功率比。它与物理声压没有任何关系,这通常是人们说'响度'时的含义(dB(SPL)是50dB是语音响度,110dB摇滚音乐会等等)。

参见:sound meter android