Computer & RF Technology

Webブラウザで144MHzのアマチュア無線を受信してみる

RTL2832Uドングルで使うrtl-sdrには、rtl_tcpのほかにもいくつかコマンドが含まれています。そのなかでもrtl_fmというコマンドはその名から予想されるとおり、FMを受信することができます。これはFM放送だけではなく、アマチュア無線のような狭帯域NBFMも復調できます。実はヘルプを見てみるとAMやSSB(LSB/USB)、果てはCWの復調やI/Q信号を取り出すことまで可能なようです。復調周波数や復調モードなどはすべてコマンドライン引数で指定することができます。

別報のとおりrtl_tcpによるリモート受信サーバの実験をしていたのですが、その流れでrtl_fmの仕様を眺めていたところ、これをHTTP CGIにすることを思いつきました。rtl_fmが標準出力に書き出すRAW AUDIOをブラウザがサポートするフォーマットに変換することができたならば、HTTPを経由して受信した音声をブラウザで再生させることができそうです。HTTPによる受信サーバになるわけです。

Linuxでは音声フォーマットの変換にsoxを使うのが定番です。soxは標準入力からRAW AUDIOを受け取って、WAVに変換することができます。あとはHTTPヘッダを付けることでCGIとして必要最小限の機能を満たすことができます。b-shellだとこんな感じになります。QUERY_STRINGで周波数を渡すようにしてみました。デフォルトでは145MHzになるようにしています。このCGIにアクセスするためにHTMLも用意します。以下を参照してください。

このCGIを使うためには、RTL2832Uドングルを接続したLinuxで、HTTPサーバを動作させる必要があります。一般的なApacheなどのWebサーバを使っても良いのですが、ここでは簡単にpythonに含まれているサーバを使ってみます。debian(raspbian)には最初からインストールされています。

ディレクトリを作成して、その中にHTMLファイルとCGI用のディレクトリcgi-binを作成し、先ほど作成したスクリプトを配置します。最後にpythonを使って、CGIをサポートしたHTTPサーバを起動します。HTTPサーバはフォアグラウンドで動作し、ポート番号はデフォルトで8000となります。

$ mkdir web
$ cd web
$ mkdir cgi-bin
$ cp ~/nbfm2wav.cgi cgi-bin
$ chmod +x cgi-bin/nbfm2wav.cgi
$ cp ~/nbfm.html .
$ python -m CGIHTTPServer

HTTPサーバが動いたら、PCやMacのブラウザからアクセスしてみます。

Startボタンを押すと、5秒ほど経過した後に音声が再生されるはずです。再生開始が遅れるのはブラウザでバッファリングされるためです。MacのChromeを使った場合で5秒程度でした。

周波数を変更したときも、やはり5秒程度遅延します。バッファリングがある以上これは仕方ありません。

最近は、Webアプリのようにユーザインターフェースをブラウザで構成することが標準的な手法となっていますが、ソフトウェア無線でも可能かもしれません。今回は原理の確認ですので、簡単なことしか試していませんが、復調モードやゲイン、スケルチほか、受信機に必要な各種操作ができるようなユーザインターフェースを作ることは難しいことではなさそうです。手元には特別なクライアントを必要とせず、オーディオ(HTML5)に対応したブラウザがあればOKです。また、PCだけではなく、スマートフォンからの利用も可能だと思われます。(残念ながら上記のスクリプトではうまくいきません)

  • 前回と同様Linuxとして、Raspberry Piを利用しています。rtl_fmでFM復調した場合CPUを30%消費していました。
  • rtl_tcpの受信サーバはサンプリングレート2Mで8bitのI/Q信号を送信しますので、16〜32Mbps程度の帯域幅を消費します。この記事のHTTP受信サーバは音声のみをサンプリングレート16kHz16bitで送信しますので256kbps程度の帯域幅になります。
  • この方法によるリモートサーバは、同時に一人しか使用することができません。HTTPセッション毎にrtl_fmがデバイスを占有してしまうためです。工夫すれば複数のセッションをサポートするようにはできますが、周波数やモードを個別に設定することはできません。複数のドングルを搭載したとしても、サポートできるユーザ数はドングルの数に限定されます。ブラウザで利用できるとは言っても、不特定多数にサービスすることは難しいです。LAN内で利用することが現実的です。
  • 上で述べたように音声の再生にバッファリングによる遅延が生じます。このため、チューニング操作をしようとした場合は、操作から音声が変化するまで遅延が生ずることとなり、連続的なチューニング操作は容易ではありません。現状ではSSBやCWなどの利用はスムースにはいきません。ラジオのようなチャネル設定による利用が最善かもしれません。
  • エアバンド(AM)を同様に受信した例。ブラウザのアドレス欄で直接周波数指定しています。https://www.youtube.com/watch?v=ogm6XB7v09A
  • rtl_tcpによるリモートサーバについての前回の実験
Load more