The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

RTL-SDRが面白い その2

RTL-SDRをLinux(WSL)で使う

RTL-SDRをまず使ってみるには下記の記事で書いたようにWindowsの上でSDR#のようなアプリを使うのが簡単です。

tfitv.com

しかし、24時間常時稼働させたり、カスタマイズされた高度な信号処理をするとなるとLinuxのコマンドラインでの操作が必要になります。そこで、そうした環境や操作に慣れるために、本ブログでは「RTL-SDRが面白い その2」としてRTL-SDRをLinuxで動かすことに挑戦してみました。

-----------------------------------------

【ソフトウェアの関係】

WSL(Windows Subsystem for Linux)はWindows上でLinuxの仮想環境を実現できるマイクロソフトが提供する仕組みで、現在のバージョンであるWSL2ではLinux完全互換になっているようです。WSL2はWindows上の「仮想マシン」なので、PCのUSBポートに直接アクセスできませんが、usbipd-win というツールを使うと、Windowsを「USBサーバー」、WSL2を「USBクライアント」として、仮想ネットワーク経由でUSBデータを渡すようにできます。このようにWindowsとの連携もよく、軽快でちょっとした実験には便利なので、Linuxの環境として今回はこれを利用することにします。WSL2の上でLinux用のrtl-sdrツールやプレーヤーを使ってみるわけです。
使用するソフトウェアの関係は下図のようになります。

以下、WSL2、usbipd、FM放送受信のためのツールについて説明します。

 

【WSL2のインストールと実行】

WSL2は仮想化を実現するので、インストールする前にWindows側で下記のような確認が必要です。

  • Ctrl+Shift+Escで タスクマネージャー を開き、「パフォーマンス」「CPU」 で画面右下に表示される 「仮想化」「有効」 になってるかどうかを確認する。
  • 「無効」になっている場合、 PCを再起動し、「BIOS(UEFI)設定画面」に入り、「Intel Virtualization Technology」「SVM Mode (AMD)」 といった項目を Enabledに変更して起動する。

インストールするには、Powershellで wsl --install⏎ を実行します。
途中でLinuxの user account とPassword を設定するように求められます。

wsl -l -v⏎ で下のように確認できれば、問題なくWSL2がインストールされています。

起動するときは、wsl⏎ とだけ入力すると、下のようなプロンプトが出てLinuxの環境に変わっているのが分かります。

exitと打てば、Powershellに戻ります。

 

【usbipd-winのインストールと実行】

Windows 10/11に標準搭載されているWindows Package Managerであるwingetを使ってコマンドラインで winget install dorssel.usbipd-win⏎ を実行し、インストール後にPCを一度再起動します。

usbipd list⏎ で、USBにつながっているデバイスのbusidを確認できます。この例ではbusid 1-4にRTL-SDRがつながっています。
busidが確認出来たら、usbipd attach --wsl --busid 1-4⏎ で WSLにbusid 1-4を attachします。これでWindows側からUSBの制御が切り離され、起動中のWSL2(Linux)側にUSBがパススルーされるようになります。

 

【FM放送受信のためのツール】

RTL-STRは本来ヨーロッパなどの地上デジタルテレビ放送(DVB-T)用のテレビチューナーとして開発されたもので、それが持っている潜在的機能をテレビ受信以外でも利用するのです。そこで、ネットの記事を参考にして、
echo "blacklist dvb_usb_rtl28xxu" | sudo tee /etc/modprobe.d/blacklist-rtl.conf⏎ 
としてLinuxがRTL-SDRを「テレビチューナー(dvb_usb_rtl28xxu)」として自動認識しないように、ドライバを無効化しました。それを反映させるために、一度RTL-SDRをUSBポートから外して挿しなおすかPCを再起動します。その後、

sudo apt update⏎
sudo apt install rtl-sdr ⏎ でRTL-SDRの制御ツールをインストールします。

するとWSL2 側でUSBが認識できていることが確認できます。

 

FMを受信するためには、rtl-sdrの中にあるrtl_fmというコマンドを使います。rtl_fmが出すRAWのPCMオーディオデータをパイプで「音声を出すために使えるツール」に渡して再生します。
この音声を出すためのツールはいろいろあるので、いくつか試してみました。

◆ aplay (ALSAアーキテクチャ標準)

sudo apt update && sudo apt install alsa-utils
でインストールし、
rtl_fm -f 84.7M -M wbfm -s 200k -r 48k | aplay -r 48000 -f S16_LE
で試してみましたが、うまくいきません。

◆ play (sox パッケージ)

sudo apt update && sudo apt install sox libsox-fmt-all -y
でインストールして
rtl_fm -f 84.7M -M wbfm -s 200k -r 48k | play -r 48k -t raw -e signed-integer -b 16 -c 1 -
とすると、何か受信はできているのですが、プツプツ途切れ途切れでまともに再生できていません。

◆ ffplay (FFmpegパッケージに同梱)

sudo apt update && sudo apt install ffmpeg
とした後、
rtl_fm -f 84.7M -M wbfm -s 200k -r 48k | ffplay -nodisp -f s16le -sample_rate 48k -ch_layout mono -
と入力すると数秒おくれて再生が始まります。FM横浜の放送がクリアに受信できました。ゲインは自動で設定されるようですが、明示的に指定した方がノイズが減らせそうなので指定し、また、スペクトログラムを画面に表示するために次のように書き直して実行してみました。

rtl_fm -f 84.7M -g 35 -M wbfm -s 200k -r 48k | ffplay -f s16le -sample_rate 48k -ch_layout mono -

その状態で受信している様子を下に紹介します。コマンドラインの最後の行に受信のデータが表示されています。最初に聞こえるザーッという音は、ノイズではなく(笑)、「波」の音です。

youtu.be

尚、今回はやっと入手できた写真のダイポールアンテナを使っています。
FM横浜の波長は (3x10^8)/(84.7x10^6) = 300/84.7 = 3.54 (m)なので、片側を λ/4 = 0.89 (m) より少し短い程度にして実験しています。

以上、RTL-SDRをWindowsPC上の仮想的なLinux環境で使ってFMが受信できることを確認できました。
次はLinuxマシンであるRaspberry Pi で使ってみることにします。