超長距離無線LoRaからローカル5Gまで!
GNU Radio×USRPで作るソフトウェア無線機

オープンソフト&ハードのモデルベース開発環境で始めよう


インデックス

今,一番お勧めのソフトウェア無線機の開発環境

ハードもソフトもオープンなSDR開発プラットフォーム“USRP”

コンピュータによる信号処理で無線機を作る時代

これまで,新しい変調方式の無線機を開発したり,通信機を高速・広帯域化したりするためには,まず専用ICを新規に設計し作る必要がありました.小規模のメーカや個人には,費用や工数の負担があまりにも大きく,技術的にも難易度の高いものでした.

ところが,パソコンを始めとするコンピュータ・デバイスの処理性能が格段に上がり,アナログ電子回路で行っていた変復調をソフトウェアで処理できるようになりました.その結果,通信アルゴリズムの研究や開発の効率が大きくアップしました.

コンピュータによる信号処理で構築する柔軟性の高い無線通信システムのことを“SDR(Software Defined Radio)”,または「ソフトウェア無線機」と呼びます.現在では,研究分野に留まらず,さまざまな通信機器に実装されつつあります.

世界中の無線研究者が愛用する“USRP”シリーズ

今からソフトウェア無線器を開発するなら,本稿で紹介するUSRP(Universal Software Radio Peripheral)シリーズを一番にお勧めします(図1).USRPは「普遍性のあるソフトウェア無線通信機器」という意味です.

USRPシリーズは,ソフトウェア無線機の黎明期からあり,世界中の研究者や技術者の定番になりました.Linuxのように,ハードウェアもソフトウェアもオープン・ソースなので,多くのノウハウが蓄積されます.情報源に不自由することは少ないでしょう.

図1 世界の研究者・開発者が愛用するオープンソース型ソフトウェア無線開発プラットフォーム USRPシリーズ(Universal Software Radio Peripheral)

開発は“Ettus Research社”

USRPのオリジナル・メーカは,米国西海岸で2004年に創業したEttus Research社です.当時から研究者向けのプラットフォームを開発する世界有数のSDRサプライアです.Digilent社は,そのSDR製品群のなかから厳選し,Ettusブランドで販売しています.

本稿では,USRPシリーズの中でも手ごろな価格帯の“B200”[図2(a)]と“B210”[図2(b)]を実際に動かして,ソフトウェア無線機開発のようすを紹介します.

