ARIB STD-T86(市町村デジタル同報通信システム、60MHz帯 16QAM TDMA-TDD)の OSS 受信デコーダ。 SDR# / SDR++ が流す I/Q を TCP で受け取り、復調 → 制御チャネル復号 → 通報検出 → S-Codec 音声デコードまでを行って、ブラウザのライブモニタに表示する。
実装は Go。外部依存は WebSocket ライブラリ 1 本だけで、音声の G.722.1 のみ ITU 公式 C ソースを ビルドして使う。
go build -o stdt86 ./cmd/stdt86
bash scripts/build_g7221.sh # 同梱 ITU G.722.1 をパッチ・ビルド → build/g7221/
pwsh scripts/build_g7221.ps1 # Windows 版(MinGW-w64 の gcc/clang が必要。MSVC cl は非対応)G.722.1 のビルドには C コンパイラと Python 3(標準ライブラリのみ)が要る。無くても制御チャネルの 復号とモニタ表示は動く(音声デコードだけ失敗する)。
デコーダは TCP クライアントとして繋ぎにいくので、SDR 側を待ち受けにしておく。 どちらの場合も起動したら http://127.0.0.1:8000/ をブラウザで開く。
同梱プラグイン contrib/sdrsharp-iq-tcp/ をビルドして Plugins\ へ入れると、右ペインに
"IQ TCP Server (cf32)" パネルが出る(詳細は contrib/sdrsharp-iq-tcp/README.md)。
チャネルへ同調して再生(▶)→ Start server。パネルに --fs へ渡す送出レートが出る。
./stdt86 live tcp://127.0.0.1:5555 --offset 0 --fs 64000 --fmt cf32プラグインは既定で選択中の VFO を 0 Hz へ落として間引いてから流すので、受信周波数を 変えたいときは SDR# のスペクトラムをクリックするだけでよい(デコーダは再起動不要)。
IQ Exporter(Network Sink)を TCP / Int16 で待ち受けにして、そのサンプルレートを
--fs に渡す。
./stdt86 live tcp://127.0.0.1:5555 --fs 192000 --fmt cs16| オプション | 意味 |
|---|---|
--fs |
サンプルレート [Hz](TCP ソースでは必須) |
--fmt |
cf32(SDR# プラグイン)/ cs16(SDR++)/ cu8 |
--offset |
チャネルのベースバンドオフセット [kHz]。同調済みなら 0(既定) |
--municipal-code / --seed |
スクランブル値。省略すると自動判定する |
--log-dir |
通報音声・I/Q の保存先(既定 logs/) |
--host / --port |
モニタの待ち受け(既定 127.0.0.1:8000) |
オフセットは固定で、起動後の再探索はしない(同調は SDR 側の仕事)。受信中の搬送波ドリフトは
CFO 追尾が吸収し、信号が 1 秒途絶えると CFO とスクランブル値を捕捉し直すので、別の自治体の
チャネルへ移っても追従する。録音ファイル(.wav I=L/Q=R、.cu8、.cf32)も同じように
./stdt86 live <file> で再生できる。
- 制御チャネル状態(市区町村・拡声通報中・使用スロット・製造者)と、復号した 104bit の全ビット表示
- 通報タイムライン(通報開始指示 0x22/0x23 〜 強制切断指示 0x30)と報知対象(一斉/群・個別)。 途中から受信を始めても検知するし、開始・終了指示を取り逃しても保険で開閉する
- 信号品質(コンスタレーション・CFO・EVM・CRC 一致率)とデコードログ
- 通報音声のストリーミング再生(🔊)と WAV ダウンロード
- 通報検知時の I/Q 録音(プリロール 5s、低レート 2ch int16 WAV)。保存したファイルは
./stdt86 live <file> --offset 0でそのまま再デコードできる - 実行中の切り替え: スケルチ、CFO 補正の ON/OFF と再捕捉、スクランブル値の手動固定
時刻は例外なく実世界の時刻で表示する(起動からの経過秒は出さない)。
seed = 市区町村コード下位 9bit。--municipal-code / --seed を省略すると受信開始から 1 秒ほどで
自動判定し、市区町村の候補を出す(廃止された旧市町村コードのまま運用している親局が実在する
ので、現行コード表と廃止コード表の両方から引く)。通報開始時の FACCH 番号通知(0x63) には完全な
16bit コードが乗るので、通報を 1 本またげば一意に特定できる。
電波が弱くて自動判定が安定しないときは、モニタが判定履歴を「値 / 回数 / 市区町村候補 / 最終判定 時刻」でまとめて出すので、そこから選んで固定できる。
通報区間の TCH バーストを伝送路 FEC(デインタリーブ → デパンクチャ → ビタビ → CRC7)で解いて G.722.1 へ渡す。実運用波の伝送路 FEC は規格 §5.4 の印字どおりでは復号できないため、残る自由度を 自己検査の CRC7 一致率を手がかりに受信波から同定した実装を使う。CRC7 が落ちたフレームと 取りこぼしたスロットは補間(PLC)してパイプラインは止めない。