📻

TBSKmodemの信号規格

2023/10/25に公開

音波通信システムのTBSKmodemで使う信号の規格をpdfにしたのですが、pdfはめんどくさいので書き直しました。原文はこちらにあります。
https://github.com/nyatla/TBSKmodem/blob/master/doc/TBSKmodem.pdf

TBSKmodem Rev3

2022-2023 nyatla.jp
https://nyatla.jp/

TBSKmodemは、空中の短距離音波通信システムです。専用の通信機器を必要とせず、スマートフォンやパソコンのオーディオデバイス、さらにはマイコンのアナログI/Oで動作します。実用的な最大伝送速度は1k bpsですが、エラー訂正機能や検出機能は備えていません。

この文章では、TBSKmodemの変調方式、信号型式、複変調手順、および実装について説明しています。

概略

TBSKmodemは、TBSK変調方式を使用して、低ビットレートの近距離デジタル伝送を行います。伝送性能は最大で1k Baudで、1ビット/シンボルを伝送します。代表的な伝送レートは80、160、320、480、960 bpsです。

他の方式と比較して、周波数ごとの情報量は少ないですが、周波数変換処理が不要であり、ビット列の展開演算や数ビットの精度の相関値演算で実装できます。復調の際、振幅信号を遅延検波し、相関値からシンボルを直接復元します。

搬送波は、特徴的な周波数帯域幅を持つトーン信号で、これを差分位相変調して情報を伝達します。この設計は、周波数の減衰特性が不明または不安定な媒体、送受信機でも伝送が可能になるようにされています。

トーン信号は、任意形状の振幅信号で構成されます。この振幅信号の形状としては、単一周波数の正弦波、矩形波、合成波などが使用できます。通常、これらの基本信号を広帯域に拡散させて使用しますが、そのまま使用することもできます。

振幅信号は、通信路上で空間と周波数帯域を占有します。多重化は通常、時分割以外には想定されていません。

TBSKmodemはエラー検出や訂正機能を持たないコネクションレス型の通信方式です。課題や衝突制御、コネクションに関する問題については、上位レイヤで解決することを前提としています。

信号型式

TBSKmodemの搬送波型式、シンボルの型式、変調、および復調方式について説明します。

搬送波型式

搬送波は、特徴のあるトーン信号をT秒の期間で区切った単位トーン信号で構成されています。特徴のあるトーン信号とは、一定の値を持たない信号です。


図. 単位トーン信号の例

単位トーン信号は連続しており、TBSK搬送波を形成します。単位トーン信号の形状は任意ですが、1つのTBSK搬送波内では、全ての単位トーン信号が同じ形状でなければなりません。

変調方式

変調方式について、TBSKmodemでは、単位トーン信号と、その位相を反転させた2つのシンボルを定義します。元の信号をシンボルP、反転した信号をシンボルNと呼びます。これらのシンボルの長さは、単位トーン信号と同じです。

図.PシンボルとNシンボルの例

シンボル値[n]は差動値です。隣接するシンボル[n-1]とシンボル[n]が同じ場合、その値は1になり、異なる場合は0になります。シンボルの値は、前後のシンボルである単位トーン信号の関係だけで決まります。異なる単位トーン信号を使用した搬送波でも、単位トーン信号の周期が同じであれば、同じシンボル値を得ることができます。

このシンボルは1ビットを1シンボルで伝送します。ボーレート(ボーレートは1秒あたりのビット数を表す)は、振幅信号の長さTの逆数で求められます。単位トーン信号の長さが10ミリ秒の場合、ボーレートは100 Baudとなります。

TBSKフレーム

デジタルデータの伝送にはTBSKフレームが使用されます。TBSKフレームは、TBSKmodemが信号の検出とデータの格納に使用するデータフォーマットです。

TBSKフレームは、信号の検出と同期を行うためのプリアンブル部と、実際のデータビット列を格納するペイロード部から構成されます。これらの2つのフィールドは連続して存在します。

