2013-03-11 1 views
8

Я пытаюсь рассчитать уровень громкости от микрофона на Android. Я использовал AudioRecord для получения необработанных данных с микрофона, а также выполнил некоторую нормализацию и вычислил децибел после этого. Но результат неправильный. Значения децибел, которые я получил, не были устойчивыми и не могут отражать звук. Например, даже когда я хлопал в ладоши, значение децибела не отражало звук. Как мне изменить код или Что делать, если я хочу рассчитать громкость от микрофона в режиме реального времени? Большое спасибо.Рассчитать уровень громкости от микрофона на андроиде

   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

Цель может быть обнаружить изменение звука Enviroment только на основе громкости. Как мне это сделать? Благодарю. – Foreverniu

+0

Я думаю, что вы проверяете громкость в управлении аудио – DjHacktorReborn

+0

Я пока не работал с микрофоном, но я бы предположил, что ваш расчет всегда дает тот же результат. Предположим, что нет шума, тогда у вас будет много образцов на 50%, что будет 0, если числа действительно подписаны. С другой стороны, когда есть звук, у вас будет много образцов с одинаковой положительной и отрицательной амплитудой, что также добавит до 0. Я бы сказал, что вам нужно принимать только абсолютные значения, например. устранить знак, если вы действительно получаете положительные и отрицательные числа? –

ответ

3

Здесь есть две проблемы. Во-первых, вы вычисляете RMS из одного образца, так как вы не вычисляете сумму по всему буферу - вы сбросите его каждый образец. Таким образом, sum содержит квадратную величину для одного образца, но тогда вы делите на длину выборки.

Вторая проблема заключается в том, что вы не сможете легко создать метр для измерения громкости. Вычисляемое значение децибела будет только отношением мощности, где максимальное значение 0 дБ указывает пик. Он не имеет никакой корреляции с физическим звуковым давлением, что обычно означает люди, когда говорят «громкость» (дБ (SPL) - это шкала, где 50 дБ - громкость речи, 110 дБ - рок-концерт и т. Д.).

Смотрите также: sound meter android

 Смежные вопросы

  • Нет связанных вопросов^_^