信号が欲しいので、発生器も作る。AF-SDRと見たかった軌跡【第4回・最終回】

信号が欲しいので、発生器も作る。AF-SDRと見たかった軌跡【第4回・最終回】 デスクトップアプリを作らせてみた

FMラジオとして使えるようになったAF-SDRに、前回はデジタル変調信号の表示を追加しました。ここで欲しくなったのは、同じ条件で何度でも試せる入力です。

まず、以前SDR#(SDRSharp)で保存したIQ WAVを掘り出しました。そこから、条件の分かった信号を自分で作る「AF-SignalGenerator」が生まれます。

そして最後に、表示されたものを見て「欲しかった軌跡はこれではない」と、もう一度注文することになりました。今回はAF-SDR 1.10.0から1.12.1までと、独立した信号発生器1.0.0の話です。

※Codexは、コードの実装やテストをAIに任せられるOpenAIの開発ツールです。制作環境は準備編にまとめています。

昔の受信データを、今のソフトへ入れたい

持ち出したWAVは、聞くための音声を保存したものではありません。受信した信号をIとQの二つの成分で保存した、IQ WAVです。これを入力にすれば、受信機の代わりにファイルから同じデータを繰り返し流せます。

Codexには、いきなり実装する前に、実物を調べるよう頼みました。

SDR#で記録したこのIQ WAVをAF-SDRの入力として受信・再生できるようにして。今後SDR#と互換性を持たせたいので、まずファイルを解析して仕様を決めて。

返ってきたのは、ファイル形式の説明だけではありませんでした。再生、一時停止、シーク、ループといった操作に加えて、記録した中心周波数と、その中で選局する周波数を分ける仕様までできています。

こちらが外部チャットへ書いたのも、「ファイル仕様だけではなくこれに沿ったアプリ仕様まで攻めてきた」でした。

仕様を読んだあとの指示は、短く済みました。

この仕様で実装して。

1.10.0で、IQ WAVが入力できるようになりました。今回のSDR#互換は、このファイル読み取りが対象です。録音機能やSDR#のすべての復調機能が加わったわけではありません。

AF-SDR 1.10.0で昔のIQ WAVを再生し、スペクトラムとI/Q表示へ渡している画面

入力が受信機からIQ WAVへ変わりました。右は、このファイルの信号をI/Q表示へ渡したときの点群です。

実際に表示を動かすと、それらしい動きは見えます。でも、解析側のbaudは初期値のままです。入力条件が分からない状態で、期待する形にならないことだけを理由に実装が悪いとは言えません。

そのときの感想が、「これは信号発生器はよ!事案だ」でした。

正解の分かる信号を、自分で用意する

今度は、表示へ入れる信号の条件をこちらで決めたい。方式も、シンボルレートも、周波数のずれも分かっていれば、設定を変えた結果を確かめやすくなります。

そこで「AF-SignalGenerator」を依頼しました。AF-SDRと同じ開発フォルダ一式に追加しますが、AF-SDRとは別の実行ファイルです。出力するIQ WAVは、いま作った入力機能で読み込めます。

要求には、こう書いています。

単なる理想信号生成だけではなく、周波数・シンボルクロックの誤差、 ドリフト、ジッター、AWGNなどを意図的に付与できるテスト信号発生器とします。

ずれのない信号だけでなく、少し周波数をずらしたり、時間とともにずれを増やしたり、雑音を加えたりしたい。きれいな点群が出るところから、条件を崩したときの動きまで試すためです。

この段階の指示は、第3回の一文とはかなり違います。変調方式ごとの選択肢、誤差の与え方、同じ条件の再現、設定の保存まで具体的に書きました。

たとえば、周波数が無関係な値へ飛び回るだけでは、見たい揺らぎになりません。ゆっくり変わるドリフトや、連続した揺らぎとしてのジッターを扱いたい。その違いも要求に入っています。

何をどう崩せば表示の確認になるかは、こちらが分かっていないと指示に書けません。シリーズの中で、専門知識がいちばん直接に効いたのはこの場面でした。

AF-SignalGenerator 1.0.0。左に方式と基本条件、右に周波数やシンボルクロックの誤差と雑音の設定が並ぶ

完成した信号発生器です。QPSK、9600 baud、10秒などの条件を指定し、IQ WAVを生成します。初期状態では誤差や雑音を加えない基準信号を作れます。

同じ乱数の種で条件を再現でき、生成条件や正解値などは付随するJSONへ記録します。受信側を試すためのソフトが、もう一本できました。

ただし、生成器にあるすべての方式をAF-SDRが専用解析できるわけではありません。8PSKなどの信号も生成できますが、専用の同期表示を受信側へ一斉に増やしたわけではなく、I/Q表示などで観察する範囲もあります。

ここまで来て、ようやく「この条件ならどう見えるか」を自分で試せる環境になりました。

