2012-05-19 4 views
1

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

Как это можно достичь?

EDIT:

Я использую следующий код:

private Thread recordingThread; 
private int bufferSize = 800; 
private short[][] buffers = new short[256][bufferSize]; 
private int[] averages = new int[256]; 
private int lastBuffer = 0; 

AudioRecord recorder; 
boolean recorderStarted = false; 

protected void startListenToMicrophone() 
{ 
    if (!recorderStarted) 
    { 

     recordingThread = new Thread() 
     { 
      @Override 
      public void run() 
      { 
       int minBufferSize = AudioRecord.getMinBufferSize(8000, 
         AudioFormat.CHANNEL_CONFIGURATION_MONO, 
         AudioFormat.ENCODING_PCM_16BIT); 
       recorder = new AudioRecord(AudioSource.MIC, 8000, 
         AudioFormat.CHANNEL_CONFIGURATION_MONO, 
         AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 10); 
       recorder.setPositionNotificationPeriod(bufferSize); 
       recorder.setRecordPositionUpdateListener(new OnRecordPositionUpdateListener() 
       { 
        @Override 
        public void onPeriodicNotification(AudioRecord recorder) 
        { 
         short[] buffer = buffers[++lastBuffer 
           % buffers.length]; 
         recorder.read(buffer, 0, bufferSize); 
         long sum = 0; 
         for (int i = 0; i < bufferSize; ++i) 
         { 
          sum += Math.abs(buffer[i]); 
         } 
         averages[lastBuffer % buffers.length] = (int) (sum/bufferSize); 
         lastBuffer = lastBuffer % buffers.length; 
         Log.i("dB", ""+averages); 
         tv4.setText("" + averages[1]); 
        } 

        @Override 
        public void onMarkerReached(AudioRecord recorder) 
        { 
        } 
       }); 

       recorder.startRecording(); 
       short[] buffer = buffers[lastBuffer % buffers.length]; 
       recorder.read(buffer, 0, bufferSize); 
       while (true) 
       { 
        if (isInterrupted()) 
        { 
         recorder.stop(); 
         recorder.release(); 
         break; 
        } 
       } 
      } 
     }; 
     recordingThread.start(); 

     recorderStarted = true; 
    } 
} 

private void stopListenToMicrophone() 
{ 
    if (recorderStarted) 
    { 
     if (recordingThread != null && recordingThread.isAlive() 
       && !recordingThread.isInterrupted()) 
     { 
      recordingThread.interrupt(); 
     } 
     recorderStarted = false; 
    } 
} 
    } 

У меня есть две кнопки в моем приложении. Первый вызывает startListenToMicrophone и второй вызывает остановку. Я не понимаю, как это работает. Я получил код отсюда.

Текстовое изображение получает странное и очень большое значение. Мне нужен уровень звука в децибелах.

+0

Возможный дубликат [Уровень шума запроса в Android] (http://stackoverflow.com/questions/3567753/query-noise-level-in-android) –

+0

Я изучил это. Решение, предоставленное там, не сработало. – Asim

+0

В этом случае отредактируйте свой вопрос, чтобы описать, каким образом он не работает. –

ответ

2

Просто мимолетная мысль, и я могу ошибаться, но амплитуда в дБ = 20xlog (S1/S2). Я не мог найти этот расчет в любом месте вашего кода. вам нужно получить S1, который будет текущим записанным уровнем и получить S2, который должен быть максимально возможным для записи. Затем вычислите значение дБ.

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