Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过android上的麦克风计算响度级别_Android_Audio_Microphone_Decibel - Fatal编程技术网

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

通过android上的麦克风计算响度级别,android,audio,microphone,decibel,Android,Audio,Microphone,Decibel,我正试图通过android上的麦克风计算音量。 我使用AudioRecord从麦克风获取原始数据,并进行了一些标准化,然后计算了分贝。但结果并不正确。我得到的分贝值不稳定,不能反映声音。例如,即使我拍手,分贝值也不能反映声音。如果我想实时计算麦克风的响度,我应该如何更改代码或怎么做?非常感谢 recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO,

我正试图通过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;
                }

            }   
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
,并作为短裤访问它?我认为关闭它的人是越轨的。