(a)USRP B200 (b)USRP B210
図2 USBソフトウェア無線ユニット USRPシリーズ(Digilent社

ローカル5G実験局も構築できる

図3に示す動画は,基地局用と移動局用の2台のUSRP B210(図4)と3台のゲーミング・パソコン(Linux)を使って,5GHz帯のローカル5G通信システムを構築し,実際に動かしているようすです.実際,端末からYouTubeなどの動画を視聴することができます.

図3(動画) 2台のUSRPを使って構築した5GHz帯ローカル5G実験システム[開発:株式会社アイダックス]
図4 5GHz帯ローカル5G実験システムの2台のUSRP B210[左が端末(UE),右が基地局(gNB)]

図5に,このローカル5G通信システムの接続を示します.図6に示すのは本実験局の全体像です.

一番左側の液晶モニタに映っているのは,基地局のベースバンド処理のようすです.中央の液晶モニタに映っているのは,基地局のコア・ネットワーク制御のようすです.一番右側の液晶モニタに映っているのは,端末(移動局)のベースバンド処理のようすです.基地局と端末のぞれぞれが受信したQPSKコンスタレーションが確認できます

変復調処理は,MATLABでプログラミングしています.このような本格的な無線通信システムを構築すると,数百万~千万円以上の装置をあれこれ取りそろえることになりますが,USRPを利用すれば,そのコストを抑えることができるでしょう.

技術基準適合証明(技適)を取得する前だったので,不要な電波が放射されないように,送信(TX)と受信(RX)間は同軸ケーブルで接続し,さらにアッテネータ(ATT)を挿入しています.この実験局の開発には多くの工数がかかっています.

図5 USRPを使って構築した5GHz帯ローカル5G実験システムの接続[資料提供:株式会社アイダックス]
図6 USRPを使って構築した5GHz帯ローカル5G実験システムの外観

MATLABライクなオープンソースSDR開発環境“GNU Radio”

地デジやFMラジオなどすぐに試せる無線機ライブラリが充実

本稿では,まず手始めに,GNU Radioのプログラミングを容易にするグラフィカル入力ツール“GNU Radio Companion”(以下,GRC)を使ってソフトウェアFMレシーバを作ります.GRCは,MATLABと組み合わせて使うグラフィカル入力ツール Simulinkに相当するものです.

GNU Radioは,MATLABのようなモデルベース・プログラミング型のアプリケーションです.違うのは,Linuxと同様,オープンソースなので無料で利用できますが,サポートはありませんから,バグあっても,ソースコードを読んで解決しなければなりません.また,MATLABは自動車やロボットの設計など,広く利用されていますが,GNU Radioは無線に特化しています.

GRCは標準で,地デジやFMレシーバなどの信号処理ブロックのライブラリを備えていますが,それらを選んで並べて,組み合わせるだけでは,自分仕様の無線システムを開発することはできません.

自分仕様のカスタム無線機開発にパフォーマンスを発揮する

本稿では,超長距離通信が可能なLoRaレシーバの開発の過程を紹介します.

独自の暗号を使うLoRa無線機を始めとして,自分仕様の無線機を作るためには,C++言語でソースコードをゼロから記述したり,できあいのソースコードを探してきて改良する必要があります.そしていずれもビルドが必要です.

本稿では,Semtech社製のLoRaトランシーバ・モジュールで送信した電波をUSRP B210で受信し復調する処理をGRCで実現します.GRCの標準ライブラリには,LoRa無線機の信号処理ブロックはありません.

USRPのラインナップと開発環境

USRPシリーズのラインナップ

表1に,USRPシリーズのファミリを示します.

イーサネット対応の機種もあり,サンプリング・レートも速いのですが,価格もそれなりです.バス・シリーズ(USBタイプ)は比較的安価です.

表2に示すのは,普及機 USRP B200とUSRP B210のスペックです.受信範囲は70M~6GHzです.B200とB210の違いは,チャネル数とGPIO対応です.

表1 USRPシリーズのファミリ
表2 普及機 USRP B200とB210のスペック

図7に,B210の回路ブロックを示します.オプションで,GPSに同期した高精度な10MHzリファレンス・モジュール(Ettus Research製,図8)を搭載できます.このボード・マウントGPSDO(GPS Disciplined Oscillator)を搭載すると,同期信号を共有していない離れた2台の無線機間で,確実に通信することが可能になります.ただし,価格(288,781円)はB210以上です.

B210は,送受信回路を2チャネル同時に利用する場合は,サンプリング・レートの制限と電源容量に注意してください.

図7 USRP B210の回路ブロック 図8 USRP B210にオプション搭載できる10MHzリファレンス・モジュール

ケーシング

図9に示すのは,USRP B200のケース付き製品の外観です.USB3.0はType-Bです.ほとんどの場合でUSB給電で動作します.B210に付属するACアダプタはDC6V/4A品です.

加工が多少必要ですが,USRP B200もUSRP B210もタカチ電機工業製のアルミ・ケース(EXH11-3-16BB,3,560円)に測ったようにきれいに収まります(図10).図11はアクリル板に収めたところです.USRPを使っていることをアピールできます.

(a)フロント・パネル(受信専用のRX2端子とTX/RX兼用のSMA端子が見える) (b)リア・パネル(左から“GPS ANT IN端子”,“10MHz REF IN端子”,“1PPS IN のSMA端子端子”)
図9 ケース付きUSRPの外観(USRP B200)
図10 USRP B200/B210はタカチ電機工業製のアルミ・ケース“EXH11-3-16BB”とばっちりフィットする 図11 USRP B200/B210をアクリル・シールドに収めたところ

RFアナログ信号を処理する“AD9361”

USRP B200とUSRP B210の基板には,差動をシングルに変換するバランや送信(TX)と受信(RX)を切り換えるRFスイッチICが載っています(図12).RF信号を直接ベースバンドに変換する,汎用性と拡張性に優れたダイレクト・コンバージョン方式を採用しています(図13).

図12 USRP B200とUSRP B210の基板にはRF用のアナログ・スイッチICが搭載されている
図13 USRP B200/B210はダイレクト・コンバージョン式の柔軟性の高いソフトウェア無線機(参考サイト

1チャネルの送信と1チャネルの受信が可能なB200には AD9364図14)が,2チャネルの送信(TX)と2チャネルの受信(RX)が可能なB210には,AD9361図15)が搭載されています.

