GNURadioでFMラジオを受信する(windows編)

Radio

RTL2838のUSBチューナーを使って、Windows10にGNUradio3.7をインストールし、FMラジオを動作させるまでの手順です。

安価なUSBチューナーでもGNUradioを使えば、何でも出来てしまうご時世には驚きです。

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

使用するチューナーは、RTL2838が乗ったUSBチューナードングルです。(商品リンクに掲載したチューナー2種で動作確認しています。)

同じICチップを使っているUSBチューナーの大半は動作するようです。

USB2.0 デジタル DVB-T SDR+ DAB+ FM HDTV TVチューナー 受信機 RTL2832U+ R820T2

GNUradioはバージョンに注意

GNUradioはマイナーバージョンアップでもかなり差異がありますので、インストールするバージョンには特に注意が必要です。

執筆時点でのGNUradio最新版はv3.8ですが、v3.7からシステムの根幹に関する多くの変更があるため、GNUradio3.7で作られた環境ではv3.8で動かないとのレポートがいろいろ出ています。

  • python2からpython3へ移行
  • GRCファイルの記録様式がXML形式からYAML形式に変更
  • gr-qtguiGUIがQt4からQt5へ変更
  • gr-comedi、gr-fcd、およびgr-wxguiモジュールのサポートが終了
  •  PyQwtベースのユーティリティはコンポジションから削除

特にGRCファイルの記録様式がYAML形式に変わっているため、GRCファイルをGNUradio3.8で読み込んで保存してしまうとGNUradio3.7で読み込めない形式に変換されてしまうのはとても困りました。

導入するバージョンは、使ってみたいソフト資産がどのバージョンで作られているかを良く調べてからインストールするのが良いと思います。

GNUradioの入手とインストール

GNUradioは、マイナーバージョンアップであっても内包するモジュールの互換性が乏しいため、必ずバージョンを確認してからインストールします。

ソフトウェアはGNUradioのgithubページからWindows用のinstaller版をダウンロードします。

とりあえず使ってみる場合は最新版をインストールしても問題ありませんが、過去バージョンのGRCファイルを使う場合は、GRCバージョンに応じたGNURadioを使うようにします。

またWindows版は違うバージョンを混在して動作させることは出来ないので注意してください。Linux版であるとDockerを使って、仮想領域により複数バージョンを動作させることは可能ですが、Linuxにかなり精通していないと難しいと思います。

(2022.8.14追記)GNURadioのDownload pageがgithub(標準)にまとめられることになりました。ダウンロード出来るバージョン情報は、https://wiki.gnuradio.org/index.php/Downloadに掲載されていますので、都度確認するようにしてください。

 

USBチューナーのドライバーをインストール

RTL-SDR用のUSBデバイスドライバーにはzadigを使います。

既にSDR#やHDSDRをPCにインストールしている方は、zadigドライバーのインストールは不要ですので、この手順は飛ばしてください。

Zadigのインストール方法は以前の記事を参照してください。

これだけでgnuradioのインストールは完了です。

gnuradioの起動と使い方

gnuradioの起動はWindowsマークから gnuradio-companionを選択します。

ファイル名を指定してから実行のダイアログで"gnuradio"と入力しても起動しないので注意しましょう。

スタートにピン止めしておけば、探さなくても起動できます。

GNUradioを起動すると次のような画面が出ます。xmlのモジュール関連でいろいろと警告が出ますが、特段の動作に支障が無いようなので、いまは放置しています。

虫眼鏡マークから"RTL"で検索するとRTL-SDR sourceが出ますので、ダブルクリックするとワークシート上にモジュールの貼りつけができます。

RTL-SDRをsourceを起点にして、後段に処理モジュールを付け加えていくことで、音声を発生させたり、データのファイル保存、ストリーミング配信までできます。

GNUradioの使い方は、箱を組み合わせていく形のフローグラフ形式となっています。

