USBワンセグチューナーでGNURadioを使う

USBドングルタイプのワンセグチューナーは、低コスト化のためにRF回路とA/Dコンバータなど電波受信のための最低限がハードウエア化されており、PC側のソフトウエアでデジタル復調やMPEG動画のデコード等を行う仕組みとなっている。つまり、PC側のソフトウエアをテレビ受信用からラジオ受信用に取り替えることでラジオの受信が出来るのだ。このようにソフトウエアでラジオを受信する仕組みから、SDR(Software Defined Radio)と呼ばれている。

PC側の受信ソフトウエアはオープンソースで幾つか開発されているが、中でもGNURadioはGUIでさまざまな機能ブロックを組み合わせて複雑な受信処理を構成出来たり、中間信号の波形やスペクトルを表示したり出来るなどの多機能さが特徴。

今回は、格安USBワンセグチューナーを用いてGNURadio上でSDRの構築を試みた。

スポンサーリンク

USBワンセグチューナーについて

USBドングルタイプのUSBワンセグチューナーは高い確率でRealtek社製チップを搭載しており、このRealtek社のチップをターゲットとするrtl-sdrというプロジェクトで現在も活発にドライバソフトの開発が進められている。自分が購入したUSBワンセグチューナーもRealtek社製チップ搭載の以下の物。

このUSBワンセグチューナーはRF段にFC0013というチューナー用チップが搭載されていて、rtl-sdrのページによれば22MHz〜1100MHzの範囲を受信可能。そして、メインチップのRTL2832Uにはダウンコンバートされた中間周波数の信号を数MHz帯域幅でA/D変換してUSB経由でPCに送られる。

GNURadioはUSBワンセグチューナーのハードウエアを直接コントロールする機能は持っていないため、gr-osmosdrというモジュール経由でデータキャプチャを行う。

GNURadioのインストール

GNURadioはLinux, Mac, Windowsの各プラットフォームで利用可能。Linux, 特にUbuntuではapt一発で簡単にインストール可能。Windows版もインストーラにrtl-sdrのソフトウエアも同梱されているため基本的にはGNURadioのインストールさえ行えばOK。但し、各プラットフォームで若干の追加設定が必要だ。

GNURadio本体のインストール

Ubuntuは下記1行を実行すれば完了。

$ sudo apt install gnuradio gr-osmosdr

Windows版インストーラのダウンロードサイトへのリンクは以下。

一部のCPUでは特殊なアクセラレータを有効化したバージョンが使えるようだが、大抵の場合は”64-Bit Any CPU”のバージョンを選べば良いだろう。このインストーラを実行すればWindows版もインストール完了だ。

USBドライバのインストール(Windows版のみ)

Windows版はインストールしただけの状態ではUSBワンセグチューナーが有効にならず、自分の環境では以下の数ステップが追加で必要だった。

  1. USBワンセグチューナーをPCに挿す
  2. エクスプローラでGNURadioのインストール先フォルダを開く(C:\Program Files\GNURadio-3.7\binなど)
  3. zadig-2.4.exeを実行し、Zadigの画面で”Options -> List All Devices”を選択する
  4. Zadigのドロップダウンに幾つかデバイスが表示されるので、”RTL2832U”を選択し”Install Driver”ボタンを押す
  5. ドライバのインストールが始まるので、インストールが終わったらZadigのダイアログを閉じる

デバイスのパーミンションの設定(Linux版のみ)

Ubuntuの場合はインストール時に自動的にデバイスも設定されるのだが、一般ユーザー権限でrtl-sdrが使えるようにudevルールの変更を行う。まず、USBワンセグチューナーをPCに接続した状態でlsusbのコンソール出力から、デバイスIDを拾う。

Bus 001 Device 051: ID 0bda:2832 Realtek Semiconductor Corp. RTL2832U DVB-T

上記のような行が見つかったら、”0bda:2832″の値がデバイスIDだ。Ubuntu18.04の場合は、システムに自動でインストールされたudevルールが/lib/udev/rules.d/60-librtlsdr0.rulesに置かれている。この中から、上記デバイスIDと一致した行を探す。

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", ENV{ID_SOFTWARE_RADIO}="1", MODE="0660", GROUP="plugdev"