図14 USRP B200が搭載するRFアジャイル・トランシーバIC AD9364(送信1チャネル,受信1チャネル)の内部ブロック図 図15 USRP B210が搭載するRFアジャイル・トランシーバIC AD9361(送信2チャネル,受信2チャネル)の内部ブロック図

ハードウェアのドライバ・ソフトウェア UHD

USRPは,内部のハードウェアもホスト・コンピュータにインストールされるドライバ・ソフトウェア UHD(USRP Hardware Driver)もすべてオープンソースです.基板の回路図だけでなく,FPGAの内部回路情報,つまりHDL(Hardware Discription Language)も公開されています.

USRPのハードウェアのドライバ・ソフトウェア(以下,UHD)とソフトウェアAPIの機能は,USRPのハードウェアからホスト・コンピュータに,送受信信号(ユーザ波形)や,サンプリング・レート,中心周波数,ゲインなど,無線機のさまざまな制御パラメータの転送です.

図16に示すように,UHDは,GNU Radio,LabVIEW,MATLAB/Simulinkなど,業界標準のモデルベース開発環境下で動作します.汎用プロセッサ上で動作し,すべてのUSRP製品を使ったアプリケーション開発に利用することができます.

UHDコード(緑色)の大部分はオープンソースです.ライセンス・ポリシの詳細は,info@ettus.comに問い合わせてください.

図16 オープンソースのハードウェア・ドライバ UHD(USRP Hardware Driver)がUSRP内のFPGAとGNU RadioやMATLAB/Simulinkをインターフェースする

初めてのソフトウェア無線機制作

ソフトウェアFMラジオを作る

ソフトウェア無線開発の手始めに,USRPとGRCを使って,ソフトウェアFMラジオを作ってみました.1日あれば,作ることができるでしょう.

私が用意した開発環境を次に示します.

  1. USRP B200またはUSRP B210とアンテナ
  2. パソコン
  3. Core i5-4590T,2.0GHz,16Gバイトを搭載したパソコンでもOK(図17).Windows,Linux,Macなど,OSは何を選んでも問題ないが,Linux 20.04を使った
  4. オーディオ再生装置
  5. パソコンにBluetoothスピーカ(図18)をつなげば,ステレオ再生を確認できる.モノラル再生になってしまうが.パソコン内蔵スピーカでも問題ない
図17 USRPとGNU Radioを使ったソフトウェア無線機は廉価なミニPCで開発を始められる 図18 Bluetoothスピーカを使えばソフトウェアFMラジオをステレオで再生できる

GNU RadioのインストールとFMラジオ・ライブラリの読み込み

手軽にGNU Radioをインストールするときは,「バイナリ・インストール」がお勧めです.

