FMラジオをSDR(GNU Radio)で作ってみた

無線

SDRとは何ですか?

SDR : Software Defined Radioとは、ソフトウェア無線のことです。通常ラジオなどを受信するには、受信装置や専用の設計回路が必要です。その回路部分などをソフトウェア上で処理しようという趣旨のものになります。

GNU Radioとは何ですか?

GNU Radioは、ソフトウェア無線を実現するためのオープンソースの信号処理フレームワークです。GNU Radioを使用することで、柔軟性が高く再構成可能なハードウェアを使用して、さまざまな無線通信プロトコルを実装することができます。

GNU Radioの特徴

以下は、GNU Radioの主な特徴です。

  • オープンソース:GNU Radioは、オープンソースのフレームワークであり、自由に使用、配布、改変することができます。
  • モジュール性:GNU Radioは、複数のモジュールを使用して構成されており、独立した機能を実装することができます。
  • 再構成性:GNU Radioは、モジュールを組み合わせることで、さまざまな信号処理機能を実装できるため、再構成性に優れています。
  • 拡張性:GNU Radioは、外部モジュールをインポートすることで、機能を拡張することができます。
  • クロスプラットフォーム:GNU Radioは、Linux、Windows、macOSなど、さまざまなプラットフォームで動作します。

GNU Radioで信号を受信するには

GnuRadioでFMラジオを聞きたい場合、RTL-SDRドングルが必要です。これは、ソフトウェア無線のための低コストな受信機であり、USBポートに接続することで、信号を受信し、GNURadioに送信することができます。GNURadioを使用することで、RTL-SDRドングルを介して受信した信号をデジタル信号処理することができます。

Amazonで低品質なものなら1,000円ほどで売っています。高品質なものだと5,000円弱ほどです。低品質なものは使用しているとだんだん周波数がずれたりします。
これは使用している水晶(クリスタル)の品質によるそうです。ちなみに、いわゆるワンセグチューナーと同じようなものです。

GNU Radioのインストール

公式サイト:https://www.gnuradio.org/
インストールページ:https://wiki.gnuradio.org/index.php/InstallingGR

実装してみる

まずはモノラル出力

早速ブロックを組み合わせてGNU RadioでFMラジオを作っていきます。

モノラルでFMラジオを聴くだけなら、以下のようなシンプルなブロック構成で完成です。

  1. osmocom Source:RTL-SDRからの信号を出力するブロックです。このブロックで出力する周波数やGainを設定します(周波数は80MHzに設定)
  2. Low Pass Filter:FMラジオを聴くのに必要な周波数成分の取り出しを行います。FMラジオを聴くためにサンプルレート値2.4MHzの全てをサンプリング(標本化)
    する必要ありません。そのためLow Pass FilterのDecimation(間引き)機能を使って2.4MHz / 5 = 480KHzまで信号を間引きし、計算の負荷を抑えます。
    さらに、カットオフ周波数を50KHzに設定することで、80MHz+50KHz=80.05MHz以上の不要な信号をカットし計算負荷の軽減に寄与します。
  3. WBFM Receive:FMラジオとして可聴できる信号に変換するブロックです。FMラジオの帯域幅は一般的な無線機などで使われるナローFMに比べて帯域幅が広いため
    WBFM(ワイドバンドFM)と呼ばれています。
    ここでは先ほど480KHzまで間引きした信号を更に間引きし 480KHz / 10 = 48KHzまで間引きします。
    コンピュータのサウンドカードのサンプリングレートは48KHzになるので、これでちょうど合致することになります。
  4. Audio Sink:コンピュータのサウンドカードに主力するためのブロックです。

これで上段のコンソールパネルの再生ボタンをクリックすると、実際に80MHzのFMラジオを聴くことができます。

ステレオ出力に挑戦


しかし、この状態ではモノラル出力であるため、ステレオ出力にしてみましょう。
ステレオ出力にする方法はいたって簡単です。
WBFM ReceiveをWBFM Receive PLLブロックに置き換え、Audio SinkのNumInputsを2つにしてあげることでステレオ出力ができるようになりました。

GUIを加えてみよう

この状態で再生ボタンを押してもただ白い画面が表示されるだけです。

GNU RadioのQT GUIという機能を使うことで視覚的に様々なパラメータが変更可能になります。

  • パラメータの考え方
    各ブロックのプロパティには独自に設定したパラメータが設定可能です。
    例えば以下の画像では QT GUI Chooser のID値としてstation と命名しています。これをosmocom SourceのFrequencyに代入させてあげることで
    周波数を動的に変更することができるようになります。

完成形はこちら

パラメータやGUIを設定することができました。

ちなみにGNU RadioはPythonファイルを出力します。
Pythonファイルを作るためのツールという立ち位置になります。

興味のあるかたはぜひ触ってみてください。
このファイルをGithubに置いておきました
https://github.com/k-ishii1020/FM_Radio
GRCファイルをGNU Radioで読み取ることができます。

参考サイト・書籍

FB News ものづくりやろう! 第五回 GNURadioによる受信機の構成
https://www.fbnews.jp/202110/manufacturing/

トランジスタ技術編集部「RFワールド No.44 GRCで広がるSDRの世界」
https://amzn.to/3ZV9ajg

コメント

  1. へい より:

    初めまして、GNU Radioについて興味があり読ませて頂きました。
    早速、PC(Windows 10 64bit)にインストールを試みるましたが、どれをダウンロードしたらいいのか分からず困っています。
    もしよかったら教えて頂けないでしょうか?
    最終的にはdix100を接続したいと思っています。
    よろしくお願いします。

    • かず より:

      はじめまして。コメントありがとうございます。今調べてみたら、現在は直接exeファイルを配布していないのかもしれないです。(自分でコンパイルする必要あり?)
      DJ-X100と繋いで色々したい、との事でしたら、VMか使っていないマシンにDragonOSというものOSをインストールすると、最初からGNU_Radioがインストールされています。
      他の方のサイトですが、参考になさってください。
      http://mikioblog.dolphinsystem.jp/2021/06/sdrlinux-dragonos.html

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