第3回 音波を受信してみた

超音波通信の実現に向け、第2回目では超音波送信の第一歩として、Android端末から音波を送信することに成功しました。
今回は、超音波受信の第一歩として、その音波を別のAndroid端末で受信することに挑戦します。

 

やりたいこと

一般的な通信は、送信側が情報を波形に変換して送り、受信側で受け取った波形を情報に戻すことで実現されています。

こうした通信を超音波で行うために、まずは第2回目で任意の周波数の音波を送信するアプリを作成しました。その音波を別の端末で受信して同じ波形を復元することができれば、超音波通信の実現にまた一歩近づきます。

そこで今回はそれが可能かどうか、次のようなAndroidアプリを作って検証したいと思います。

  • マイクで拾った音声をファイルに保存
  •  保存した音声ファイルを受信結果確認のために再生

 

アプリの作成

音声取得のために使うAPI


Androidアプリで音声を取得するにあたり、Android SDKでは次のようなクラスが提供されています。

最終的に私達が目指す超音波通信は、人の耳には聴こえない高い周波数帯の音波を使った通信です。しかし、MediaRecorderのサポートするファイル形式では、圧縮のためにそうした高い周波数帯の音が取り除かれている可能性があります。
そのため今回は、ほぼ無圧縮の音声データを取得できるAudioRecordを採用します。

初期化


AudioRecordクラスのオブジェクトを生成します。

今回は、モノラルマイクで拾った音を、サンプリングレート44,100HzのPCM16bit形式で保存するよう設定します。 音声データ受信用バッファのサイズは、別途提供されている計算用のメソッドgetMinBufferSize()で事前に計算した値を使用します。

音声データ受信・保存


生成したAudioRecordオブジェクトに対して、音声データ受信時に実行したい処理をsetRecordPositionUpdateListener()メソッドで登録します。

今回は、受信した音声データをWaveファイルに書き込む処理を登録します。Waveファイルの保存処理については、こちらのサイトを参考にさせて頂きました。

なお、最終的に超音波通信を行う際には、受信した音声データから音波を復元して情報を取り出す処理に置き換える予定です。      

再生


今回はMediaPlayerというクラスを使って、保存したWaveファイルを再生しました。

再生するファイルのパスを指定して、prepare() ⇒ start() の順にメソッドを呼ぶだけでOKです。

その他


その他、全体の処理は以下の通りです。

 

動かしてみた

音波送信アプリから周波数を上げながら音波を発生させ、今回作成したアプリで録音・再生してみた結果がこちらです。

10,000Hzでは、発生させたものと同じ音が再生されるため、音波を受信できていることがわかりますね。さらに、13,000Hz、15,000Hzと周波数を上げても同様に受信できていることがわかります。

ただ、18,000Hzでは可聴領域外のため、実際に音波を受信できているかどうか現段階では判別できませんね。また、受信したい音波だけでなく、周りの雑音や話し声も混ざっています。

 

まとめ

今回は、超音波受信に向けて通常の音波を受信できることを確認でき、超音波通信にまた一歩近づきました。

次回は受信した音声データを解析し、音波送信アプリで発生させた音波のみを取り出すと共に、可聴領域外の音波も受信できているかどうかを検証したいと思います!
お楽しみに!!

 

Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

Leave a Reply

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