図19に示すのは,GRC画面右端のCoreツリーの下から,標準の信号処理ブロックを選んで制作したソフトウェアFMラジオです.FM放送は広帯域なので,ワイドバンドFM復調ブロックを使用しました.FM復調の信号処理ブロックには,モノラル復調用の“WBFM Receive”とステレオ復調用の“WBFM Receive PLL”があります.

図19 GNU RadioのCoreツリーから呼び出して制作したソフトウェアFMラジオのプログラム

独自のソフトウェア無線機を作る

開発の流れ

GRCはLinuxでオリジナル・ソースをビルド

GRCには,FMラジオ以外にも地デジなどのライブラリが標準で備わっていて,呼び出すだけでソフトウェア無線機が完成します.

しかし,標準のライブラリにない独自の信号処理モジュールを制作したり,研究機関が公開しているインプリメンテーションを入手・実装したい場合は,Linux環境でソースコードをビルドします.詳細は後述します.

GNU Radioは,Linux環境下で開発が進められてきたため,Linux以外のOSを使うとトラブルに見舞われる可能性が高いでしょう.GRCを使うのなら,Linux上でソースをビルドする方法に慣れておくことをお勧めします.逆に,このように利用することで,GNU Radioを使う価値は何倍にもなるでしょう.

LoRaレシーバの制作に挑戦

GRCを使って,C++またはPythonで信号処理モジュールを制作してビルドすると,独自のソフトウェア無線通信機を作ることができます. ここで,LPWA(Low Powe Wide Area)通信の代表“LoRa”無線の実現例を紹介しましょう.

GRCのCoreツリーの中には,LoRa変復調用の信号処理ブロックはありませんから,独自で設計して,GRCに追加します.

LoRaの信号処理ソースコードを探す

スイスの工科大学が作ったソースコードが利用可能

LoRa無線の変復調信号処理を実行できるソースコードをゼロから制作し実装するのはかなりたいへんです.分厚い規格書を読み解くだけでも一苦労です.

動作確認ずみのソースコードを探し回ると,スイス連邦工科大学ローザンヌ校(EPFL)が開発した“LoRa PHY based on GNU Radio”を見つけました(図20).

EPFL校は,実際のLoRa無線機をリバース・エンジニアリングして,GNU Radio上で再合成し,ソース・コードを公開していました.EPFL校が開発したLoRa PHY信号処理ブロックのソース・ファイルを“Download:GNU Radio LoRa Implementation”からダウンロードしてコンパイルすると,Coreツリー外のOOT(Out of Tree)ブロックとして,GNU Radio環境下にインプリメンテーション(実体化)されます.信号処理に関する詳細は“Download:Revrese Engineering Report”に掲載されています.

図20 スイス連邦工科大学ローザンヌ校(EPFL)がLoRa変復調用のGNU Radio向けソース・コード“LoRa PHY based on GNU Radio”を開発して公開していることを突き止めた

GitHubにあったGNU Radio 3.8ベースのLoRa PHYソースコードで成功

GNU Radio 3.7ベースのLoRa PHYは,途中までインプリメンテーションを進めることができましたが,最終的にはコンパイルが通りませんでした.

私の場合は,GitHubに置いてあるGNU Radio 3.8ベースのLoRaインプりメンテーションを使うことでようやくインストールできました.参考にしたウェブ・ページは“GitHub Repository(Improved and updated to GNU Radio 3.8)です.

OSとGNU Radioのバージョンを選ぶ

ソース・ビルドに成功するか否かは,Linux OSやGRCのバージョンやその組み合わせが影響します.以下に,LoRa PHYのインプリメンテーションに成功したLinuc OSとGRCのバージョンの組み合わせを紹介します.

表3に示すのは,私が試したOSとGNU Radioのバージョンの組み合わせです.唯一成功した組み合わせは,“Linux 20.04”と“GNU Radio 3.8”です.Windowsから“VirtualBox”などの仮想Linux環境も試しましたがうまく行きませんでした.

