GNURadioによる高性能AMラジオ受信ソフトの製作

Radio

GNURadioを使ってAMラジオを受信するプログラムを組んでみましたので製作方法を紹介します。

AMラジオは音声信号に搬送波を乗せた振幅変調なので、USBチューナーで波形を採取して、可聴周波数にデシメーション(間引き)するだけで簡単に聴くことが出来ます。

しかし、きれいな音で聴くことは意外に難しく、無線工学でお勉強するプロダクト検波方式(乗積検波)を使ったフローグラフ組むことにより、高品質の音声で聴くことが出来るようになりましたので、動作原理を含めて解説していきたいと思います。

今回使用するUSBチューナー

GNURadioでAMラジオを聴くためには、AM帯域(1,000KHz付近)が受信出来るチューナーとアンテナが必要になります。

使用するUSBチューナー

  • RTL-SDR.COM (direct sampling modeで使用)
  • HackRF one

RTL-SDR.COMは、direct sampling modeで受信するためRFアンプが機能しません。そのため、直径が大きいループアンテナ(+バリコン等の同調デバイス)を設置して受信利得そのものを向上させるか、別途RFアンプを接続したほうが良いと思います。

HackRF oneは、少し高価ですが全受信帯域でRFアンプが機能しますので、量販店で売っている500円くらいのミニコンポ用AMアンテナでもそこそこ良好に受信出来ました。

AMラジオ用中波アンテナ

アンテナは1,000KHzという中波長なのでループアンテナが必要です。

RTL-SDR.COMに付属していたVHF帯のダイポール用アンテナでは中波はうまく受信できませんから、ミニコンポ用の安い外付けアンテナを購入して接続しました。

購入したアンテナの端子はバラ線ですが、USBチューナー側はSMAとなっていますので接続には変換が必要です。

バラ線をSMAコネクタに変換するのはかなり大変なので、写真のようにダイポールアンテナの基台部分にバラ線を巻きつけて接続することにしました。

簡易な接続ですが、HackRF oneはRFアンプを機能させると実用レベルで聴くことが出来ました。RTL-SDR.COMはダイレクトサンプリングモードでRFアンプが機能しないため、アンテナの向きを変えてみたり、アンテナを高所に設置したりして、やっと聞き取れるレベルでした。

RTL-SDR.COMではもう少し大きなループアンテナかRFアンプが必要だと思います。

(追記)TECSUN AN-200というアンテナを購入したところ素晴らしい感度でした。価格も2,500円程度と安価でしたので、より安定して受信したい場合はオススメです。

GNUradioでAMラジオ受信のフローグラフを組む

AMラジオのフローグラフは下図のような形で組みました。

GNURadioチュートリアルの受信フローグラフも試してみたのですが、うまく復調できなかったため、無線工学の基本に忠実なプロダクト検波回路を試してみたところ、きれいに復調することが出来ました。

作成した信号の処理フローは次の通りです。

  • Device Argumentsを設定する: HackRF oneは「hackrf=0」、RTL-SDR.COMはQ input入力の「rtl=0,direct_samp=2」と記述する。
  • チューナーは、中心周波数を1.28MHz、受信波のサンプルレートを2.56MHz に設定して、AM放送帯域全体をサンプリングする。(サンプルレートは、HackRFとRTL-SDR.COMの両方で使えるように設定しています)
  • AM搬送波の除去をするためのCos波を生成する。生成するCos波のセンター周波数は「受信した中心周波数」-「受信局の周波数」として復調したい周波数に合わせています。
  • バンドパスフィルターを通して、復調するチャンネル周囲の周波数をカットする。(近隣に100kw級の強送信局が存在しなければ、このブロックは無くても大差無いと思います。)
  • 受信信号と生成したCos波をMultiply(かけ算)し、復調するチャネル部分の搬送波成分を除去する。(無線工学は三角関数や微積分を多く使います。数学でも大変なのにPC上で回路に置き換えるできるのはすごいなと思います。)
  • Low Pass Filerで2.56MHz / 80 = 32KHzにデシメーション(間引き)し、残った搬送波成分など可聴周波数を超える8kHz以上をカットする。
  • 中波のAM波は大気の状態で電界強度が変動するため、AGC(自動利得制御)で電界強度(AMは音量に該当)を一定にする。(このAGCはAMで効果大)
  • AMデモジュレータで32KHzの振幅信号を音声に変換する。Audio Passは5KHzとして突発的に発生する雑音を抑制をしておく。
  • Multiply Constantでボリューム調整を行う。
  • Audio SinkでPCのスピーカから音声を出力する。
  • Wav File SinkをアクティブにするとWAVファイルに音声データをWAV形式(PCM 32KHz)で保存も可能。

