空中で音波通信できるオーディオモデム
簡単に出来そうでなかなかむずかしい、空気中で安定して通信できるオーディオモデムを作りました。開発用のライブラリと、コマンドライン用のアプリケーションのセットです。
名前をTBSK modemといいます。通信速度は最大1kbpsと低速ですが、生活音環境下でも普通に使うことができます。
同様の音響モデムソフトウェアとしてはFSKを使ったminimodemなどがありますが、後述する方式の特性によりFSKとは違った利点があります。
http://www.whence.com/minimodem/
プラットフォーム
開発言語はPythonです。Linux/Windows/Macで動作するはずです。
オーディオデバイス関連を除く基本構造は標準ライブラリ以外に依存しません。
オーディオデバイスを利用する場合も、python-sounddeviceが動作する環境であれば、どこでも動くと思います。
性能
トーン信号長にもよります。通信速度は搬送波周波数の1/100 bit/sec、5~1kbpsくらいです。ビット化け等のエラーは、方式の特性で低く抑えられています。
通信距離は1mくらいまでを想定してください。
エラー訂正はありません。雑音によるエラーはバースト状に発生します。ビット反転エラーは非常に少ないので、やるならECCと再送で対処するのがよろしいと思います。
デモ動画では、距離30cm、48kHzの信号で、960bpsの伝送を試みています。
10KBのファイルを、3分ほど同期を維持しつつ、転送しています。
セットアップ
コマンドラインとライブラリは、pipでインストールできます。
$pip install tbskmodem : $ tbskmodem --version tbskmodem/0.1.0;3.8.10 (default, Oct 2 2022, 22:21:13) [GCC 9.3.0];Linux-5.15.57.1-microsoft-standard-WSL2-x86_64-with-glibc2.29 TBSK modem -- Trait Block Shift Keying modulation/demodulation library. : $
コマンドの使い方はこちらです。
TBSKmodem/tbskmodem.md at master · nyatla/TBSKmodem · GitHub
Getstarted
サンプルを含んだ全ソースコードは、githubからcloneします。
```sh
$git clone https://github.com/nyatla/TBSKmodem.git
```
tbskmodemのAPIは簡単です。
例えば、文字列を信号に変調するコードはこんな風に書きます。
def main(): tone=XPskSinTone(10,10) mod=TbskModulator(tone) src_pcm=[i for i in mod.modulate("からあげうまい")] #save to wave wav=PcmData(src_pcm,16,8000) with open("step3.wav","wb") as fp: PcmData.dump(wav,fp)
getstartedで基本的な使い方を学べます。
GitHub - nyatla/TBSKmodem: TBSK (Trait Block Shift Keying) modem
背景
従来の空中を媒体とした音響通信では、FSK等のうんぬんかんぬん....のようなもっともらしい理由は特になく。
別に研究していた音響OFDM通信システムのテスト中に面白い現象に遭遇し、まとめあげたのが本システムです。
もともと信号同期と検出に関する技術だったのですが、音響通信に適した堅牢な特性がありましたので、そのまま応用しました。
方式
TBSK(命名しました)というDPSKのお化けのような方式で信号を変調します。
TBSK (Trait Block Shift Keying)は、1種類の固定長の特徴のあるトーン信号とその反転信号でシンボルを表現します。これを連続で送信して、隣接するシンボル同士の相関値を遅延検波し、得られたピーク値をビットと表現して通信します。
トーン信号は、媒体を伝播するならどのような形でも構いません。標準では、スペクトル拡散したSin波を使います。代わりに普通のサイン波を使えば、それはDPSKと同じような動作になります。
この方式の利点は、周波数変換が不要なことです。シンボル相関値の計算のみで復調ができます。欠点としては、トーン信号長が長くなりがちな点です。安定性を求めると、100サンプル程度が必要です。