このフレームは、cycle(サイクル)の規定値を4として構成されており、そのフレームレイアウトを示しています。

表.TBSKフレームレイアウト

TBSKフレームは終端を明示的に示しません。ペイロードの復調終了タイミングは、上位レイヤで定義された時間、または相関絶対値が特定の閾値を下回る状態が持続することで検出されます。

隣接するフィールド内では、シンボル値列は独立して定義できますが、シンボル列は前段のフィールドの終端に影響を受けます。シンボル列は差分値であり、隣接するフィールドのシンボルを参照するために使用されます。

プリアンブル部

TBSKフレームの始点を示すのはプリアンブル部のシンボル列です。プリアンブル部の構成長にはcycleというパラメータが影響します。

プリアンブルはn(bit)のシンボル値をn+1(sym)のシンボルに展開します。先頭に付け加える基準シンボルのため、シンボルの数は1増加します。

pythonで記述したシンボル列の生成コードは以下の通りです。

b=[1]*cycle
c=[i%2 for i in range(cycle)]
d=[(1+c[-1])%2,(1+c[-1])%2,c[-1],]
preamble=[0,1]+b+[1]+c+d

cycleの規定値が4で構成されたプリアンブルのシンボル列とシンボル値列を示します。
表. シンボル値(cycle=4)のプリアンブルレイアウト

シンボル列(cycle=4) = [N,P,P,P,P,P,P,N,P,N,P,N,N,P]
シンボル値列(cycle=4) = [0,1,1,1,1,1,0,0,0,0,0,1,0]

シンボル値は4つのサブフィールドに分かれます。

  • Prefix: 信号出力前のトレーニング値を含むフィールドで、通常は検出の対象ではありません。初期トレーニングまたは前処理に使用されます。
  • Positive: 信号検出およびパワー測定に使用されるサブフィールドです。同位相信号の連続した出力を含みます。信号の検出や信号の強度を測定するのに役立ちます。
  • Negative: 信号検出およびパワー測定に使用されるサブフィールドで、反位相信号の連続した出力を含みます。正位相信号とは逆向きの信号で、同様に検出やパワー測定に利用されます。
  • Sync: シンボルの同期位置を示すサブフィールドで、シンボルの同期位置を確定するのに使用されます。シンボル列の中でどこがシンボルの始まりであるかを示します。

PositiveフィールドとNegariveフィールドはcycleパラメータにより増減します。

ペイロード部

ペイロード部は可変長のビット列であり、ビット列の先頭からビット値をそのままシンボル値としてシンボルに変換します。バイト値の場合は上位ビットから順にビット値にします。

ペイロード部はプリアンブル部と連結されます。ペイロードの0番目のシンボルは、前段プリアンブル部の末尾のシンボル値との差分値となります。プリアンブル部の末尾シンボルにより、ペイロード部のシンボル列は異なります。

以下は8ビットのビットストリーム「b00101011」(0x2b)を、cycle=4のプリアンブル部に連結した様子です。cycle=4のプリアンブルは、末尾シンボルが「P」である点に注意してください。

表.ペイロードレイアウト

TBSKmodemは1 bit/symbolであるため、ペイロード部の伝送速度はボーレートと同じです。

ウォームアップ/クールダウン

音響装置に出力するために、ウォームアップ信号とクールダウン信号を追加します。ウォームアップ信号はTBSKフレームで変調された振幅信号の前に挿入され、クールダウン信号は後端に追加されます。

これらの信号には、変調された搬送波を送信する前に音響デバイスを定常状態にする効果があります。また、情報機器に搭載されたオーディオシステムで、音声信号の先頭と末端が正常に再生されない問題に対処するための機能も果たします。

表.信号全体のレイアウト