LoRa PHYなど,他人が作った信号処理モジュールをGNU Radioにインプリメンテーションするためには,ソース・ビルド・インストールが必須です.バイナル・インストールは,各ファイルに依存関係があるため,失敗したときに問題の解決が極めて困難です.

表3 “Linux 20.04”と“GNU Radio 3.8”の組み合わせでのみ,LoRa PHYソースのビルドに成功した

パソコンの推奨スペック

GNU Radioを使って,カスタム・モジュール(OOT)を追加するなど,独自のソフトウェア無線機を開発するなら,専用のLinuxマシンを準備するべきです.

第4~5世代のCore i5~i7,16Gバイトのミニ・パソコンなら3万円程度です.LoRaのような狭帯域リアルタイム通信くらいなら十分に可能です.

数十MHzの広帯域OFDM(Orthogonal Frequency-Division Multiplexing)でリアルタイム通信するような無線機を動かしたいなら,最新のCore i9マシンが必要でしょう.

GNU RadioにLoRa PHYをインプリメンテーションするまで

LinuxパソコンにGNU Radioをインストールする(Install GRC)

バイナリ・インストールはしない

Linux OS上で端末を開いて,リスト1のようにコマンドを入力すると,GNU Radioをバイナリでインストールできます.普通のアプリケーションをインストールするのと同じです.打ち込むコマンドが少なく簡単ですが,今回はこの方法は使いません.

sudo add-apt-repository ppa:gnuradio/gnuradio-releases-3.8
sudo apt-get update
sudo apt install gnuradio

リスト1 GNU Radioをバイナリ・インストールするときに入力するLinuxコマンド(Install GNU Radio : Binary)

ソース・インストールする

Linuxで端末を開いて,リスト2のようにコマンドを入力します.GNU Radioをソース・インストールします.GNU Radio 3.8をチェックアウトしています.「ビルド」の作業があるため,打ち込むコマントドの量は多くなります.

git clone https://github.com/gnuradio/gnuradio.git
cd gnuradio
git checkout maint-3.8
git submodule update --init --recursive
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3 ../
make -j3
sudo make install
sudo ldconfig

リスト2 GNU Radioをソース・インストールするときに入力するLinuxコマンド(Install GNU Radio : Source)

USRPのハードウェア・ドライバ“UHD”をビルド&インストールする(Install UHD)

リスト3に示すコマンドを打ち込みます.量が多いので,コピー&ペーストしてください.

リスト3 USRPのハードウェア・ドライバ“UHD”のビルドとインストール(Install UHD)
画像をクリックするとテキスト・データが表示される.Ettus reserch社のウェブページを参照のこと

USRP B200シリーズ内蔵FPGAのイメージをインストールする(Install FPGA image)

リスト4リスト5に示すコマンドを入力して,デバイス管理ツール“Udev”をセットアップし,FPGAのイメージ(配線情報をもつバイナリ・データ)をインストールします.

cd /usr/lib/uhd/utils
sudo cp uhd-usrp.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

リスト4 デバイス管理ツール Udevのインストール(Set up Udev for USB)
sudo /usr/local/lib/uhd/utils/uhd_images_downloader.py 

リスト5 USRPに搭載されているFPGAのイメージをインストール(FPGA image download)

Linux上での環境構築(Install LoRa)

“PATH”をエクスポートする

同じターミナル上でGNU Radioを開く前に,リスト6に示すコマンドを入力して,パス(PATH)をエクスポートします.

入力する“PATH”で,設定した“PYTHONPATH”にフォルダ“lora_sdr”があり,“LD_LIBRARY_PATH”にファイル“libgnuradio-lora_sdr.so”があることを確認します.これらは,パスを提供するために必要なファイルとフォルダです.

export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3/dist-packages
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

リスト6 パスを切る(PATH)
GRC実行前に必ずPATHをエクスポートする

LoRa PHYをコンパイルしてGRCを実行