点群を見ながら、数字を追い込みたい

条件を変えて信号を作り、AF-SDRへ読み込ませます。

点がまとまるのも気持ちいいですが、少しずれて動いているのを見るのも面白い。外部チャットには、こんな感想を残しています。

ビタッも楽しいがやっぱこれくらいでアニメーションする方もおもろい。

QAMの信号を作って眺めたときには、「QAMもおもろい。大人のおもちゃ箱だ」とも書いています。どんな画面だったのか、AF-SignalGeneratorで作ったQAMの信号を、後の版のAF-SDRで表示し直してみました。

64QAMの信号を、表示シンボル数256・軌跡ONでAF-SDRに表示した画面。8×8に並ぶ64個の点の間を線が行き来している

64QAMの信号を、表示シンボル数256・軌跡ONで表示した画面です。8×8に並ぶ64個の点の間を、線が行き来しています。

256QAMの信号を、表示シンボル数1024・軌跡ONでAF-SDRに表示した画面。16×16に並ぶ点の間を線が密に行き来している

256QAMの信号を、表示シンボル数1024で表示した画面です。点は16×16の256個になり、線も一気に密になります。

眺めているうちに、数字を入力して毎回「適用」を押すより、点群を見ながら少しずつ調整したくなりました。

1.11.0で追加したのが、手動の周波数補正、Fine Tuneです。数字の桁をクリックで選び、ホイールや上下ボタンでその桁を増減できるよう頼みました。直接入力もできます。

数字を変えると、デジタル解析側だけへ即時に補正が入ります。主画面の中心周波数やスペクトラムは、そのままです。

後の軌跡表示まで加わった版での操作例です。小数の桁を選び、補正を+99.8、+99.9、+100.0 Hzへ動かしています。数字を少しずつ変えながら、回転する点群と軌跡を見続けられる操作感は、動画の方が伝わります。

Codexの検証では、生成器で作った+100 HzずれのQPSKに対して、補正を99、100、101 Hzと変えたとき、推定残差が約+1、0、−1 Hzへ変わることを確認しています。既知の信号を作れるようにしたことが、次の機能の確認にも使われました。

実際に触った感想は、「ホイールでも動くし直接入力も自然」。その操作感を基準に、1.12.0ではSymbol Rate、つまり第3回のbaudと同じシンボルレートも桁を選んで調整できるようにしました。

こちらは値を変えるとデジタルの処理を組み直し、同期を取り直します。WAVの再生位置や主画面は維持します。何でも同じようにリセットするのではなく、変えた条件に応じた動作です。

ただ表示するだけだった画面が、見ながら触って試すものになりました。

「軌跡を付ける」では、まだ足りなかった

1.12.0では、点を線で結ぶ軌跡表示も頼みました。このときの指示は、はっきりしています。

・表示対象となっているSymbolを時系列順に線で結ぶ

Codexは、そのとおりに実装しました。点同士が線で結ばれ、QPSKなら四角形や対角線のような形が見えます。

ところが、できたものを眺めていると、どうも違う。

私が見たかったのは、ある点から次の点へ移る途中、実際のI/Q信号がどんな道を通るかでした。信号を整えるフィルターの設定(RRC α)を変えたとき、その途中の形が変わる様子も見たいのです。

シンボルを代表する点同士を直線で結ぶだけでは、その間の情報は出てきません。最初の指示は満たしていますが、その表示を見たことで、自分の欲しかったものとの差が分かりました。

ここはCodexが勝手に変なものを作った場面ではありません。こちらが頼んだ表示を見て、要求を具体化し直した場面です。

修正依頼では、次のように伝えました。

「I/Q(同期なし)」モードで軌跡ONの場合は、

Symbol判定点A
↓
Symbol判定点B

を単純な直線で結ぶのではなく、

その間に存在する表示用ベースバンドIQの 実サンプルを時系列順に結んでください。

既存のQPSKやQAMなどの専用解析は変えず、観察用の「I/Q(同期なし)」だけを改善する範囲に絞りました。

点の間に、見たかったものがあった

1.12.1では、フィルターを通したI/Qデータを表示用に再サンプリングし、代表する点と、その間のサンプルを同じ時間区間から描く方式になりました。

受信機の未処理データをそのまま全部描くわけではありません。観察用に整えたデータから、途中の動きを省かずに線にする処理です。

QPSKを二つの表示で比べると、見たかったものの違いが分かります。

QPSK専用モードで同期後の四点を線で結んだ表示。四角形と対角線が見える

最初に頼んだ、点同士を直線で結ぶ見え方は、QPSK専用モードの補助線として残っています。同期後の点群と、それを結ぶ線です。

QPSK信号をI/Q同期なしモードで観察した表示。四点の間を通る曲線状のI/Q軌跡が見える

