2014-01-14 20 views
5

Ich habe Code, der die Amplitude von einem AudioRecord erhalten soll. Problem ist, dass die Mathematik nur -Infinity zurückgibt. Kann ich noch ein paar Augen bekommen mit mir um es zu betrachten bitte:Amplitude von AudioRecord

private class measureSnoreAudio extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 


      Log.d(TAG, "Creating the buffer of size " + BUFFER_SIZE); 
      byte[] buffer = new byte[BUFFER_SIZE]; 

      Log.d(TAG, "Creating the AudioRecord"); 
      recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        RECORDING_RATE, CHANNEL, FORMAT, BUFFER_SIZE * 10); 

      Log.d(TAG, "AudioRecord recording..."); 
      recorder.startRecording(); 

      while (isRecordingSnore) { 

       // read the data into the buffer 
       int read = recorder.read(buffer, 0, buffer.length); 
       int amplitude = (buffer[0] & 0xff) << 8 | buffer[1]; 

       // Determine amplitude 
       double amplitudeDb = 20 * Math 
         .log10(Math.abs(amplitude)/32768); 
       String dbString = String.valueOf(amplitudeDb); 
       Log.d("Snore DB", "dB " + dbString); 
       //TextView textAmplitude = (TextView) findViewById(R.id.tvAmplitude); 
       //textAmplitude.setText(dbString); 
      } 

      Log.d(TAG, "AudioRecord finished recording"); 
     return null; 
    } 
} 
+0

Darf ich fragen, was Sie mit dieser Linie tun: 'int Amplitude = (buffer [0] & 0xff) << 8 | buffer [1]; ' Wie berichten Sie darüber hinaus db-amplitude, ohne zuerst FFT zu verwenden? –

Antwort

7
double amplitudeDb = 20 * Math.log10(Math.abs(amplitude)/32768); 

Ich denke, vielleicht das Problem von Math.abs ist (Amplitude)/32768, Amplitude ist integer, so Math.abs (Amplitude) wird auch ganzzahl zurückgegeben, da Math.abs (amplitude) kleiner als 32768 ist (vielleicht bin ich nicht korrekt, byte ist maximal 2^7 - 1, kann hier die amplitude größer als 32768 sein?). Also Math.abs (Amplitude)/32768 ist gleich 0. Log10 (0) ist -Infinity, habe ich mit einem Java-Projekt in Eclipse getestet. Sie können ändern

double amplitudeDb = 20 * Math.log10((double)Math.abs(amplitude)/32768); 
+0

Gute Arbeit. Ich habe endlich ein paar Zahlen, mit denen ich arbeiten kann. Sie sind alle meistens negativ, aber zumindest kann ich sehen, was vor sich geht. Vielen Dank für Ihre Zeit. –

+0

Ich bin froh, dass ich helfen konnte. :] – frogoscar

+0

warum die int Amplitude = (Puffer [0] & 0xff) << 8 | Puffer [1]; ? Vielen Dank – user601836

Verwandte Themen