2016-07-12 3 views
2

나는 복잡한 디지털 신호 처리 분석을 수행하고 일부 메트릭을 계산하기 위해 안드로이드 장치를 사용하여 커뮤니티 소음을 기록하는 연구 프로젝트를 진행하고 있습니다.안드로이드 장치의 마이크로폰을 교정하는 방법

관리자가 지역 사회에 배포하기 전에 안드로이드 장치의 마이크를 보정하라고 지시했습니다. 프로그래밍 방식의 방법이 있는지 궁금합니다.

보정 이유는 무엇입니까?

안드로이드 기기의 마이크 감도는 다른 기기와 다를 수 있습니다. 같은 회사의 제조업체조차도 감도에 대해 언급 할 수 없습니다.

안드로이드 기기는 60dB에서 사운드를 녹음 할 수 있으며, 다른 기기는 동일한 환경 및 조건에서 동시에 70dB의 사운드를 녹음 할 수 있습니다.

다음과 같은 라인을 생각해 보았습니다. 꽤 복잡한 환경에서 녹음을하고, 잡음이 많은 환경에서 녹음을했습니다. 게인은 필요에 따라 조정할 수 있습니다. 나는 아직도 이것에 대해 명확하지 않다.

프로그래밍 방식으로이 작업을 수행 할 수 있습니까?

이 문제에 대한 도움을 주시면 감사하겠습니다.

+0

[외부 마이크 장치를 보정하는 방법] (http://stackoverflow.com/questions/38336768/how-to-calibrate-an-external-microphone-device)의 가능한 복제본 방금 거의 동일한 질문을했습니다. . 어쩌면이 부분의 세부 정보를 이전 부분에 추가 할 수 있습니다. – hotpaw2

+0

예. 내가이 질문을 게시 한 이유는 안드로이드 스마트 폰의 마이크를 교정하기 때문입니다. 레코딩을하기 전에 환경에서 마이크를 자동으로 교정하는 스크립트를 작성해야하므로이 질문은 다른 질문과 다릅니다. – aditya

답변

0

일부 연구를 마친 후 마침내 Android 휴대 전화의 마이크 감도를 보정하는 방법을 찾았습니다.

다음은 안드로이드의 MediaRecorder 클래스를 사용하여 진폭을 dB 값으로 생성하는 코드입니다.

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."); 
      } 
     }); 
    } 
} 

이제 마이크의 감도를 조정하는 두 가지 방법이 있습니다. 한 가지 방법은 Calibrated Audio Recording Equipment를 사용하고 두 번째 방법은 알려진 값의 소리를 생성하는 것입니다.

휴대 전화의 마이크와 보정 된 오디오 녹음 장비로 측정 한 dB 단위의 볼륨을 측정하고 게인을 조정하십시오.

알려진 값의 사운드를 생성하고 게인을 조정하십시오.

둘 다 정말 잘 작동하지만 녹음 장비를 사용하는 것이 더 좋습니다.

관련 문제