フロー内にあるQTというモジュールは、ウインドウ形式でユーザーからの入出力を行うGUIモジュールです。QTは直接信号処理には関与しませんが、状態を表示したり動作中に各種変数の設定ができるモジュールです。

今回は、QTを使って、選局・ボリューム・RFゲイン・周波数アナライザなどを可視化し、チャンネル選択まで出来るようにしてみました。

  • QT GUI Rangeで選局、Volume、RFゲインをスライダー形式で表示
  • QT GUI Sinkで周波数アナライザを表示

(参考)X-FIR Filterという搬送波除去の処理ブロックを使ってAMを復調するサンプルファイルで紹介されていますが、リファレンスどおりに設定してもうまく動作しなかったので、学問通りのAM復調フローグラフにしました。

AMチューナーを動作させる

組んでみたFMチューナーを動作させるとQTで設定した画面がポップアップで出てきます。

この画面でVolume、選局、RFゲインなどのパラメータが変更できます。

関西で受信していますので、スペクトラムアナライザには666KHz(NHK第一)、828KHz(NHK第2)、1,008KHz(ABCラジオ)、1,179KHz(MBSラジオ)の電波が受信できていることがわかります。センターにある1,280KHzは、USBチューナーのLO周波数ですので電波ではありません。

選局は9kHzステップに設定していますので、スペクトラムアナライザの画面を見ながら、マウスのホイールで選局することが出来るようにしています。

AM放送はアナログレベルで増幅することにより音質がかなり改善するため、RFゲインもスライダーに表示させることにしました。ただしRTL-SDR.COMのダイレクトサンプリングモードの場合は、RFゲインが機能しませんのでご注意ください。

またHackRF oneは安定して受信出来るようになるまで約1分必要です。HackRF oneの受信開始直後は、処理が重くてサンプリング処理が間に合ってないような感じです。そのため、受信直後は雑音が大きいので音量には注意してください。

サンプルフローグラフはこちら

フローグラフの保存形式はGNURadio 3.8です。

GNURadio3.8からフローグラフの保存形式が変更されており、GNURadio3.7では読み込めませんので注意してください。

GNURadioが入ってないPCでソフトを動かす方法

このフローグラフをGNURadioから、pyファイルに出力(Generate)することで、pyファイル単体で動作させることも可能です。

しかしpyファイルの動作には、GNURadioに含まれる多くのライブラリを必要としますので、GNURadio コマンドプロンプト上でしか動きません。

またGNURadioは、ラジオ開発環境であり、インストール容量が2Gバイト近くと極めて巨大ですから、一般のPCにGNURadioをインストールするのは躊躇してしまいます。

そこで単体動作するようpyファイルをexe化をします。

exe化することにより、GNURadioのライブラリが1ファイルに結合されるので、zadigドライバーさえインストールすればどのPCでもAMラジオが動作するようになります。exe化の手順はこの記事を参照してください。

exe化すると以下のようなexeファイルが生成できます。

exeファイルをダブルクリックすると、GNURadioで実行した状態と同じ動作になり、ウィンドウを閉じるとプログラム終了となります。

これでドライバーのZadigさえ入れておけば、どのPCでもAMラジオの受信が出来るようになりました。(Zadigのインストール方法はこちら

exe化することでかなり便利に使えますが、デメリットもあります。

  • exeファイルの大きさが大きい(GNURadioでQt GUIを組み込むと90Mバイトくらいになる)
  • 起動に時間がかかる(ファイルサイズが大きく読み込みに時間がかかる)

しかしGNURadioをインストールするよりは、遥かにPCのリソースを消費しないので、それに比べれば大した問題ではないかもしれません。

pyファイルを編集して常用出来るソフトにする

そのままexe化しても十分に使えますが、筆者はSDRを複数持っているので、SDRデバイスを選択できるよう改良をしてみました。

改良箇所は次の通りです。

  • コマンドラインの引数からSDRデバイス名を入力できるようにした
  • 引数の設定はバッチファイルで自動入力にした
  • SDRデバイスごとにバッチファイルを作成した

この改良により接続したSDRに合わせたバッチファイルをダブルクリックするだけでAMラジオが楽しめるようになりました。キーボードを触らずソフトを起動出来るので誰でも楽しめますね。

プログラムの修正箇所は詳述しませんが、ソースファイルはexeファイルに同梱して頒布しますので、興味のある方は中身を確認してみてください。(84Mバイト)

(ご紹介)当ブログで作成したプログラムが多くなってきたため、ダウンロードページにまとめました。

今後の予定

今回は、AMラジオがきれいに受信できるフローグラフの作成と、exe化でどのPCでも作成したGNURadioのプログラムが動くように出来ました。

今後は、別記事に記載しているFMラジオ自動予約録音ソフトに組み込んでAMラジオも予約録音できるように機能アップしていこうと思います。