上記の記述をMODE=”0666″に変更してしまえばOK.
あるいは、上記のudevルールから/etc/groupを編集してplugdevグループにユーザーを追加するのでも良いかもしれない。

GNURadioを動かしてみる

フローグラフの作成

GNURadio Companionを起動すると、以下のような画面が現れる。

GNURadioではSource(信号源)とSink(出力先)を決め、その間に処理ブロックを挟むことによってさまざまな信号処理を実現する。SourceにはUSBワンセグチューナーなどのハードウエアのブロックは勿論のこと、ファイルデータの読み込みブロックや、サイン波などの波形生成ブロックなどが使える。Sinkはオーディオデバイスやファイル出力のほか、波形表示ブロックやスペアナ表示ブロックなどが使える。また、SourceとSinkを繋ぎ合わせた回路のことをGNURadioではフローグラフと呼んでいる。

最初なので、動作チェックを兼ねてUSBワンセグチューナーと波形ビューアーを直結してみよう。ツールバーの虫眼鏡マークをクリックして検索窓に”rtl”を入力するとモジュール一覧に”RTL-SDR Souce”ブロックが現れるので、ドラッグしてフローグラフ画面にドロップした状態は以下。

波形ビューアーは”QT GUI Time Sink”なので同様に右側のブロック一覧からドラッグ&ドロップでフローグラフに追加する。

中間の処理ブロックには入力と出力の両方が定義されるが、Sourceには出力のみ、Sinkには入力のみが定義されている。ブロックを接続するには、接続元ブロックの右側にある出力をクリックし、次に接続先ブロックの左側にある入力をクリックすれば良い。出来たフローグラフは以下のような物。

ブロックのパラメータを設定する

各ブロックをダブルクリックするとそれぞれのパラメータ設定ダイアログが表示されるので、適切なパラメータを設定する。RTL-SDR Sourceに指定する周波数は、受信可能なFMラジオ局などを指定すれば良い。

  • Variableブロック: samp_rateに1024000を設定
  • RTL-SDR Sourceブロック: Ch0: Frequencyに周波数を設定(例えば81.3MHzなら81.3e6とする)

Windows版の場合はこの他にRTL-SDR SourceブロックのDevice Argumentsにrtl=0を設定する必要があった。

他はデフォルトのままでとりあえずOK。

フローグラフを実行

アンテナ端子に適宜アンテナを接続した状態で、キーボードのF6キーを押すか、GUIの”Execute the flow graph”ボタンを押すとUSBワンセグチューナーからのデータ取得が開始されグラフに信号波形が描画される。

RTL-SDR Sourceに指定する周波数を変更すると、受信電波の強度に応じて波形の振幅が変化する事を確認出来る。

FMラジオを受信する

電波の受信が確認出来たので、実際にFMラジオを受信して聴いてみよう。作成したフローグラフは以下(ここからダウンロード可能)。

このフローグラフでは3つのブロックでFMラジオを実現している。

  • RTL-SDR Sourceブロック: 中心周波数81.3MHz、サンプリングレート1.536MHzでデータ取得
  • Low Pass Filterブロック:約100kHzの帯域幅に帯域制限&1/4ダウンサンプリングでサンプリングレート384kHzに変換
  • FM Demodブロック: オーディオ帯域幅16kHzでFM復調し48kHzにダウンサンプリング

復調したFMラジオの音声はAudio Sinkでオーディオデバイスから再生される。電波の受信状態が良ければ、非常にクリアに聴こえる。また、WX GUI FFT Sinkでダウンコンバートされた生の信号がスペクトル表示される。

まとめ

1000円を切る格安USBワンセグチューナーが、GNURadioで使えることを確認した。

GNURadioには様々なデジタル信号処理ブロックが最初からインストールされており、ブロックをドラッグ&ドロップでフローグラフに追加しマウス操作で繋ぎ合わせるだけで、簡単にFMラジオを作れてしまった。波形やスペクトルのビューアで信号をリアルタイムにグラフ表示出来るため、デバッグもやりやすいと感じた。

ブロックのパラメーターを正しく設定するためにはデジタル信号処理の知識があった方がベターな感じだが、プログラムを一切書く必要無いため、サンプリング定理やデジタルフィルタの基礎理論などごく基本的な内容さえ押さえれば使いこなせるのではないかと思う。

ダウンロード: fmradio.zip(FMラジオのフローグラフ)

コメント