从android上的麦克风计算响度级别

For*_*niu 9 audio android microphone decibel

我试图从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;
                }

            }   
Run Code Online (Sandbox Code Playgroud)

the*_*ill 3

这里有两个问题。第一个是您正在计算单个样本的 RMS,因为您没有计算整个缓冲区的总和 - 您正在每个样本中重置它。Sosum包含一个样本的平方幅度,但随后除以样本长度。

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

另请参阅:声音计 android