Android/WindowsでSDRを試す

 一部界隈で話題のワンセグチューナを転用したSDR(Software Defined Radio)を試してみました。

 ワンセグチューナーなら何でも転用可能なわけではなく、SDR用に転用するにはRTL2832Uを採用したチューナーである必要があります。
 ※本来、RTL2832UはUSB2.0インタフェースを搭載したOFDM復調ICとしてカニさんマークのRealtekが販売している製品です。
RTL2832U DVB-T COFDM Demodulator + USB 2.0 | Realtek

 ワンセグチューナーをSDR化すると、ワイドバンドレシーバとして使えるようになります。ワイドバンドレシーバなので、普通のラジオでは聞けない周波数、例えば航空無線などが聞けたりします。さらに、音声に限らず航空機のACARSや船舶のAIS情報を受信し、ソフトウェアで処理することで航空機や船舶の位置情報を知ることができるようにもなります(Flightrader24やMarinetrafficのようなアプリの元ネタが直接受信できることを意味します)*1
 ということで、面白そうなので試してみました。
 

使用チューナー

 ZOXのDS-DT305BKを使用しました。

 DS-DT305BKを選定した理由はRTL2832U搭載で安かった以外にありません。Amazon等でRTL2832Uで検索すると他の製品も多く出てきますので、レビューなどを参考に好きなのを選べばいいと思います。
 

Android

 Nexus7(2013)で試してみました。基本的にUSBホスト機能があればタブレットでもスマートフォンでも何でもいいと思われますが、特殊な使用形態のため動作しない機種もあるかもしれません。
 DS-DT305BKを含めワンセグチューナーは基本的にフルサイズのUSB端子のため、Android端末のmicroUSB端子にはそのままでは刺さりません。OTGケーブルのようなUSB-microUSB変換アダプタが必要です。今回は、以下の投稿で紹介したアダプタを使用しました。
wave.hatenablog.com
 

Rtl-sdr driver(無料)

 Google Playストアで公開されている以下のRtl-sdr driverを導入します。これ自体はドライバなので、受信した音声を聞いたりデータを表示したりすることはできません。
RTL2832U driver - Google Play の Android アプリ
 

SDR Touch(無料・機能制限有)

 上記のRtl-sdr driverの開発者と同じ開発者によるレシーバアプリ。FM/AM/narrowband FM/USB/LSBを復調して聴くことができます。
SDR Touch - Live offline radio - Google Play の Android アプリ

 以下は、TOKYO FM(80.0MHz)を受信している様子。ワンセグチューナーに付属のロッドアンテナでも一応受信できています。
f:id:kachine:20160911165501p:plain

 全機能をアンロックするためには以下のキーの購入が必要です。DEMO MODEの表示が消え、スペアナや録音機能などが使用可能になるようです。
SDR Touch Key - Google Play の Android アプリ
 

Air Band Receiver(無料)

 エアバンド(118~136MHz)の受信に特化したアプリ。
Air Band Receiver - Google Play の Android アプリ

  1. アプリアイコンをタップすると以下の画面が表示されるので、"Connect"をタップします。
    f:id:kachine:20160911170301p:plain
  2. 次の画面で"Validate"をタップして、サーバ(Rtl-sdr driver)との接続を確認します(Rtl-sdr driver側で事前に何かをする必要はありません)。
    f:id:kachine:20160911170604p:plain
  3. USBデバイス(すなわひワンセグチューナー)にドライバ(Rtl-sdr driver)をアクセスさせてよいか、OS(Android)から確認ダイアログが表示されるため"OK"をタップ。
    f:id:kachine:20160911170932p:plain
  4. レシーバを模した受信画面が表示され、音声出力されます。が、当然の如くワンセグチューナー付属のロッドアンテナでは受信できませんでした。エアバンドの周波数に適したアンテナを別途用意する必要があります。
    f:id:kachine:20160911171031p:plain

 

Windows

 Windows 10(64bit版)搭載機で試してみました。今回紹介する方法ではPCのUSBポートにワンセグチューナーを繋がないため、ドライバ周りなどを気にする必要はありません。
 ※PCに直接チューナーを繋いで利用することも可能です。
 

SDR#/SDR sharp(無料)

 AIRSPYというRTL2832Uドングルの販売元が公開しているレシーバソフトウェアを導入します。
