Децибел звуковой метр для Android - PullRequest
5 голосов
/ 07 марта 2012

Я новичок в Android и хочу написать приложение для измерения уровня звука в децибелах .Идея состоит в том, что когда звук достигает определенного уровня, пользователь получает предупреждение.Вот и все.Может ли кто-нибудь помочь мне с этим.Могу ли я сделать это с помощью HTML5 / Javascript?любая помощь будет оценена.

Ответы [ 3 ]

11 голосов
/ 07 марта 2012

Взято из Android Media Player Чтение децибел

Для собственного вычисления децибела на основе Android / Java для MediaRecorder:

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null"); 
mRecorder.prepare();
mRecorder.start();
   public double getAmplitude() {
            if (mRecorder != null)
                    return  (mRecorder.getMaxAmplitude());
            else
                    return 0;

    }

Чтобы рассчитать значение Db:

  powerDb = 20 * log10(getAmplitude() / referenceAmp);

Ссылка: http://en.wikipedia.org/wiki/Decibel#Field_quantities

Не уверен, что вы могли бы сделать это в HTML5 на Android

4 голосов
/ 07 марта 2012

Я думаю, вам нужно уточнить, что вы подразумеваете под «децибел».Есть несколько разных типов дБ, которые означают совершенно разные вещи.В примере, который приводит Сохем, вычисляется пиковое значение дБ относительно эталонной амплитуды, которое предлагается в исходной статье с использованием максимального цифрового значения 1,0.Это означает, что значение, которое вы получите, будет колебаться от -96 дБ до 0 дБ для 16-битного захвата звука.

Я подозреваю, что вы хотите измерить уровень звукового давления (диапазон, в которомречь идет о 50 дБ, воздушные издержки 120 дБ).На самом деле это называется 'db (SPL)' .Вы не сможете сделать это на своем устройстве, если у вас нет каких-либо средств для калибровки вашего устройства по определенным уровням мощности.

Есть и другие соображения, которые вам нужно сделать.Один из них - нужен ли вам пиковый или среднеквадратичный уровень мощности (пиковый для мгновенных событий, среднеквадратичный для непрерывного звука, например музыки).Также вам необходимо знать, как отключить любую автоматическую регулировку усиления на устройстве, поскольку это сделает любые измерения бессмысленными.

2 голосов
/ 13 июня 2012

у меня этот код работает:

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class Noise extends Activity {

    TextView mStatusView;
    MediaRecorder mRecorder;
    Thread runner;
    private static double mEMA = 0.0;
    static final private double EMA_FILTER = 0.6;

    final Runnable updater = new Runnable(){

        public void run(){          
            updateTv();
        };
    };
    final Handler mHandler = new Handler();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.noiselevel);
        mStatusView = (TextView) findViewById(R.id.status);


        if (runner == null)
        { 
            runner = new Thread(){
                public void run()
                {
                    while (runner != null)
                    {
                        try
                        {
                            Thread.sleep(1000);
                            Log.i("Noise", "Tock");
                        } catch (InterruptedException e) { };
                        mHandler.post(updater);
                    }
                }
            };
            runner.start();
            Log.d("Noise", "start runner()");
        }
    }

    public void onResume()
    {
        super.onResume();
        startRecorder();
    }

    public void onPause()
    {
        super.onPause();
        stopRecorder();
    }

    public void startRecorder(){
        if (mRecorder == null)
        {
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mRecorder.setOutputFile("/dev/null"); 
            try
            {           
                mRecorder.prepare();
            }catch (java.io.IOException ioe) {
                android.util.Log.e("[Monkey]", "IOException: " + android.util.Log.getStackTraceString(ioe));

            }catch (java.lang.SecurityException e) {
                android.util.Log.e("[Monkey]", "SecurityException: " + android.util.Log.getStackTraceString(e));
            }
            try
            {           
                mRecorder.start();
            }catch (java.lang.SecurityException e) {
                android.util.Log.e("[Monkey]", "SecurityException: " + android.util.Log.getStackTraceString(e));
            }

            //mEMA = 0.0;
        }

    }
    public void stopRecorder() {
        if (mRecorder != null) {
            mRecorder.stop();       
            mRecorder.release();
            mRecorder = null;
        }
    }

    public void updateTv(){
        mStatusView.setText(Double.toString((getAmplitudeEMA())) + " dB");
    }
    public double soundDb(double ampl){
        return  20 * Math.log10(getAmplitudeEMA() / ampl);
    }
    public double getAmplitude() {
        if (mRecorder != null)
            return  (mRecorder.getMaxAmplitude());
        else
            return 0;

    }
    public double getAmplitudeEMA() {
        double amp =  getAmplitude();
        mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
        return mEMA;
    }

}
...