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

标签 android audio microphone decibel

<分区>

我正在尝试计算 android 上麦克风的响度级别。 我使用 AudioRecord 从麦克风获取原始数据,还做了一些归一化并计算了之后的分贝。但是结果不对。我得到的分贝值不稳定,不能反射(reflect)声音。比如即使我拍手,分贝值也没有反射(reflect)出声音。我应该如何更改代码或者如果我想实时计算来自麦克风的响度我应该怎么做?非常感谢。

               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;
                }

            }   

最佳答案

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

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

另请参阅:sound meter android

关于android - 从android上的麦克风计算响度级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333725/

相关文章:

Android EditText 粘贴文本时如何禁用自动插入空格?

linux - ffmpeg 和 flac 中哪个应该用于将 wav 文件转换为 flac?为什么?

javascript - HTML5 音频缓存 - 不止一次?

java - 在人群区域录制音频时,如何使用 Java 消除背景噪音?

Python 3 - Mac OS X 10.6.x - 如何捕获麦克风输入原始样本数据?

android - 如何在移动设备上调用 Facebook 页面的桌面站点?

java - 在 'retrofit2.Retrofit' 中不公开,不能从外部访问

Java:如何实现队列系统来播放音频片段?

silverlight - 为什么 Silverlight 在没有任何编码 API 的情况下提供网络摄像头和麦克风支持?

android - 假电话和信息