ウォームアップ信号とクールダウン信号に適した信号は、信号全体の範囲でシンボル長間隔で区切った波形の相関値が、連続して0に近いか、正になる信号です。信号はプリアンブルと類似していない振幅信号でなければなりません。プリアンブル信号波形と類似した振幅信号は、単位トーン信号の間隔で相関値を求めたときに、相関の絶対値が大きくなり、プリアンブルとして誤検出される可能性が高まります。

経験的に、ウォームアップ信号とクールダウン信号の期間は約30ms程度が適当です。

完成した信号を伝送するときは、デバイスのサンプリングレートに留意し、単位トーン信号を意図した期間で出力するように調整することが重要です。

変調復調手順

具体的なパラメータを設定して、変調復調手順について説明します。

信号の型式は、プリアンブルパラメータはcycle=4、ボーレートを80 Baud、単位トーン信号の形状はノコギリ波とします。データ部分以外に、30msのウォームアップとクールダウン信号を加えます。出力データの形式は、サンプリングレート8000Hz、8bit signedのPCMデータです。

以上の仕様で、4バイトのアスキーコード”TBSK”を伝送する振幅信号を作成します。

変調

変調処理では、ビット値列を振幅信号に変換する。以下の手順で行います。

  1. トーン信号の作成
  2. TBSKフレームの作成
  3. シンボル列とトーン信号から変調信号を作成

オーディオデバイスなどで再生可能な音声信号とするために、次の手順を加えます。

  1. ウォームアップ/クールダウン信号の追加

トーン信号の生成

音源のサンプリングレートが8000Hzで80 Baudでシンボルを転送する場合、1シンボルに割り当てられるサンプル数(tick)は、8000/80=100 ticksです。

ここでは100ticksで1周期となるノコギリ波を作成せいます。


図.ノコギリ波

単位トーン信号のtick数は、経験的に50 ticksから100 ticksが適切です。短すぎると相関値の品質が悪化し、長すぎると相関値の計算コストが上昇します。サンプリング周波数毎の代表的な値を以下に示します。

表.単位トーン信号の代表値

TBSKフレームの作成

この仕様のTBSKフレームは、プリアンブル部=14 symbols、ペイロード部=32 symbolsの合計46 symbolsです。

先にプリアンブル部のシンボル列を作成します。仕様により、cycle=4のプリアンブル部のシンボル列は[NPPPPPPNPNPNNP] になります。

次にペイロードのシンボル列を作成します。文字列TBSKを一文字づつASCIIコードのビット値にして、プリアンブル部の末尾がPであることを考慮し、ビット列を差動値のシンボル列に変換します。

表.TBSKを格納するペイロードのレイアウト

作成した2つのシンボル列を結合して、TBSKフレームのシンボル列が完成します。

表.TBSKを格納するTBSKフレームのレイアウト

シンボル列とトーン信号から変調信号を作成

TBSKの変調信号は、シンボル列の値を元に、単位トーン信号を正転又は反転して連結したものです。TBSKフレームのシンボル列の先頭から、シンボルがPならそのまま、Nなら反転した単位トーン信号を順番に連結していきます。

この結果、46 symbolsのシンボル列は、4600 ticksのPCMデータに展開されます。


図.展開前の値と展開後のPCM

ウォームアップ、クールダウン信号の作成

ウォームアップ、クールダウン信号は、相関性の無い信号が適しています。簡単な生成方法として、乱数値が利用できます。ここでは、XorShiftを使用して、240個のUINT8値を生成し、signdに変換し、0点を調整します。

信号は以下のPythonコードで生成できます。

""" https://ja.wikipedia.org/wiki/Xorshift
"""
def xorshift31(size=10,seed=299,skip=0):
    ret=[]
    y=seed
    for i in range(size):
      y = y ^ (y << 13)
      y = y ^ (y >> 17)
      y = y ^ (y << 5)
      y=y & 0x7fffffff
      ret.append(y)
    return ret
v=[(i%256)-128 for i in xorshift31(size=240)]


図.無相関信号

完成したTBSKmodem信号