Download | airspy.com
 導入といってもインストール不要で、ダウンロードしたZIP中のSDRSharp.exeを実行するだけで起動します。

  1. server起動(Android端末側の操作)
    1. ワンセグチューナーを接続したAndroid端末で、Rtl-sdr driverのアプリアイコンをタップしてUIを起動し、"ENABLE ADVANCED MODE (FOR DEBUG & STREAM TO PC)"をタップ。
      f:id:kachine:20160911173042p:plain
    2. USBデバイス(すなわひワンセグチューナー)にドライバをアクセスさせてよいか、OS(Android)から確認ダイアログが表示されるため"OK"をタップ。
      f:id:kachine:20160911173255p:plain
    3. START_STREAMボタンをタップ(当該ボタンはKILLにトグル表示される)し、"Starting was successful!"と表示されるのを待つ。
      f:id:kachine:20160911173528p:plain
  2. client起動(WindowsPC側の操作)
    1. PCでSDRSharp.exeの実行を試みると、OS(Windows)に警告されるため、セキュリティリスクを許容できるのなら"実行"を押下して起動する(事前にウイルススキャンを行うなど、最低限必要なレベルの自衛措置は取りましょう)。
      f:id:kachine:20160911172404p:plain
    2. SourceをRTL-SDR(TCP)に変更。
      f:id:kachine:20160911173832p:plain
    3. 歯車ボタンを押下し、RTL-TCP Settingsダイアログを表示させる。
      f:id:kachine:20160911173939p:plain
    4. Android側の設定に合わせてHost/Port/Sample Rateを変更して閉じる
      f:id:kachine:20160911174042p:plain
      1. (参考) HostはAndroid端末のIPアドレスルーターの管理画面などから特定して指定。
        (ルーター管理画面の例)
        f:id:kachine:20160911174238p:plain
      2. (参考) PortはAndroid端末でRtl-sdr driverでSTART_STREAMした際のsdr_tcpコマンドの"-p"オプションの設定値(デフォルト時:14423)を指定。
      3. (参考) Sample RateはAndroid端末でRtl-sdr driverでSTART_STREAMした際のsdr_tcpコマンドの"-s"オプションの設定値(デフォルト時:1024000=1.024M)を指定。
    5. SDR#ウインドウで周波数を設定し、再生ボタン(停止ボタンとトグル表示)を押下すると復調された音声が再生される。
      (復調方式はNFM/AM/LSB/USB/WFM/DSB/CW/RAWから選択可能)
      f:id:kachine:20160911174915p:plain
      1. (参考) 正常に接続されていれば、Android側で"SdrTcp: Client has connected."というメッセージが表示されていることが確認できる
        f:id:kachine:20160911175103p:plain

 やっていることは、Android端末がSDRサーバとなり電波をTCPパケット化し、クライアントとなるWindows PCでソフトウェア的に復調処理するといった感じの分散処理と言えそうです。
 AndroidのRtl-sdr driverのUI上で、sdr_tcpコマンドらしきものでサーバ起動していますが、コンソール中のメッセージや引数などから察するにrtl_sdrコマンドをAndroidに移植したもののようです。rtl_sdrコマンドのオリジナルは以下のもので、パラメータ変更時など参考になると思います。今回はAndroidを利用していますが、LinuxマシンやRaspberry PiですらSDRサーバになれるようです。
rtl-sdr – OsmoSDR

 参考までに、一連のRtl-sdr driverのコンソール出力(?)っぽいものは、正常動作時は以下のように出力されます。

# START_STREAMをタップ
RtlSdr: found 1 device opening options
Only 1 option available, no need to ask user. Opening rtl-sdr /dev/bus/usb/002/002
Queueing
Arguments SdrTcpArguments{gain=24, samplerateHz=1024000, frequencyHz=91800000, address='0.0.0.0', port=14423, ppm=0}
Starting service with device rtl-sdr /dev/bus/usb/002/002
Permissions granted and device is accessible
Opening fd 25
Set sampling rate to 1024000
Tuner gain set to 2.400000 dB
SdrTcp: Listening on 0.0.0.0:14423
Device was open. Closing the prompt activity.
SdrTcp: Waiting for client...
The rtl-tcp implementation is running and is ready to accept clients
Acquired wake lock. Will keep the screen on.
Starting was successful!
# CLIENTが接続
SdrTcp: TCP server succesfully started and listening for clients!
SdrTcp: Client has connected.
set sample rate 1024000
set freq correction 0
set agc mode 0
set gain mode 1
set tuner gain by index 0
# KILLをタップ
Closing device
SdrTcp: Requested sdrtcp stop asynchroneously
SdrTcp: Command listener thread exiting
SdrTcp: Waiting for command thread to die
SdrTcp: TCP server shutting down.
SdrTcp: Closing sdrtcp due to main thread finishing
SdrTcp: Closing from state 0
SdrTcp: Server thread shut down
rtlsdr_read_async finished successfully
SdrTcp: Requested sdrtcp stop but already stopped
Successfully closed service
Wake lock released
Closing service

 受信感度向上のためにアンテナを屋外或いは窓際に設置したい場合でも、Android端末などであれば容易に移動可能ですが、PCの場合は面倒です。PCを移動させずに、アンテナとチューナー間を同軸ケーブルで引き回すことも可能でしょうけれど、単純に邪魔だったり減衰が気になったりすることもあるでしょう。といった観点から、PCとチューナーを物理的に切り離せる方がメリットが多いのではないかと思います。
 



以上。

*1:今回は適したアンテナが無いのでACARSやAISは試していません。