我正在开展一项研究项目,该项目涉及使用Android设备记录社区噪音滋扰,以执行一些复杂的数字信号处理分析并计算一些指标。
我的主管指示我在将它们分发到社区之前校准Android设备的麦克风。我想知道是否有一种编程方式。
为什么要校准?
Android设备的麦克风的灵敏度可能与其他设备不同。即使是同一家公司的制造商也无法评论他们的敏感度。
所以很有可能,Android设备可以录制60 dB的声音,而另一台设备可以在相同的环境和条件下同时录制70 dB的声音。
我正在考虑以下几行 - >在安静的环境中录制,然后在嘈杂的环境中录制。可以根据需要调整增益。我还不清楚这一点。
是否有任何编程方式可以做到这一点?
非常感谢任何帮助。
答案 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.");
}
});
}
}
现在有两种方法可以调节麦克风的灵敏度。一种方法是使用校准的音频记录设备,第二种方法是产生已知值的声音。
测量手机麦克风和校准录音设备测量的音量,并调整增益。
产生已知值的声音并调整增益。
两者都很好用,但我更喜欢使用录音设备。