2013-04-17 5 views
1

getMaxAmpitude를 얻은 다음 데시벨로 변환하는 애플리케이션을 만들었지 만 30dB의 범위 만 얻습니다.안드로이드의 데시벨

Android 휴대 전화는 30dB 범위 밖에 없습니까, 아니면 내 코드에서 문제가됩니까?

public class getMaxAmpitude extends AsyncTask<Void, Float, Void>{ 
    String dB = "";  
    int ampitude; 
    float db; 
    @Override 
    public Void doInBackground(Void... params) { 
     while(rec == true){ 
      try{ 
       Thread.sleep(250); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
      ampitude = recorder.getMaxAmplitude(); 
      db =(float) (20 * Math.log10(ampitude/700.0)); 
      publishProgress(db); 
     } 
     return null; 
    } 
    public void onProgressUpdate(Float... progress){ 

     //database.addSoundData(dB); 
     dB = (progress[0].toString()); 
+0

'db = (float) (20 * Math.log10 (ampitude/700.0));를 사용하면 어떤 생각을하게 될까요? – marko

+0

시작 값 0을 얻을 수 있도록 기준 진폭으로 놀고있었습니다.하지만 내 질문에 답하지 않습니다. –

답변

9

데시벨 스케일은 항상 무언가에 대한 측정 기준으로 - 디지털 오디오의 경우, 뭔가 샘플이 보유 할 수있는 최대 값은 관례입니다. 샘플의 부동 소수점 표현은 1.0이고 부호가있는 16 비트 샘플은 32767입니다. 계산 된 dB 값은 음수이고 클립은 0dB입니다.

recorder이 무엇인지 정확히 알지 못하면 안드로이드의 MediaRecorder - 부호있는 16 비트 정수를 사용한다고 가정합니다.

이 경우 올바른 수식 그러므로 다음과 같습니다

db = 20.0 * log10(peakAmplitude) - 20.0 * log10(700)

: 그것은에 eqivelant의로

db = 20.0 * log10(peakAmplitude/32767.0)

당신이 그러나 위의 사용한 방정식은 단지 편견이있는 결과를 =20.0*log10(peakAmplitude) - ~56.9

30dB의 동적 범위 그림 온보드 마이크를 녹음하고 자동 게인 컨트롤이 활성화되어 있다면 놀랄 일이 아닙니다. 활성화 된 단계를 비활성화하지 않으면 자동으로 게인 컨트롤이 활성화됩니다.