Шумомер децибел для Android

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


person FaISalBLiNK    schedule 07.03.2012    source источник


Ответы (3)


Взято из Проигрыватель 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;

    }

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

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

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

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

person Soham    schedule 07.03.2012
comment
что такое референсамп? - person mohitum; 17.01.2014
comment
Спустя 7 лет никто не знает, что такое referenceAmp :) - person inferus-vv; 14.07.2021

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

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

}
person Patrick    schedule 13.06.2012
comment
Патрик, когда вы вызываете soundDb(double ampl), как вы определяете параметр? Это эталонное значение является ключом к правильному преобразованию децибел. - person Radu; 03.09.2012
comment
Я использую ampl = 10exp(-7). Вы можете попробовать другие значения и сравнить свои результаты с другими приложениями уровня звука. Поэтому вы выбираете того, кто работает лучше всего - person Patrick; 03.03.2013

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

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

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

person the_mandrill    schedule 07.03.2012