こちらは修正後の「I/Q(同期なし)」です。代表点の間のサンプルも線で結ぶので、点同士の直線だけでは見えなかった曲がりや膨らみが現れます。

π/4 Shift QPSK信号をI/Q同期なしモードで表示した、八つの点の周りに花形に広がるI/Q軌跡

さらに、π/4 Shift QPSKを同じ観察用モードで見ると、こんな形になります。点の配置に加えて、点から点へ移る途中まで見る楽しさが出てきました。

専用モードでは、別の量を見る表示もそのまま残っています。既存の解析を残したまま、欲しかった観察の場所を作れました。

修正後の表示を見て、外部チャットへ書いたのは「これっすわ」でした。

専門知識が役に立ったのは、ここでもコードを書くところではありません。画面を見て、何の情報が抜けているかを考え、どのデータを見せてほしいかを伝えるところでした。

最後には、フルHDでの画面の収まりも確認しました。操作部の占める面積は気になりましたが、表示が致命的に潰れているわけではありません。さらに画面構成を作り直すところまでは進めず、ここで記事にすることにしました。

最初の仕様には、どちらのソフトもこの姿で載っていない

振り返ると、出発点は受信機をつないでスペクトラムを表示するだけでした。初回には、ウォーターフォールも、FM復調も、音声出力も、デジタル信号の処理も対象外と書いています。

それが、使ってみるたびに次の要求を出しているうちに、放送が聞けるようになり、デジタル信号を表示し、保存したIQを読み込み、その入力まで自分で作る環境になりました。

第1回の最初に、ある程度の専門知識が要るソフトをAIにどこまで任せられるか、と書きました。

実装は、かなりの部分を任せられました。同期の手法も、ファイル形式の解析も、方法は指定しないまま、この分野で筋の通ったものが返ってきています。

一方、専門的になるほど、こちらに残る仕事もはっきりしてきました。Codexが確かめられるのは、ビルドや合成信号での検証までです。実際の電波で確かめること、どんな条件の信号なら確認になるかを決めること、表示を見て何が足りないかに気づくこと。「これを追加して」だけでなく、「何を残して更新するか」「どんな条件で確かめるか」「その軌跡で見たいのは何か」を伝えるのが、途中からの私の仕事でした。

とくに最後の軌跡は、最初に言ったとおりにできたからこそ、次に何を頼むべきかが見えた例でした。

最終的なAF-SDRを最初から設計していたわけではありません。実装されたものを触っているうちに、作りたいものの方が増えていったのです。

途中で「大人のおもちゃ箱だ」と書きましたが、できあがった環境を表すなら、今もその言葉がしっくりきます。

AF-SDRと信号発生器をダウンロード

ソース一式と最新のWindows x64向けバイナリーはGitHubで公開しています。公開開始時点の版数はAF-SDR 1.12.1、AF-SignalGenerator 1.0.0です。

ZIPをすべて展開し、同梱の「README-ja.txt」に沿ってAF-SDR.exeを起動してください。.NET 9 Windows Desktop Runtime(x64)とVisual C++ v14再頒布可能パッケージ(x64)が必要です。RTL-SDRで受信する場合は、動作確認済みのドングル・アンテナ・USBドライバーも用意してください。IQ WAVファイルの再生にはドングルは不要です。

AF-SDRの配布ZIPには対応するソースコードも含まれます。AF-SignalGeneratorは別ZIPです。上記の最新バイナリー案内に、両製品のダウンロードリンクをまとめています。

RTL-SDRドングルがなくても、AF-SignalGeneratorで模擬信号のIQ WAVを生成し、AF-SDRで読み込めば、スペクトラムやコンスタレーションの表示、周波数補正などの動作を確認できます。

信号発生器のZIPもすべて展開し、AF-SignalGenerator.exeを起動してください。こちらも.NET 9 Windows Desktop Runtime(x64)が必要です。まずは出力先を指定し、「初期値に戻す(Golden Signal)」で基準信号の設定に戻してから「Generate」を押します。生成されたWAVをAF-SDRの「IQ WAVを開く…」で開いて再生し、デジタル信号表示をQPSK・9600 baud・RRC α=0.35にすると、基準信号を確認できます。詳しい操作は、それぞれのZIPに同梱した「README-ja.txt」をご覧ください。

制作中のCodexとのやりとり

今回の制作でCodexへ出した指示と、その回答を公開します。最初のスペクトラム表示から、AF-SignalGeneratorの作成、最後のIQ軌跡の調整までのやりとりです。

記事では抜粋した指示も、前後の流れとあわせて読めます。作ったものを見て、次に何を頼んだのか。詳しいやりとりが気になった方は、こちらをご覧ください。

AF-SDR制作中のCodexとのやりとりを読む

コメント

タイトルとURLをコピーしました