読者です 読者をやめる 読者になる 読者になる

Androidで騒音レベルと揺れの大きさを計測・ロギングする方法

f:id:shimobayashi:20130120122155p:plain

f:id:shimobayashi:20130120122202p:plain

こんな感じでロギングできます。 調査するのをめんどくさがってところどころでdeprecatedなメソッドを利用しているので注意。

参考:同期間におけるSleepTimeでの計測結果

f:id:shimobayashi:20130120122607p:plain

騒音レベルの計測方法

リアルタイムに音声解析をする場合、AudioRecordを使ってアプリケーションとは別のThreadを立てて実行することになります。

bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
        SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT, bufferSize);

みたいな感じで初期化して、

int read = audioRecord.read(buffer, 0, bufferSize);
if (read < 0) {
    throw new IllegalStateException();
}

int maxValue = 0;
for (int i = 0; i < read; i++) {
    maxValue = Math.max(maxValue, buffer[i]);
}

double db = 20.0 * Math.log10(maxValue / baseValue);
Log.d("SoundLevelMeter", "dB:" + db);

みたいな感じで読み取って、計算することになります。

詳しくはAurora/src/name/shimobayashi/aurora/SoundLevelMeter.java at master · shimobayashi/Aurora · GitHubをご参照ください。

デシベルの算出について

何気なく利用している音の大きさを表す単位であるデシベル(dB)ですが、 デシベル - Wikipedia にあるように実体は相対値であり、じゃあ基準値ってどうやって決めればいいんだよ、という問題がありました。

dBデシベルの話し 音の大きさに載っているように一般論としてこれくらい、みたいなのはあるんですが、じゃあ自分の部屋は図書館くらいだからこれくらいかな…とか調整するのもあまり現実的とは思えません。

Google Playを調べてみるとこの辺りどうやら市販の騒音計を使ってキャリブレーション済みの騒音計 - Sound Meter - Google Play の Android アプリがありました。

なので、室内の騒音を一定の状態にした上でこのアプリを利用して現在のデシベルを計測し、自前のアプリでもそうなるように基準値を設定することによって目的を達成することができました。ちなみに、SC-02Bで基準値は12.0になりました。

揺れの計測方法

加速度センサーを利用します。

ただし、そのまま利用しようとすると常に重力の影響を受けるため、加速度センサから重力の影響を取り除く - 明日の鍵にあるような方法で重力の影響を除去します。

そうした上で、

currentTremor = Math.sqrt(Math.pow(currentAccelerationValues[0], 2)
        + Math.pow(currentAccelerationValues[1], 2)
        + Math.pow(currentAccelerationValues[2], 2));

といった具合に原点(揺れがない状態である[0, 0, 0])から加速度センサーの各軸の値[X, Y, Z]への距離を計算し、この値を揺れの値として取り扱います。

ロギングする方法

Cosm - Aboutというセンサーの値を記録してグラフ化するためのサービスがあるので、これを利用します。

APIの設計が割りと良くて、取り扱いやすいのでおすすめです。

普通にHttpClientからJSONをPUT(実体はPOSTで_methodパラメーターにPUTを指定している)すれば記録されます。

というわけで

こういうことをやっているアプリをつくりました。 なんとなくいつもと違うネーミングをしたい気持ちだったので、ディズニーの眠れる森の美女のヒロインからとってAuroraという名前にしました。

shimobayashi/Aurora · GitHub

Androidで騒音レベルと揺れを計測してCosmに記録して、睡眠の振り返りをするのに利用したかったのでこういうことをしていました。

多分殆どのAndroid端末で動くと思うので、自分がどういう状態で寝ているのか知りたい人は動かしてみると面白いと思います。

はじめてのAndroidアプリ作成 センサー活用とクラウド連携

はじめてのAndroidアプリ作成 センサー活用とクラウド連携