9

我正在尝试从 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;
                }

            }   
4

1 回答 1

3

这里有两个问题。第一个是您正在从单个样本计算 RMS,因为您没有计算整个缓冲区的总和 - 您正在重置每个样本。所以sum包含一个样本的平方大小,但是你要除以样本长度。

第二个问题是你不能轻易地创建一个仪表来测量响度。您计算的分贝值将只是一个功率比,其中 0dB 的最大值表示一个峰值。它与物理声压没有任何相关性,这通常是人们说“响度”时的意思(dB(SPL)是50dB是语音响度的比例,110dB是摇滚音乐会等)。

另请参阅:声音计 android

于 2013-03-11T10:48:55.283 回答