2016-07-12 7 views
2

Ich arbeite an einem Forschungsprojekt, das die Erfassung von Lärmbelästigungen in der Gemeinschaft mit einem Android-Gerät zur Durchführung komplexer digitaler Signalverarbeitungsanalysen und zur Berechnung einiger Metriken beinhaltet.Wie kalibriert man das Mikrofon eines Android-Geräts

Mein Supervisor wies mich an, die Mikrofone der Android-Geräte zu kalibrieren, bevor sie in der Gemeinschaft verteilt wurden. Ich habe mich gefragt, ob es einen programmatischen Weg dafür gibt.

Warum die Kalibrierung?

Die Mikrofonempfindlichkeit eines Android-Geräts kann sich von einem anderen Gerät unterscheiden. Selbst die Hersteller der gleichen Firma können ihre Empfindlichkeiten nicht kommentieren.

So ist es durchaus möglich, dass ein Android-Gerät einen Ton mit 60 dB und ein anderes Gerät den Ton mit 70 dB zur gleichen Zeit unter identischen Umgebungen und Bedingungen aufzeichnen kann.

Ich dachte über die folgenden Zeilen nach -> mache eine Aufnahme in einer ruhigen Umgebung, gefolgt von einer Aufnahme in einer lauten Umgebung. Die Verstärkung kann nach Bedarf eingestellt werden. Ich bin darüber noch nicht klar.

Gibt es einen programmatischen Weg, dies zu tun?

Jede Hilfe zu diesem wird sehr geschätzt.

+0

Mögliches Duplikat von [Wie kalibriere ich ein externes Mikrofon?] (Http://stackoverflow.com/questions/38336768/how-to-calibrate-an-external-microphone-device) Sie haben gerade eine fast identische Frage gestellt . Vielleicht fügen Sie einige Details von diesem zum früheren hinzu. – hotpaw2

+0

Ja. Der Grund, warum ich diese Frage gestellt habe, ist, weil es darum geht, das Mikrofon eines Android-Smartphones zu kalibrieren. Da ich ein Skript schreiben muss, um ein Mikrofon automatisch in einer Umgebung zu kalibrieren, bevor ich eine Aufnahme mache, denke ich, dass diese Frage anders ist als die andere, die ich gefragt habe. – aditya

Antwort

0

Nach einigen Nachforschungen habe ich endlich einen Weg gefunden, die Empfindlichkeit des Mikrofons eines Android-Telefons zu kalibrieren.

Nachstehend ist der Code zum Erstellen der Amplitude als dB-Werte mit der Klasse MediaRecorder in Android.

import android.media.MediaRecorder; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.IOException; 
import java.util.Timer; 
import java.util.TimerTask; 

public class RecordingAudioThreshold extends AppCompatActivity { 

    // This class generates the spectrogram of a wav file 
    private MediaRecorder mediaRecorder = null; 
    private Timer timerThread; 
    private Button startRecording, stopRecording; 
    private TextView recordingThreshold, recordingThresholdDB; 
    int amplitude = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_generate_spectrogram); 

     // Initialize the timer (used to cancel the thread if it's not running). 
     timerThread = new Timer(); 

     // Method to calibrate the microphone 
     startRecording = (Button) findViewById(R.id.button_startRecording); 
     stopRecording = (Button) findViewById(R.id.button_stopRecording); 
     recordingThreshold = (TextView) findViewById(R.id.textView_threshold); 
     recordingThresholdDB = (TextView) findViewById(R.id.textView_thresholdDB); 

     startRecording.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaRecorder = new MediaRecorder(); 
       mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
       mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
       mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
       mediaRecorder.setOutputFile("/dev/null"); 

       try { 
        mediaRecorder.prepare(); 
        mediaRecorder.start(); 
        System.out.println("Started Recording using Media Recorder"); 
       } catch (IOException e) { 
        System.out.println("Exception while recording of type : " + e.toString()); 
       } 

       // start the timer to print the recorded values 
       timerThread.schedule(new TimerTask() { 
        @Override 
        public void run() { 
         amplitude = mediaRecorder.getMaxAmplitude(); 
         recordingThreshold.post(new Runnable() { 
          @Override 
          public void run() { 
           recordingThreshold.setText("The recorded value is : " + amplitude); 
          } 
         }); 
         recordingThresholdDB.post(new Runnable() { 
          @Override 
          public void run() { 
           recordingThresholdDB.setText("The decibel value is : " + 20 * Math.log10(amplitude)); 
          } 
         }); 
        } 
       }, 0, 500); 
      } 
     }); 

     stopRecording.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       timerThread.cancel(); 
       if (mediaRecorder != null) { 
        mediaRecorder.release(); 
        mediaRecorder = null; 
       } 
       recordingThreshold.setText("Calibration complete."); 
       recordingThresholdDB.setText("Calibration complete."); 
      } 
     }); 
    } 
} 

Jetzt gibt es zwei Möglichkeiten, um die Empfindlichkeit des Mikrofons einzustellen. Eine Methode besteht darin, eine kalibrierte Tonaufzeichnungsanlage zu verwenden, und die zweite Methode besteht darin, einen Ton von bekanntem Wert zu erzeugen.

Messen Sie die Lautstärke in dB, gemessen am Mikrofon des Telefons und am kalibrierten Tonaufnahmegerät, und stellen Sie die Verstärkung ein.

Einen Klang mit bekanntem Wert erzeugen und die Verstärkung einstellen.

Beide funktionieren sehr gut, aber ich bevorzuge ein Aufnahmegerät.

Verwandte Themen