2012-03-07 10 views
3

신생아입니다. 데시벨 사운드 레벨에 대한 앱을 쓰고 싶습니다. 사운드가 일정 수준에 도달하면 사용자는 경고를받습니다. 그게 전부 야. 아무도 나를 도와 줄 수 없어. HTML5/Javascript를 사용하여이 작업을 수행 할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.데시벨 사운드 미터

답변

10

는 MediaRecorder 네이티브 안드로이드/자바 기반의 데시벨 계산에 Android Media Player Decibel Reading

에서 촬영 :

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

참조 : http://en.wikipedia.org/wiki/Decibel#Field_quantities

하지

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 값을 계산하려면 네가 할 수 있다면 HTML5 in android

+0

감사합니다 .... – FaISalBLiNK

+8

referenceAmp 무엇인가? – mohitum

4

'deciBel'의 의미를 분명히해야한다고 생각합니다. 꽤 다른 것을 의미하는 몇 가지 다른 유형의 dB가 있습니다. Soham이 제공하는 예제는 참조 진폭에 상대적인 피크 dB를 계산합니다. 원고는 최대 디지털 값 1.0을 사용하여 제안합니다. 즉, 나가는 값은 16 비트 오디오 캡처의 경우 약 -96dB에서 0dB 사이입니다.

당신이하고 싶은 것은 음압 레벨 (음성이 약 50dB, 제트 오버 헤드가 120dB 인 범위)을 측정하는 것입니다. 실제로는 'db (SPL)'이라고합니다. 특정 출력 레벨에 대해 장치를 교정 할 수있는 방법이 없으면 장치에서이 작업을 수행 할 수 없습니다.

추가로 고려해야 할 사항이 있습니다. 하나는 피크 또는 RMS 전력 레벨 (즉석 이벤트의 피크, 음악과 같은 연속 사운드의 RMS)이 필요한지 여부입니다. 또한 장치에서 자동 이득 제어를 끄는 방법을 알아야합니다. 이는 측정을 의미없는 것으로 만들 것입니다.

0

이 코드는 나를 위해 작동 : 사람 많이

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

} 
+2

Patrick, soundDb (double ampl)를 호출하면 매개 변수를 어떻게 결정합니까? 이 벤치 마크 값은 데시벨 변환을 수정하는 데 핵심입니다. – Radu

+0

ampl = 10exp (-7)를 사용합니다. 다른 값을 시도하고 결과를 다른 사운드 레벨 응용 프로그램과 비교할 수 있습니다. 따라서 최선을 다하는 사람을 선택하십시오 – Patrick

+1

조각에서이 코드를 사용하는 방법 ... ???? –