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アンプが必要だと思います。

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(かけ算)し、復調するチャネル部分の搬送波成分を除去する。(信号処理は入力信号に搬送波(Sin波)を乗じてから積分という信号処理ですが、Sin波は積分するとCos波なので、回路は計算と等価になるように組んでいます。)
  • Low Pass Filerで2.56MHz / 80 = 32KHzにデシメーション(間引き)し、ナイキスト周波数を超える8kHz以上をカットする。
  • 中波の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 AMtuner grc-file

フローグラフからpyファイルに出力して応用も可能

このフローグラフをGNURadioからpyファイルに出力すれば、pythonを使ったプログラムに応用することが出来ます。

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

アンテナはやはり同調できたほうがいいので、以下のようなもう少しマシなものを購入してみようと思います。