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

ここには 2 つの問題があります。1 つ目は、バッファー全体の合計を計算していないため、単一のサンプルから RMS を計算していることです。サンプルごとにリセットしています。したがってsum、1 つのサンプルの 2 乗の大きさが含まれていますが、サンプルの長さで割っています。

2 つ目の問題は、ラウドネスを測定するメーターを簡単に作成できないことです。計算するデシベル値は、最大値 0dB がピークを示す電力比のみになります。それは物理的な音圧とは何の相関関係もありません。これは、人々が「ラウドネス」と言うときに一般的に意味するものです (dB(SPL) は、50dB がスピーチのラウドネス、110dB がロック コンサートなどのスケールです)。

参照:サウンドメーター android

于 2013-03-11T10:48:55.283 に答える