健康宝——呼吸频率部分开发(五)

声音强度


度量声音强度,就是分贝(decibel,缩写为dB)。这是一个无纲量的相对单位,计算公式如下:


分子是测量值的声压,分母是参考值的声压(20微帕,人类所能听到的最小声压)。因此日常中说道声音强度是多少多少分贝时,都是默认了一个很小的参考值的。
而Android设备传感器可以提供的物理量是场的幅值(amplitude),常用下列公式计算分贝值:

从SDK中读取了某段音频数据的振幅后,取最大振幅或平均振幅(可以用平方和平均,或绝对值的和平均),代入上述公式的A1。

声音检测类实现


采用系统自带的MediaRecorder实现,用它的无参方法getMaxAmplitude即可获得一小段时间内音源数据中的最大振幅。
代码为:

public class BreathRecoder {
public File myRecAudioFile;
private MediaRecorder mMediaRecorder;
public boolean isRecording = false;

public float getMaxAmplitude() {
    if (mMediaRecorder != null) {
        try {
            return mMediaRecorder.getMaxAmplitude();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return 0;
        }
    } else {
        return 5;
    }
}

public File getMyRecAudioFile() {
    return myRecAudioFile;
}

public void setMyRecAudioFile(File myRecAudioFile) {
    this.myRecAudioFile = myRecAudioFile;
}

/**
 * 录音
 *
 * @return 是否成功开始录音
 */
public boolean startRecorder() {
    if (myRecAudioFile == null) {
        return false;
    }
    try {
        mMediaRecorder = new MediaRecorder();

        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mMediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());

        mMediaRecorder.prepare();
        mMediaRecorder.start();
        isRecording = true;
        return true;
    } catch (IOException exception) {
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mMediaRecorder = null;
        isRecording = false;
        exception.printStackTrace();
    } catch (IllegalStateException e) {
        stopRecording();
        e.printStackTrace();
        isRecording = false;
    }
    return false;
}

public void stopRecording() {
    if (mMediaRecorder != null) {
        if (isRecording) {
            try {
                mMediaRecorder.stop();
                mMediaRecorder.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        mMediaRecorder = null;
        isRecording = false;
    }
}

public void delete() {
    stopRecording();
    if (myRecAudioFile != null) {
        myRecAudioFile.delete();
        myRecAudioFile = null;
    }
}
}

你可能感兴趣的:(健康宝——呼吸频率部分开发(五))