変調信号の前後にウォームアップ信号とクールダウン信号を付け加えて、TBSKmodemの信号が完成します。以下は完成した信号全体の振幅波形です。

合計で5080 ticks 、8000 Hzサンプリングで635 msの信号となります。


図.シンボル、変調信号

復調

復調処理では、振幅信号をビット値列へ変換します。以下の手順で行います。

  1. 相関値分析
  2. Positiveサブフィールドの検出
  3. Negativeサブフィールドの検出
  4. 同期位置の決定
  5. プリアンブルの評価
  6. ペイロードの取得
  7. 終端の推定

これらは受信と並行して逐次処理処理する方式が効率的ですが、簡単のため、記録した振幅信号を処理する方式で説明します。復調元の振幅信号は、変調で作成した信号を使います。


図.復調元の信号

相関値分析

振幅信号からシンボルを求めるには、振幅信号(A)から振幅信号を、シンボル長(100 ticks)だけ遅延させた信号Bを作成し、振幅信号全体について、シンボル長の期間で相関値を連続して計算します。


図.振幅信号の相関値

計算した相関値は、[-1,1]の範囲を持つ時系列値です。

Positiveサブフィールドの検出

振幅信号の先頭から、相関値が連続して高い箇所を探索します。これはPositiveサブフィールドの部分に相当します。


図.Positiveサブフィールドの検出箇所

Negativeサブフィールドの検出

次に、Negativeサブフィールドの開始点を探索します。
Positiveサブフィールドに続いてNegativeサブフィールドが存在する場合、相関値は大きなギャップを伴って低下します。そのギャップが閾値を超えた時点で、Negativeサブフィールドが存在すると判定します。


図.Negativeサブフィールドの検出箇所

同期位置の確定

Negativeサブフィールドを進んでSyncサブフィールドに到達すると、相関値が正の値を取り、ピークを形成して再び負になります。このピークがシンボル境界のエッジであり、信号の同期位置となります。


図.同期位置の検出箇所

プリアンブルの評価

同期位置を基準に、PositiveサブフィールドとNegativeサブフィールドの品質を評価します。各サブフィールドの区間で、規定の期間と相関値が閾値範囲内にあることを確認します。品質が良好であれば、信号が存在すると見なしてペイロードの取得に進みます。そうでない場合は、Positiveフィールドの検出からやりなおします。


図.プリアンブルの評価箇所

ペイロードの取得

同期位置を基準にして、プリアンブルに続く相関値をシンボル長間隔で取得すると、相関値からシンボル値を得ることができます。シンボル値を8ビット単位で区切ってASCIIコードを復元します。


図.シンボル値の読取位置と相関値

精密に調整されていないオーディオ装置では、AD/DA変換に僅かな周波数ずれや変動があり、伝送が長時間(概ね10k ticks以上)になるとシンボル境界が一致しなくなります。これに対応するため、ペイロードの受信中に同期位置を修正する必要があります。

ペイロードのシンボル値が反転するとき、相関値には勾配が発生します。この時、より相関値の高いほうに同期点をシフトすることで、同期点を追跡することができます。

正し、この方式はシンボルの反転しない信号では意味がありません。より強力に作用させるなら、上位レイヤでエンコーディングが必要です。

終端の推定

振幅信号が有限である場合、終端までシンボルを読み取ることで終端を確定できます。無限である場合は、相関値の絶対値が閾値を下回った時点で終端と仮定します。
クールダウン信号に無相関信号を使用することで、終端の確定を促進することができます。ただし雑音に対して脆弱であるため、終端は上位プロトコルで規定するべきです。


図.終端位置の推定

性能評価

主観による評価です。

通信速度

通信速度は、単位トーン信号を100 ticks以上で構成すると良好な結果になります。安定した通信環境であれば、50 ticksまでは正常な通信が確認できました。

100ticksで構成した単位トーン信号の場合、サンプリングレートが8kHzの場合80 bps、16kHzであれば160 bpsの通信速度が期待できます。外付けマイクとスピーカーの通信では、48kHz/50ticksの設定で、60cmの距離で960bpsの通信に成功しました。

