1

私が欲しいのは、ボタンをクリックするだけで現在の騒音レベルをデシベル (dB) で取得できるようにすることです。私はセンサーをいじっていて、簡単に機能させることができますが、これは..困惑しています。いくつかのコードを試してみましたが、どれも機能しないか、これを理解するのに役立ちました。

これはどのように達成できますか?

編集:

次のコードを使用します。

    private Thread recordingThread;
private int bufferSize = 800;
private short[][] buffers = new short[256][bufferSize];
private int[] averages = new int[256];
private int lastBuffer = 0;

AudioRecord recorder;
boolean recorderStarted = false;

protected void startListenToMicrophone()
{
    if (!recorderStarted)
    {

        recordingThread = new Thread()
        {
            @Override
            public void run()
            {
                int minBufferSize = AudioRecord.getMinBufferSize(8000,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                recorder = new AudioRecord(AudioSource.MIC, 8000,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 10);
                recorder.setPositionNotificationPeriod(bufferSize);
                recorder.setRecordPositionUpdateListener(new OnRecordPositionUpdateListener()
                {
                    @Override
                    public void onPeriodicNotification(AudioRecord recorder)
                    {
                        short[] buffer = buffers[++lastBuffer
                                % buffers.length];
                        recorder.read(buffer, 0, bufferSize);
                        long sum = 0;
                        for (int i = 0; i < bufferSize; ++i)
                        {
                            sum += Math.abs(buffer[i]);
                        }
                        averages[lastBuffer % buffers.length] = (int) (sum / bufferSize);
                        lastBuffer = lastBuffer % buffers.length;
                        Log.i("dB", ""+averages);
                        tv4.setText("" + averages[1]);
                    }

                    @Override
                    public void onMarkerReached(AudioRecord recorder)
                    {
                    }
                });

                recorder.startRecording();
                short[] buffer = buffers[lastBuffer % buffers.length];
                recorder.read(buffer, 0, bufferSize);
                while (true)
                {
                    if (isInterrupted())
                    {
                        recorder.stop();
                        recorder.release();
                        break;
                    }
                }
            }
        };
        recordingThread.start();

        recorderStarted = true;
    }
}

private void stopListenToMicrophone()
{
    if (recorderStarted)
    {
        if (recordingThread != null && recordingThread.isAlive()
                && !recordingThread.isInterrupted())
        {
            recordingThread.interrupt();
        }
        recorderStarted = false;
    }
}
    }

アプリには 2 つのボタンがあります。最初の 1 つは startListenToMicrophone を呼び出し、2 番目は stop を呼び出します。これがどのように機能するかわかりません。ここからコードを取得しました。

テキストビューは奇妙で非常に大きな値を取得します。必要なのはデシベル単位の音量です。

4

1 に答える 1

2

ちょっとした考えで、私は非常に間違っているかもしれませんが、振幅は dB=20xlog(S1/S2) です。コードのどこにもこの計算が見つかりませんでした。あなたがする必要があるのは、現在記録されているレベルになる S1 を取得し、記録可能な最大値である必要がある S2 を取得することです。次に、dB 値を計算します。

于 2012-11-05T22:51:12.427 に答える