RTL-SDRでワンセグ放送を受信する

Radio

ソフトウェア無線開発ツールのGNURadioと、汎用USBチューナー(RTL-SDR.COM)を使って、日本のワンセグ放送を受信することが出来ましたのでその手法を記事にします。

GNURadioのワンセグ受信フローグラフは、ウルグアイの学生さんが製作されたgr-isdbtという地デジ受信モジュールを使いました。

しかしgr-isdbtは、ソースコードで配布されているため、現状はubuntu上のGNURadioでしか動作しませんし、ビルド(コンパイルとインストール)も必要です。

本記事は、ubuntuに不慣れな方でもUSBチューナーを使ってワンセグ受信が楽しめるよう、環境の整備から順に解説してみました。

(追記)閲覧者様のご連絡で、githubに投稿されていたgr-isbtdにおいてrx_1seg_demoのソースを含む主要デコーダ部分が削除されていることが判明しました。残念なことに現在アップされている内容ではcmakeが通らず1segを受信することができない模様です。再度アップロードされることを期待します。

ハードウェア動作環境について

ワンセグ受信ができるUSBチューナーは、RTL-SDR.COMで動作確認しました。

2000円で買えるDVB-T+DAB+FMでも動作させてみましたが、チューニング時の中心周波数が少しずれているようで動画の受信が出来ません

筆者が保有する個体では、アンテナをRTL-SDR.COMの付属品に変えてもうまく受信が出来ませんでしたので、今回は非対応とさせていただきます。

PCスペックは、Ubuntu単体動作であればCeleron機(2コア)でも動きました。

しかし、Windows上のVMwareによる仮想環境ではそこそこのマシンスペックが必要です。

手持ちのPCで確認したところ、Core i7マシン(8コア, メモリ16G)は余裕で動作しましたが、PanasonicのCF-RZ4(Core-M 2コア ,メモリ4G)は、GNURadioのフローグラフ実行でエラーになりました。

動画作成時にPentiumG(2コア,メモリ8G)で動作させてみたところ、FMラジオの音声が途切れるのでこのスペックが下限のようです。

デスクトップで使うときは、USB延長ケーブルが必須なので、準備はしておいた方が良いでしょう。

少ない検証数からの想定ではありますが、VMwareにCPU2コアとメモリ4Gを割り振れる環境なら動くと思われます。

ソフト動作環境を準備する

gr-isdbtは、ubuntu上のGNURadioでしか動作実績がありませんので、Windows上にUbuntuをインストールや、UbuntuでGNURadioのインストールを参考にして、UbuntuとGNURadioの環境構築を行います。

Ubuntuのバージョンについて

Ubuntuのバージョンは、gr-isdbtの開発環境に合わせて、Ubuntu18.04LTSを使いました。

Ubuntu20.04LTSでも使えるようですが、周辺ソフトのインストール時に最新のバージョンが入ったりするため、ある程度のLinux操作スキルがないとビルドに失敗する可能性があります。

Ubuntuにあまり詳しくなく、ワンセグ受信を試してみるだけなら、本記事どおりに18.04LTSを使うほうが良いと思います。

GNURadioのバージョンについて

GNURadioはgr-isdbtの開発環境であったバージョン3.7をインストールします。

最新のGNURadio3.8はフローグラフの記述形式が違いますし、pythonのバージョンも違うので、相当に手をいれないとビルドできないと思われます。

ソースファイルをざっとみたところ、内部は信号処理の計算程度であるものの、GNURadioのビルド環境まで整えるのは、製作者でないと大変な労力が必要と思いました。

Windows上のVMwareで動作させる場合

Windows上のVMwareでubuntuを動かす場合、USB転送速度に制限があるためデータの転送が間に合わず受信ができません。

この場合は、Windows側よりrtl_tcpというアプリを使って、LAN経由でデータ配信することで正常に受信できるようになります。

対策方法の詳細はこの記事を参考にしていただき、事前にFMラジオなどの簡単なフローグラフが動作することを検証しておいてください。

ビルドに必要なソフトをインストールする

GNURadioのフローグラムのビルドや動画再生をするためには、gitやffplayなどのソフトが必要となりますので、あらかじめインストールしておきます。

git, cmake, swigのインストール

ソースコードの入手にgit、makefileの生成にcmake、pythonのリンクにswigが必要となりますので、superuser権限で順次インストールします。

$ sudo apt update
$ sudo apt install git
$ sudo apt install cmake
$ sudo apt install swig

動画再生ソフトのインストール

動作再生にはVLCやffmpeg(ffplay)がとても便利なので、こちらもインストールします。

$sudo apt install vlc
$sudo apt install ffmpeg

ソフトのインストールは以上です。

gr-isdbtを入手してビルドする

環境が整ったら、githubよりgr-isdbtを入手してビルドを行います。

ビルドする上での注意事項ですが、エラーを放置するとエラー発生時点からやり直しとなりますので、メッセージをよく見ながら注意深く進めるようにしてください。

