如何校准Android设备的麦克风

时间:2016-07-12 22:10:53

标签: android audio signal-processing recording calibration

我正在开展一项研究项目,该项目涉及使用Android设备记录社区噪音滋扰,以执行一些复杂的数字信号处理分析并计算一些指标。

我的主管指示我在将它们分发到社区之前校准Android设备的麦克风。我想知道是否有一种编程方式。

为什么要校准?

Android设备的麦克风的灵敏度可能与其他设备不同。即使是同一家公司的制造商也无法评论他们的敏感度。

所以很有可能,Android设备可以录制60 dB的声音,而另一台设备可以在相同的环境和条件下同时录制70 dB的声音。

我正在考虑以下几行 - >在安静的环境中录制,然后在嘈杂的环境中录制。可以根据需要调整增益。我还不清楚这一点。

是否有任何编程方式可以做到这一点?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

经过一番研究,我终于找到了一种校准Android手机麦克风灵敏度的方法。

下面给出了使用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.");
            }
        });
    }
}

现在有两种方法可以调节麦克风的灵敏度。一种方法是使用校准的音频记录设备,第二种方法是产生已知值的声音。

测量手机麦克风和校准录音设备测量的音量,并调整增益。

产生已知值的声音并调整增益。

两者都很好用,但我更喜欢使用录音设备。