2013-03-11 10 views
8

android에서 마이크의 소리 크기를 계산하려고합니다. AudioRecord를 사용하여 마이크에서 원시 데이터를 가져오고 일부 정규화를 수행 한 후 그 데시벨을 계산했습니다. 그러나 그 결과는 옳지 않습니다. 데시벨 값이 안정적이지 않고 사운드를 반사 할 수 없습니다. 손을 쳤을 때도 데시벨 값은 소리를 반영하지 않았습니다. 코드를 어떻게 변경해야합니까? 실시간으로 마이크의 소리 크기를 계산하려면 어떻게해야합니까? 고마워.android의 마이크에서 소리 크기를 계산하십시오.

   recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO,    AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize); 

       iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize); 

       for (int i = 0; i < buffer.length-1; i++) 
      { 
       ByteBuffer bb = ByteBuffer.wrap(buffer, i, 2); 
       int isample = bb.getShort(); 

       double dsample =(double) isample/32768.0; 
       sum += (dsample*dsample); 

       double rms = Math.sqrt(sum/(buffer.length*0.5));   
       double decibel = 20*Math.log10(rms); 

       sum = 0; 
       } 

      } 
+0

목적은 단지 소리의 크기에 따라 환경 사운드 변화를 감지 할 수 있습니다. 어떻게해야합니까? 감사. – Foreverniu

+0

나는 오디오 관리에서 볼륨을 확인한다고 생각한다. – DjHacktorReborn

+0

나는 지금까지 마이크로 작업하지는 않았지만 계산 결과가 항상 같은 결과를 산출한다고 가정한다. 소음이 없다고 가정하면 50 %의 샘플을 얻게되며, 실제로 숫자가 서명 된 경우 0이됩니다. 반면에 사운드가있을 때 비슷한 양의 진폭과 음의 진폭을 갖는 많은 샘플을 가지므로 0까지 추가됩니다. 절대 값만 가져야한다고 말하고 싶습니다. 정말로 양수와 음수를받는다면 표지판을 제거 하시겠습니까? –

답변

3

여기에는 두 가지 문제점이 있습니다. 첫 번째는 전체 버퍼에서 합계를 계산하지 않으므로 단일 샘플에서 RMS를 계산한다는 것입니다. 모든 샘플을 다시 설정합니다. 따라서 sum은 한 샘플의 제곱 크기를 포함하지만 샘플 길이로 나눕니다.

두 번째 문제는 소리 크기를 측정하는 미터를 쉽게 만들 수 없다는 것입니다. 계산하는 데시벨 값은 최대 비율 0dB가 피크를 나타내는 전력 비율 일뿐입니다. 물리적 음압과는 상관 관계가 없습니다. 일반적으로 '소리 크기'(dB (SPL)은 50dB가 음성의 음량, 110dB의 록 콘서트 등의 음계)입니다.

은 참조 : sound meter android