2012-06-16 3 views
0

Android 플랫폼에 사운드 미터를 구축하려고합니다. (나는 HTC 산불을 사용하고 있습니다.) 그 목표에 대해 AudioRecord 클래스를 사용하지만, "read"에서 반환되는 값은 합리적이지 않습니다.AudioRecord read가 이상한 값을 반환합니다.

short[] audioData = new short[bufferSize]; 
    int offset =0; 
    int shortRead = 0; 
    int sampleToReadPerGet = 1000;//some value in order to avoid momentaraly nosies. 

    //start tapping into the microphone 
    audioRecored.startRecording(); 

    //start reading from the microphone to an internal buffer - chuck by chunk 
    while (offset < sampleToReadPerGet) 
    { 
      shortRead = audioRecored.read(audioData, offset ,sampleToReadPerGet - offset); 
      offset += shortRead; 
    } 

    //stop tapping into the microphone 
    audioRecored.stop(); 

    //average the buffer 
    int averageSoundLevel = 0; 
    for (int i = 0 ; i < sampleToReadPerGet ; i++) 
    { 
     averageSoundLevel += audioData[i];   
    } 
    averageSoundLevel /= sampleToReadPerGet;  

그 가치는 무엇입니까 : 내가 그것을에서 데이터를 읽으려고 시도하는 방법이있다

int minBufferSize = 
     AudioRecord.getMinBufferSize(sampleRateInHz, 
             android.media.AudioFormat.CHANNEL_IN_MONO, 
             android.media.AudioFormat.ENCODING_PCM_16BIT); 

audioRecored = new AudioRecord(MediaRecorder.AudioSource.MIC,   
           44100, 
           android.media.AudioFormat.CHANNEL_IN_MONO, 
           android.media.AudioFormat.ENCODING_PCM_16BIT, 
           minBufferSize); 

:

이것은 내가 가지 audiorecord 객체를 생성하는 방법이다? 데시벨인가요?

편집 : 값은 -200에서 3000 사이입니다. shortRead의 값은 sampleToReadPerGet (1000)입니다.

+1

을 받고 어떤 값? 물론 16 비트 PCM 샘플을 다시 얻는 것입니다. – Brad

+1

읽기를 호출 한 후 'shortRead'의 값은 무엇입니까? –

+0

질문에 값을 추가했습니다. – talel

답변

1

원시 출력 또는 평균값은 "해당 값"이 무엇인지는 모르지만 원시 출력은 순간 진폭 레벨입니다. 이러한 값은 특히 어떤 것에도 참조되지 않는다는 것을 깨닫는 것이 중요합니다. 즉, 당신이 20 세를 읽고 있기 때문에, 20 점을 말하지 않습니다.

이러한 값의 평균을 취하는 것은 의미가 없습니다. 그 값이 0 위 및 아래로 스윙하기 때문입니다. 길게하면 0이됩니다.

평균의 제곱을 취한 다음 평균의 제곱근을 구할 수 있습니다. 이를 RMS라고합니다. 그러나 고정 버퍼 크기가 평균 이상이면 위험합니다.

dB를 측정하려면 수식 dB = 20 log_10 (| A |/A_r)을 사용해야합니다. 여기서 A는 진폭이고 A_r은 기준 진폭입니다. 명확하게 말하면 참조하는 항목을 결정해야합니다 HTC를 보정하거나 최대 레벨 또는 그와 비슷한 것을 측정 할 수 있습니다.

0

음수 값을 지정하지 않아야합니다. 값의 범위는 16 비트 또는 8 비트이므로 최대 값은 32000 정도입니다. 값에는 단위가 없습니다.

또한 볼륨 결정을 위해 평균 대신 평균 제곱근을 권장합니다. 더 안정적입니다. 당신이 시도해야합니까

:

  • 증가 세에 의해 버퍼 크기 : 당신이 어떤 공간이 필요하므로 앱은 충분히 빠른 를 읽을 수 없습니다. 그렇지 않으면 gast-lib의 코드를 시도 일부 버퍼 오버 플로우 (코드에서 확인되지 않음) 오류

  • 을 받고 수 있습니다 : 그것은 당신이 정기적으로 오디오를 녹음하는 데 도움이 또한 당신에게 AsyncTask를 제공합니다.

  • 루트는 제곱 의미 : 당신이

public static double rootMeanSquared(short[] nums) 
{ 
    double ms = 0; 
    for (int i = 0; i < nums.length; i++) 
    { 
     ms += nums[i] * nums[i]; 
    } 
    ms /= nums.length; 
    return Math.sqrt(ms); 
} 
+0

gast-lib의 코드는 실제로 – Mirko

+0

을 빌드하지 않습니다. – Mirko

관련 문제