LuaRadioというスクリプトベースのSDRツールキットがあることに気がつきました。GNURadioが超弩級のツールキットであることに対して、LuaRadioはとても軽量なのが特徴だそうです。少し試してみたところ、なかなか良さそうでしたので紹介します。
LuaRadioはその名のとおり、Luaというスクリプト言語をベースにしています。Luaは非常に軽量で、組み込み言語として使われていたり、小さなMCUでも動作したりしています。しかもJIT (Just In Time)コンパイラを利用可能で、実行効率はなかなかのもののようです。
LuaRadioは、Luaから使えるだけではなく、その中身もLuaで記述されているSDRツールキットです。コンポーネントをスクリプトで接続し、フローグラフを構築してアプリケーションを作成します。
こんな感じのスクリプトでFMラジオができるそうです。
LuaRadioは、LinuxやMac OSXで利用可能なようです。Mac OSXではhomebrewのformulaが提供されていましたので、今回はこれを試してみました。バージョンは0.5.0です。
$ brew update
$ brew install luaradio
依存関係で必要なfftwやlua本体などは自動的にインストールされます。 オーディオを再生するためにpulseaudioが必要なので、これは明示的にインストールします。
$ brew install pulseaudio
インストールが成功したらluaradioというコマンドが使えるようになっています。まずは動作環境を確認してみます。
$ luaradio --platform
luajit LuaJIT 2.0.4
os OSX
arch x64
page size 4096
cpu count 4
cpu model MacBookAir4,2
features
fftw3f true
volk true
liquid false
liquid-dspが入っていませんが、ここで示す例ではliquid-dspが無くても動作しました。別途インストールすることも可能です。
さっそく試してみます。サンプルファイルはgitリポジトリに入っていますのでこれも引っ張っておきます。
$ git clone https://github.com/vsergeev/luaradio.git
$ cd luaradio/example
$ ls
README.md rtlsdr_pocsag.lua
iqfile_converter.lua rtlsdr_rds.lua
rtlsdr_am_envelope.lua rtlsdr_ssb.lua
rtlsdr_am_synchronous.lua rtlsdr_wbfm_mono.lua
rtlsdr_ax25.lua rtlsdr_wbfm_stereo.lua
rtlsdr_nbfm.lua wavfile_ssb_modulator.lua
幸いにもRTLSDRを使ったFMラジオのサンプルがありますので、これを試します。ドングルを用意して実機に接続し、チューニングする周波数を指定して実行します。
$ luaradio rtlsdr_wbfm_mono.lua 82.5e6
グラフを表示するウインドウが二つ現れます。gnuplotによるスペクトラム表示のようです。肝心の音ですが、ザーっというノイズが出てきます。正常に受信できていませんが、ノイズが出るのは良い兆候です。
FMらしいザーというノイズなので、何か調整が足りないようです。調べてみると、チューナのLNAゲインが不足しているようです。チューナのAPIにautogainという設定があるのでこれを有効にします。スクリプトを書き換え、”{autogain = true}”を書き足します。
$ vi rtlsdr_wbfm_mono.lua
local source = radio.RtlSdrSource(frequency + tune_offset, 1102500, {autogain = true})
追記してから、改めてスクリプトを実行してみると、無事受信が成功しました。
負荷はそれほど重くはありません(Core i5 1.7GでCPU Loadが30%程度、4コアあるので全然余裕があります)。 この例ではgnuplotを使って復調と音声のスペクトラムを二つ表示するという余計なことをしているので、gnuplot表示を無くすと20%程度の消費となりました。
ハードウェアは、RTLSDRドングルの他に、定番のUSRPやhackrf, airspyや、sdrplayなどもサポートしているようです。ファイルやオーディオ、tcp/ipなどもサポートしています。bladerfがありませんが、soapysdrというモジュールを使うことで、他のハードウェアも合わせて使うことができるようです。
SDRというと、SDR#やGQRXのようなデスクトップソフトウェアが紹介されることが多いのですが、ソフトなのですから中身をコードとして触れることが肝心なポイントであり、中身に触れられないソフトウェアばかりでは大事な側面を見失います。ところがSDRのデファクトツールキットであるGNURadioはオープンソースではあるものの、その機能の豊富さと引き換えに中身の複雑さが度を過ぎています。gnuradio-companionという一見易しそうなパッチ環境はあるものの、いざその中身を触ろうとすると、言語レイヤがPythonとC++の2重構造になっている点や、C++とboostとSWIGの壁(バージョンの多さ、非互換な書式やバイナリ)に阻まれがちです。いつまでたってもGNURadioの入門書が登場しないのは、本質では無いところの説明が多量に必要になる(用意したとしてもあっというまに陳腐化する)からだと想像しています。
そんな状況においてLuaRadioのように実装が小さく、単一レイヤのSDRツールキットは、格好の教材になるのではないかと考えています。各種フィルタや簡単な変調復調など信号処理の機能は一通り含まれているようです。サンプルに含まれている例もシンプルなものが多く、気軽に取り組めると思います。まだ他で使用例を見かけたことがありませんが、「コードを書くSDR」に是非取り組んでみて頂ければと思うのです。LuaRadioはバージョン番号が若いのでまだ発展途上とは思いますが、今後が楽しみです。
リファレンス
- LuaRadioサイト https://luaradio.io/
- github https://github.com/vsergeev/luaradio
- liquid-dspのインストールはここが参考になる https://github.com/cjcliffe/CubicSDR/wiki/Build-OSX