次にリスト7のLinuxコマンドを入力してLoRa PHYソースをコンパイルします.

copy Folder to /home/radiun   
cd /home/radiun/gr-lora_sdr-master
mkdir build
cd build
cmake ..  
make
(sudo) make install
sudo ldconfig 

リスト7 LoRa PHYをコンパイル(Compile LoRa PHY)
1~2行目の“gr-lora_sdr-master”フォルダをデスクトップに置くと実行できない

リスト8は,GRCを実行するコマンドです.2行のうちどちらかを実行してください.この例以外にもさまざまなサンプルがあります.上の行はLoRa信号をUSRPで受信するときに入力してください.下の行は,送信(TX)-受信(RX)ループバック・シミュレーションの際,USRPを使用しないときに入力してください.

gnuradio-companion /home/radiun/gr-lora_sdr-master/apps/single_user/lora_RX.grc
gnuradio-companion /home/radiun/gr-lora_sdr-master/apps/single_user/tx_rx_simulation.grc

リスト8 GNU Radioを実行する(exec GNU Radio)

インストール成功!

インストールが成功すると,LoRa PHYの信号処理ブロック内の文字が黒で表示されます(図21).失敗して使用できない場合は文字が赤で表示されます.

グレイ色の部分は,私が追加した信号モニタ用のブロックです.これらは“Core”ツリーの下にあり,波形や変数を観察するためのものです.

グレイ色になっている理由は“Disable”に設定しているからです,“Enable”にすると,他の有効ブロックと同じ見た目になります.

図21 LoRa PHYの信号処理ブロック(信号処理ブロック内の文字が黒くなればインストール成功.赤いときは失敗)

ファームウェアをダウンロードしてLoRa受信動作スタート

実行ボタン[$\blacktriangleright$]を押すと,UHDが起動して,B200とB210のファームウェアとFPGAイメージがロードされます(図22).

その後,受信動作が開始され,モニタ機能が有効になっていれば,画面上にそれらが表示されます.USRPのRX入力にSemteck社のLoRaチップをつないで実際のLoRa信号(921.5MHz)を入力しています.

上の例ではFFTスペクトラム・アナライザである“QT GUI SINC”を“Enable”に設定します.

C++のソースコード内に“print文”を追加しているので,右のターミナルに各信号処理ブロックの処理結果(変数値)が表示されています.

/tr>
図22 UHDを起動してUSRPにファームウェアをダウンロードすると,LoRaの受信が始まる

LoRaの変復調処理のソースコード

図23に示すフォルダ(gray_decode_impl.cc)にC++のソースコード(/gr-lora_sdr-master/lib/gray_decode_impl.cc)が置いてあります.これはグレイ・デコードの信号処理部分で,ソースコードの後半に信号処理の実態が記述されています(図24).

“#ifdef”で囲まれた部分は,デバッグ時に変数の内容をターミナルに出力する記述です.

これらのソース・コードを編集して,[cmake]-[make]-[make install]でコンパイルすると,信号処理ブロックに反映されます.

図23 LoRa変復調を処理するソースコードのありか 図24 LoRa変復調のソースコード(図23)のグレイ・デコード処理部を拡大

GNU Radioの基本的な使い方,データ型,ストリームとベクトル

図25GNU Radioのウェブ・ページには,GNU Radioに関するより詳しい情報がありますが,とりあえず“Installing”(図26)と“Tutorials”(図27)を参照することをお勧めします.インストールでつまづいた場合も,このページが参考になるでしょう.QPSKやOFDMなど変復調信号処理の実装例や独自の信号処理ブロック“OOT”の作り方の詳細も記載されています.

図25 GNU Radioのウェブ・ページ 図26 インストールの方法は“Installing”コーナの情報が参考になる
図27 変復調信号処理の実装例や独自の信号処理ブロック“OOT”の作り方は“Tutorials”コーナが参考になる


(c)2022 Takashi Kato All Right Reserved.