$ git clone https://github.com/git-artes/gr-isdbt.git  →githubからソースを入手します
$ cd gr-isdbt 
$ mkdir build →コンパイル用のディレクトリを作ります
$ cd build
$ cmake ../ →環境にあわせたMakefileを生成します
$ make    →コンパイルします(時間がかかります)
$ sudo make install →コンパイルしたものをGNURadioへインストールします
$ sudo ldconfig →コンパイルしたライブラリ等をシステムにリンクします

swigは入っていなくてもエラーにはなりませんが、GNURadioでフローを実行したときにエラーとなり、かなりの手戻りとなりますので、swigを入れてからコンパイルしましょう。

特にエラーなく完了できればビルドとインストールは終了です。

ワンセグ受信のフローグラフを修正する

githubからコピーした~./gr-isdbt/examplesには、たくさんのサンプルファイルがありますが、1seg受信は、rx_1seg_demo.grcというフローグラフを使います。

1segのサンプルフローグラフは、日本の仕様と異なり、そのままでは動かないので、以下の値を修正します。

  • 入力ポート設定:osmocom Sourceにrtl=0を追記 (Windows上の仮想環境の場合は rtl_tcp=<ホストIPアドレス>:1234と入力)
  • Gurd Intervalの設定:OFDM Synchronization 1seg のGuard Intervalを1/8に設定
  • center_freqに地デジの周波数を設定:NHK Osakaなら539142(kHz), 朝日放送なら497142(KHz)などを入力します。

フローを修正してGNURadio上で実行するとQTの受信画面が出て、電波が受信出来ているとQPSKの受信状態などが表示されます。

以下の画像のようにQPSKの直行座標が綺麗に表示されたら受信出来ています。

ただし、RTL-SDR初期化の処理などにはバグも潜在しているようで、GNURadioの実行時にエラーになったり、直行座標が動かなかったりすることもあります。

そのときは、少し待って実行すると成功することもあるので、ビルドの失敗を疑う前に何度か試行してみてください

電波の受信とデコードが出来たら、動画ファイル(TSファイル)が生成されており、端末から以下のように入力すればワンセグ動画が再生できます。

このUSBチューナー用のワンセグ受信ソフトは、市販ソフトが無いので、なかなかの感動ものです。

$ ffplay test_out.ts

tsファイルはいろいろと制約があります

tsファイルは、先頭フレームが欠落するとうまく再生できませんし、ファイルをクローズしていなければ早送りなどのシーク操作もできません。

またメジャーな動画再生ソフトであるVLCでは音声が出ない等の問題もあります。(最新版のvlc3.0.16であると音が出るときがありますが、不安定です。)

tsファイルのままでは使いにくいので、tsファイルをmpegファイルに変換するとデジカメで撮影する動画ファイルと同様の取り扱いができるようになります。

$ ffmpeg -i test_out.ts -c copy test_out.mp4
$ ffplay test_out.mp4

チャンネル選局機能を追加する

チャンネル選局をいちいち数字で入れていては使い勝手が悪いので、FMラジオの製作でチャンネル選局した方法と同じやり方で、QTというGUIウィンドウを使って選局ボタンを追加してみます。

チャンネル周波数は、Wikipediaを使って、近くの放送局が使用しているチャンネル番号を確認し周波数表に照らし合わせて取得しました。

ストリーミング配信が出来るように改造

GNURadioは、UDPでネットワーク上にデータを出力することができるので、ストリーミング配信も出来ます。

UDP Sinkの処理ダイアログを作成し、File Sinkの入力を分岐接続して、以下の値を入れます。

  • IP Address: 127.0.0.1 →ファイアウォール設定が必要なのでローカル
  • Port: 2000
  • Payload Size: 1316 →188の倍数で1453より小さい値を設定
  • Send Null Pkt as EOF: Ture

実行をするとファイルの保存と並行してUDPで配信が実施され、ffplayを以下の通り実行すると90秒程度経過して映像が再生されます。

$ ffplay udp://127.0.0.1:2000

VLCでもストリーミング再生ができます。

Ubuntu版のVLCは、tsファイルの音がうまく出ないという制約がありますが、バッファリング時間が短く、ストリーミングのデータが出ているか確認には便利です。

サンプルフローグラフ

本記事で改造した日本のワンセグ受信用フローグラフをアップロードしておきます。

チャンネル選局は大阪近郊のみです。NHK選局ありと、NHK選局無しを作ってみたのでお好みでお使いください。

フローグラフの修正作業が面倒という方は、是非ダウンロードして使ってみて下さい。

GNURadio 1seg-Osaka-Japan (GRC File)
GNU Radio 1seg-Osaka-Japan lessNHK (GRC File)

おわりに

以外と簡単にRTL-SDRでワンセグが再生でき、GNURadioの汎用性には驚かされます。

またgr-isdbtはフルセグのフローグラフも付属しており、記載しているドキュメントによると海外では再生の検証が出来ているそうです。

あいにくRTL2832は受信帯域が2.5MHzなので、フルセグは受信できませんが上位機のUSRPやSDRPlayなどの広帯域チューナーならフルセグも受信できると思います。

もっともフルセグは暗号化されていますのでそのままでは再生できませんが、SDRplayを購入する機会があったら、フルセグ受信も試してみたいと思います。