通信距離

160 bpsの場合、通信距離は数m程度です。通信距離は、音響デバイスの再現性と、通信環境に左右されます。反響の多い室内での通信距離は、1m程度です。

環境特性

PC、スマートフォンに搭載されているマイク、スピーカー、外付けスピーカー、何れのデバイスを介しても通信ができます。また、インターネットを使用する音声通信アプリで中継しても、通信が成立しました。
組込機器の場合、圧電ブザー単体による送受信も不可能ではありませんが、受信については適切なアナログ回路が合ったほうが良いです。

ノイズ特性

通信路の空間ノイズ耐性は一般的なPSK通信と同等です。周波数帯域の一部に多少のノイズが混入しても問題はありません。スペクトラム拡散したトーン信号の場合は、伝送路で一部の周波数帯域が消失しても影響はありません。

エラー特性

音楽の録音再生性能がある音響デバイスならば、生活音程度のノイズではエラー発生しません。ランダムノイズはビット反転エラーとなり修復される場合もありますが、バーストエラーは同期位置を見失い、後続のデータが全て破壊され続けます。

実装

各言語向けにTBSKmodemの仕様を実装したライブラリとその特徴です。全てのライブラリは通信仕様に互換性があり、相互に信号を変調し、復調することができます。


図.ソフトウェア群の構成

コア実装

複変調演算処理の実装を持つコードセットでです。設計思想の異なるFullとMiniの系統があり、それぞれ多言語での実装があります。Fullはメモリや演算力が豊富なシステム向けの実装です。Miniは、メモリや演算力が制限されたシステム向けの実装で、整数演算のみを使用します。どちらの実装も、標準ライブラリ以外の外部ライブラリには依存しません。

Python

Full系統。Full系統のレファレンス実装です。
開発環境はAnaconda環境を推奨します。
オーディオライブラリはsounddeviceを利用します。

https://github.com/nyatla/TBSKmodem

Java

Full系統。マネージド言語のレファレンス実装です。APIはPython版を踏襲します。
演算実装のみで、オーディオライブラリには対応しません。
https://github.com/nyatla/TBSKmodemJava

C#

Full系統。純粋なC#の実装です。APIはJava版を踏襲します。
オーディオライブラリはNAudioを利用します。
https://github.com/nyatla/TBSKmodemCS

C++

Full系統。C++の実装です。APIはJava版を踏襲します。
演算実装のみ。オーディオライブラリには対応しません。
VisualStadio、Linux、Emscriptenのビルド環境がある。
https://github.com/nyatla/TBSKmodemCpp

Micro

Mini系統。C++とMicroPythonがあります。搬送波に矩形波を使用します。APIは同期式で他の実装と異なります。

MicroPythonの実装は、変調のみの実装です。
C++の実装はArudino環境で使用できます。メモリ管理機構は使用していません。
変調・復調が可能です。出力にGPIO、入力にADピンを使います。
RaspberryPi picoで動作実績があります。
https://github.com/nyatla/TBSKmodemMicro

ラップライブラリ

コア実装をラップして、環境に適したAPIを整備した実装です。

Processing

Java版をラップした実装です。Processing標準のSerialライクなAPIと、専用のModemAPIを提供します。オーディオライブラリはminimを使用します。

https://github.com/nyatla/TBSKmodem-for-Processing

Javascript

C++版をEmscriptenでコンパイルしてJavascriptAPIを整備した実装です。
WebsocketライクなAPIを提供する。スタンドアロン、npmに対応します。
オーディオ入出力にWebRTC/wasm/WebAudioを使用します。

https://github.com/nyatla/TBSKmodemJS

ライブデモ

Javascript版を用いたライブデモです。
Chrome/Edge/Safariなどのモダンブラウザで動作します。

https://nyatla.jp/tbskmodem/

Discussion