前回は、RTL-SDRの受信データをグラフにするところから始めて、ウォーターフォールや周波数操作を追加しました。自作のSDR(Software Defined Radio)ソフト「AF-SDR」で、実際の電波が見えています。
見えているなら、聞いてみたい。
最初の依頼では対象外にしていたFM復調と音声出力を、今度はCodexへ頼みます。今回は、1.5.0でラジオとして鳴り始めてから、1.7.0まで使い勝手を整えた話です。
※Codexは、コードの実装やテストをAIに任せられるOpenAIの開発ツールです。制作環境は準備編にまとめています。
音が出るまでの方法は、Codexに任せる
追加の要求は、今ある画面をそのまま使うものでした。
現在のスペクトラムおよびウォーターフォール上で受信したいFM放送局の周波数を選択し、 受信したFM信号を復調して、Windowsの既定の音声出力デバイスからリアルタイムに音声を出力できるようにすること。
FM受信のON/OFFと音量調整も欲しい。それまでの受信・表示機能は維持してほしい。具体的な復調方法や音声出力の仕組みは任せ、最後に採用した処理を説明するよう求めました。
返ってきた1.5.0には、「FM音声(モノラル)」のチェックボックスと音量スライダーが付いていました。
周波数を選び、FM音声をONにします。これまで眺めていた画面に、聞くための操作が加わりました。
Codexの報告した処理は、受信データから必要な帯域を取り出し、位相の変化からFMの音声を取り出して、48 kHzの音声へ変換し、Windowsへ送るという流れです。放送側で強調した高音を元に戻す補正(ディエンファシス)も入っていました。
処理の流れは、FM受信機として一般的なものでした。ただ、データの間引きやサンプルレート変換を具体的にどう行っているかは、もう少し確認したいところです。
そこで前回と同じく、コードを変えず、今の実装を説明してもらいました。間引きの段数やフィルターの係数まで、実際のコードの値で説明を求めると、入力の速さごとの処理の流れが表で返ってきました。どう作ったかを後から聞ける状態なら、こちらも確かめやすくなります。
また、音を出す経路は、スペクトラム表示とは別の処理タスクになっています。画面を更新するたびに音声を作る構成ではありませんでした。
室内アンテナでも、ちゃんとラジオしてる
Codexは合成したFM信号での復調や、Windowsの音声出力へ無音を送る確認まで行っていました。ただし、実際の放送を聞くところは、こちらの出番です。
自宅の室内アンテナで受信できたのは、78.4 MHzと92.7 MHzでした。選局して、FM音声をONにすると、放送が聞こえます。
そのとき外部チャットへ書いた感想は、これでした。
ちゃんとラジオしてる
短いですが、ここはやはりうれしいところです。さっきまではグラフを描いていたソフトが、実際の放送を鳴らしています。
そして、使えると分かると注文の種類が変わります。次は「音を出して」ではなく、「使っていて気になるところを直して」です。
見たい範囲と、音にする範囲は別
1.5.0を使ってから、表示と受信条件をまとめて見直しました。
周波数は「78.4M」と入力できても、適用すると「78,400,000」に戻ります。前回は許容していた部分ですが、表示も短い表記にそろえたくなりました。
FFTの窓関数も、固定のHann窓から選択式へ。信号の強さを描く縦軸の範囲と、ウォーターフォールの色の範囲も調整したい。色がどのレベルを意味するのか、横に目盛りも欲しい。
さらに、FM受信に使う帯域幅「RxBW」を指定できるように頼みました。
ここでは、指示に一文を加えています。
表示帯域とRxBWは別の概念として扱うこと。
表示帯域は、グラフのどこまでを画面に見せるか。RxBWは、FMの音を取り出すために信号のどこまでを通すかです。画面を拡大しただけで、音声側の処理まで変わっては困ります。
1.6.0では、両方が別々の操作として並び、FM受信に使う帯域の境界も画面へ重ねられました。
画面に見せている幅の中に、FM受信で使う範囲が表示されています。右のカラーバーは、ウォーターフォールの色とレベルの対応です。周波数欄も「78.417425M」と短い表記になりました。
レベルの上下限を変えると、これから流れてくる部分だけでなく、すでに表示している履歴の色も変わります。過去のレベル値を保持し、設定に合わせて色を付け直す実装でした。
単に設定欄が増えたというより、画面の数字や色が何を示しているのかを、自分で調整しながら見られるようになりました。
設定を変えるたび、全部やり直さなくていい
もう一つ気になっていたのが、設定変更時のリセットです。
初期版では、周波数やFFT点数などを変えると、受信を止めて再接続していました。グラフを表示する段階では許容していましたが、ラジオとして使うと、表示側の調整で音声まで巻き込む構成が気になります。
そこで、何を残すかの表をこちらで全部書く代わりに、こう頼みました。
各設定変更がどの処理へ影響するかを判断し、 必要な範囲だけ更新すること。
ただし、古いデータが新しい設定の意味と合わなくなる場合は、必要なリセットをしてよい、と添えました。
Codexが1.6.0で整理した動作を、代表例で並べるとこうなります。
| 変えるもの | 変更後の動作 |
|---|---|
| FFT点数・窓関数 | FFTと表示履歴を初期化。受信とFM音声は継続 |
| FMのRxBW | FM復調状態と待ち音声を初期化。FFTと表示履歴は維持 |
| 表示帯域・レベル | 再描画・再着色だけ。受信や音声は継続 |
| 中心周波数・サンプルレート・RFゲイン | 接続を保持してUSB受信を一時停止・再開。必要な処理状態を初期化 |
全部を止めなくなった一方、意味の違う受信データは混ぜない。欲しかったのは、そういう操作感でした。
「何を残して何を捨てるか」まで含めて任せ、戻ってきた設計を確認します。ボタンやグラフを足す依頼から、ソフトの振る舞いを整える依頼へ進んでいます。
次に起動したときも、この状態で使いたい
調整できる項目が増えると、毎回それを設定し直すのも面倒になります。1.6.0を使ったあと、終了時の設定とウィンドウの位置・サイズを保存するように頼みました。
保存場所やファイル形式は指定していません。一方、保存した位置がモニターの外へ出てしまう場合を考慮することと、起動しただけで受信や音声再生が始まる状態は適切に判断することを伝えました。
1.7.0では、設定をユーザーごとのJSONファイルへ保存するようになりました。画面外へ出る位置は補正し、起動時は未接続・FM OFFにします。
前回の操作環境は戻す。でも受信を始めるかは、起動後にこちらが決める。この判断は自然でした。
同じ依頼では、ウォーターフォールの微妙なちらつきも調べてもらっています。
具体的な原因や改善方法はこちらからは指定しない。 描画バッファリング、更新方法、描画周期などを含め、 現在の実装を確認して適切に対応すること。
返答は「二重バッファリングは既に有効でした」。調査で再現したのは、履歴画像を二つに分けて拡大・縮小するとき、端数の丸めで行の位置がずれる問題でした。
履歴を一続きの領域として一度で描く方式へ変え、基準画像との比較でずれの解消を確認した、と報告されています。ここでは原因と検証方法が返ってきたことが大事でした。実機でのちらつきの確認は、完了報告では未実施と明記されています。
そこはこちらで確かめます。1.7.0を動かしてウォーターフォールを眺め、気になっていたちらつきが収まっているのを目で見て、問題なしと判断しました。
ラジオとして十分になってきたところで
外部チャットには、この段階でこう書いていました。
もうFMラジオとしての機能は十分になってきた
放送が聞ける。見たいところを拡大できる。帯域や窓を変えられる。次に起動しても設定をやり直さずに済む。
途中には使い勝手の気になる部分もありましたが、実際に使ってから注文するたび、道具として扱いやすくなっていきました。
ここで終えれば、自作のFMラジオができた話です。
ところが、次にCodexへ出したのは、デジタル変調信号を点群で見る「コンスタレーション表示」の要求でした。次回から、AF-SDRはラジオの先へ進みます。
ソース一式と最新バイナリー
AF-SDRとAF-SignalGeneratorのソース一式、現在の公開版はGitHubから利用できます。この記事は制作当時の記録で、最新バイナリーの内容とは異なる場合があります。導入条件と起動方法は最終回の配布案内をご覧ください。





コメント