第2回 超音波を出してみよう

超音波通信を行うために、超音波の送出は必要不可欠な要素です。
そこで今回は、Androidアプリで動的に音の波形を生成し、超音波の送出に挑戦してみました!

早速、実際に音の鳴っている様子をどうぞ!

18,000Hzは可聴領域外ですので動画では聞こえませんが、本当に鳴っているかどうかは次回以降の記事で解析していきますので、お楽しみに!

では、アプリの実装について詳しくみていきましょう。

 

アプリでの音の鳴らし方

Android SDKでは、音を鳴らすための様々なクラスが用意されています。代表的な3つを挙げてみます。

今回はアプリ内で動的に音の波形を生成するため、AudioTrackを使用します。

 

アプリ作成のポイント

いよいよアプリを作っていきます! アプリ作成におけるポイントは以下のとおりです。

  • アプリの入力欄から「音の周波数」「再生時間」を受け取り、音の波形生成に必要なパラメータを計算
  • 音の波形データをPCM 8bit エンコーディング形式の配列として生成
  • AudioTrackというクラスに波形データの配列を渡し、再生

それでは、各項目を詳しく説明していきます。

 

音の波形生成に必要なパラメータを計算

音の波形を生成するにあたり、必要はパラメータは以下の3つです。

  • 鳴らしたい音の周波数
  • 再生時間
  • サンプリングレート

このうち、周波数と再生時間を引数とし、サンプリングレートと、音の波形を格納する配列のサイズを決定する関数を作ります。
今回は以下の図のように、1周期の波形を4つのデータで表現するようにします。

波形

周波数 f (Hz) の音は1秒間に f 個の波があるので、この場合1秒間に 4f 個のデータが必要となります。すなわち、この 4f がサンプリングレートとなります。

1秒間で 4f 個のデータが必要なので、 t 秒間で必要なデータの個数は以下のように求めることができます。

周波数を f (Hz) 、再生時間を t (秒) とすると、配列のサイズ s は

s = 4ft

以下は実装例の一部となります。

 

音の波形を配列に格納

音の波形を格納するデータ配列も作り終えたので、矩形波になるように値を入れていくだけです!
今回、音のデータフォーマットをPCM 8bit エンコーディングとしたので、データ配列はbyte型を用います。
このとき、音の波形は128を中央値として、最大値が255、最小値が0として扱われますので、値の代入には注意が必要です!

以下は実装例の一部となります。

 

AudioTrackを使って再生

いよいよ大詰めです! AudioTrackのコンストラクタに必要なパラメータを渡しましょう。今回は以下のような設定値にしています。

鳴らすストリームタイプ AudoManager.STREAM_MUSIC
サンプリングレート 事前に計算した値
チャンネル設定 AudioFormat.CHANNEL_OUT_MONO
波形データのデータフォーマット AudioFormat.ENCODING_PCM_8BIT
AudioTrackの動作モード AudioTrack.MODE_STATIC

あとは、AudioTrack.write()で波形データを書き込み、AudioTrack.play()で再生です!
AudioTrackは再生満了時にきちんとAudioTrack.stop()をコールしてあげる必要がありますので、お忘れないよう! この実装は様々でしょうが、リスナーを付けて再生終了を監視するのがスマートかなと思います。

以下は実装例の一部です。

 

まとめ

ちょっと開発者向けっぽい内容になりましたが、いかがだったでしょうか?
今回作成したアプリでは、波形は固定パターンですが、任意の周波数を任意の時間で再生することができるようになり、超音波通信の実現に一歩近づきました!

次回は超音波の受信に挑戦します!
お楽しみに!!

Leave a Reply

メールアドレスが公開されることはありません。