産業用で使うシーケンサのデザインツールや、FPGAのデザインツールとほぼ同じ使い勝手ですので、少しでもシーケンサやFPGAの設計経験がある方ならば、すぐ使えると思います。

GNUradioは、信号処理を短い記述で構築できるpythonでコーディングされていますが、言語を全く使わなくてもフローグラフは組めます。

標準で付属していない処理フローボックスは、pythonで記述して専用の処理モジュールを作ることもできます。

残念ながら、FPGAデザインツールのように、ボックスをダブルクリックしてモジュール内のpython/C++のプログラム言語編集までは出来ないみたいです。

GNUradioでFMラジオを製作する

GNUradioでFMラジオを作ると次のような形になります。

信号の処理フローは次の通りです。

  • 入力はRTL source 、Device ArgumentsはRTL=0と書く必要あります
  • 受信波のサンプルレート:1.536MHz (RTL2838は2.56MHzまでなので過大な設定は不可)
  • ローパスフィルターでナイキスト周波数をカットし、1.536MHzの1/4の384KHzにデシメーション(間引き)する。
  • FMデモジュレータで384KHz / 8 = 48KHzにデシメーションし、復調する。FM放送のディエンファシス(アナログ伝送の高音部強調)は日本の時定数50μsecに設定。(75μsecはアナログテレビ時代のプレエンファシス)
  • Multiply Constantでボリューム調整を行う。
  • Audio SinkでPCのスピーカから音声を出力する。
  • Wav File SinkをアクティブにするとWAVファイルに音声データをWAV形式(PCM 48KHz)で保存も可能。

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

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

  • QT GNU Chooserを使い近隣のFM5局を選択
  • QT GUI RangeでVolume調整とRFゲインはスライダー形式で表示
  • QT GUI Sinkで周波数アナライザを表示

GUI周りの設定は、情報が少なくて試行錯誤でしたが、やってみると簡単でした。

WBFMという処理ブロックを使ってFMを復調するサンプルファイルもありましたが、内部処理が良くわからずうまく動作しないときがあったので、より単純なFM DemodのほうがUbuntuやWindowsどちらでも安定して動くようです。

WFMで復調するとステレオになるのかもしれませんが、アナログ放送は枯れた技術なので、今回は深追いしないことにします。

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

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

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

選局を表示を変えたい場合は、QT GUI chooserの中身の設定を変更すれば、自由に変えられます。

ただし、QT GUI chooserは5個までしか選択できないので、いまは5局のみです。(GNUradio3.8だと10個まで選択できたような...)

サンプルファイルで慣れてみる

選局を東京と大阪の2つのバージョンにしたGRCファイルを作ってみたのでアップしておきます。

このファイルを修正しながらいろいろと遊んでみて下さい。

GNUradio FMtuner grc-file

GNUradioの汎用性は素晴らしい

昔は、ハードでトランジスタなどを組み合わせて作る必要があった無線検波回路ですが、トランジスタの伝達関数も計算しないといけないし、フィルタのRC,LC回路も部品集めが特に大変でした。

また、ハードの自作は部品購入における経済面の負担も大きく、学問レベルとしても相当ハイレベルのものでしたので、無線は趣味の王様と言われた時代がありました。

RTL-SDRを買って初めてgnuradioを使ったとき、昔のようなハードウェアを揃える苦労が全くなく、考えたフローグラフを組むだけで簡単にFM放送が受信できたので、かなり感動しました。(AMラジオは振幅変調なので数石のトランジスタで音声にできますが、FMラジオは周波数変調なので簡単には復調できない。)

GNUradioの記述言語には、pythonが使われており、いまどきの高効率言語です。学問や個人スキルとしての将来性も十分です。

今後、RTL-SDRで日本のワンセグ放送が受信できるとのことですので、チャレンジしてみたいと思います。なおフルセグ受信は、6MHzの受信帯域が必要なのでRTL-SDRでは受信できません、もう1クラス上のSDRplayという機種が必要だと思います。