2013-03-11 7 views
8

Sto cercando di calcolare il livello di volume dal microfono su Android. Ho usato AudioRecord per ottenere i dati grezzi dal microfono e anche fatto un po 'di normalizzazione e calcolato il decibel dopo. Ma il risultato non è giusto. I valori di decibel ottenuti non erano costanti e non possono riflettere il suono. Ad esempio, anche quando ho battuto le mani, il valore di decibel non rifletteva il suono. Come dovrei cambiare il codice o cosa dovrei fare se voglio calcolare il volume dal microfono in tempo reale? Molte grazie.Calcola il livello di volume dal microfono su 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

Lo scopo potrebbe essere rileva la modifica del suono ambiente solo in base alla sonorità. Come dovrei farlo? Grazie. – Foreverniu

+0

penso che controlli il volume in gestione audio – DjHacktorReborn

+0

Non ho ancora lavorato con il microfono, ma suppongo che il tuo calcolo abbia sempre lo stesso risultato. Supponete che non ci siano rumori, quindi avreste molti campioni al 50%, che sarebbe 0 se i numeri sono veramente firmati. D'altra parte, quando c'è un suono, avresti molti campioni con un'ampiezza positiva e negativa simile, che aggiungerebbe anche 0. Direi che è necessario prendere solo valori assoluti, ad es. eliminare il segno se ricevi veramente numeri positivi e negativi? –

risposta

3

Ci sono due problemi qui. Il primo è che stai calcolando il RMS da un singolo campione, poiché non stai calcolando la somma attraverso l'intero buffer: lo stai reimpostando ogni campione. Quindi, sum contiene la magnitudine quadrata per un campione, ma poi si sta dividendo per la lunghezza del campione.

Il secondo problema è che non sarà facile creare un misuratore per misurare il volume. Il valore di decibel calcolato sarà solo un rapporto di potenza in cui il valore massimo di 0 dB indica un picco. Non ha alcuna correlazione con la pressione sonora fisica, che è generalmente ciò che le persone intendono quando pronunciano "loudness" (dB (SPL) è la scala in cui 50dB è il volume del parlato, 110dB un concerto rock, ecc.).

Consulta anche: sound meter android