前回センシングストリームズという作品が展示されていることについて書きましたが、これに触発されて以前から可能だろうと思いつつも手をつけていなかったことをやってみました。
それはブラウザでのスペクトル表示です。もちろん表示だけならブラウザで何でも可能ではあるのですが、Chromeを使うとRTLドングルの直接制御が可能であることがChrome Radio Receiver Extensionで示されています。JavaScriptにより信号処理を行うラジオ実装ですが、RTLドングルから直接サンプルデータを取得しています。この方法を使えばスペクトラム表示も、ドングルとブラウザだけで実現可能ななずです。しかも下手なツールキットを使うよりも多彩な表現が可能なはずです。簡単にthree.jsという3D表示のライブラリを使用したスペクトラムの3次元表示をやってみました。
残念ながらこの拡張機能はURLを開くだけで動作させることはできず、ExtensionとしてChromeにロードさせる必要があります。Chromeさえ動作すれば任意のプラットフォームで動作するはずですが、Mac OSX 10.9でのみ確認しています。ソースコードからロードする手順を示します。
まずはgithubに上げてあるソースコードを取得しておきます。依存しているサブモジュールjsfftを別途ロードするためにsubmodulesコマンドを使用しています。
$ git clone https://github.com/ttrftech/threejs-spectrum.git
$ cd threejs-spectrum
$ git submodule update --init
続いてChrome側の準備です。Chromeのメニューから、もしくはPreferencesを開いて左にあるExtensionをクリック、またはURLバーにchrome:extensionと入力して、Extensionsのパネルを開きます。上にあるDeveloper modeのチェックボックスをオンにします。そうするといくつかのボタンが有効になります。
Load Unpack Extensionというボタンをクリックします。そうするとファイルダイアログが現れますので、先ほどダウンロードしてきたthreejs-spectrumというフォルダを指定してOKを押します。
ロードが成功するとExtensionのリストに下記の項目が追加されます。
ハードウェアの準備として、USBポートにRTLドングルを差しておきます。アンテナは適宜接続します。
Launchというリンクをクリックすると起動してウィンドウが表示されます。Chrome App Launcherが動作していれば、同じアイコンが表示されているので、それをクリックしても起動します。
上にあるStartボタンを押すと動作開始します。うまく行けばこんな具合にスペクトラムが3次元表示になるはずです。これは82.5MHzのFM放送(FM NORTHWAVE)です。
左右が周波数軸で-1MHz ~ +1MHzの2.048MHz。奥行きは時間軸で10秒分程度を表示しています。上下が強度で、単位は付けられませんがとりあえずリニア表示で、その高さに応じて色分けしています。
マウスドラッグで表示角度を変えることができます。時折スペクトラムが細るのは無音部分が混じるからです。この形から放送がDJによる喋りの部分であることが予想できます。音楽の部分だともっと派手に広がります。細った部分が3本に見えるのは中央のキャリアと、ステレオのパイロットトーン(19kHz)が左右に出るからです。
ボタンの横にあるテキストエリアが周波数設定欄です。マウス操作のイベントをすべて視点変更(TrackballControl)が奪ってしまっている関係で、マウスクリックでフォーカス移動できない(原因追及していない)のですが、Tabキーを数度叩くと数値を入力可能です。単位はMHzです。
145MHzに合わせてみました。アマチュア無線の交信がいくつか行われているのが見えます。NBFMなのでスペクトラムが細いです。また交信は半二重なので、時折途切れて、キャリアの強度が変わるのが判ります。
120MHzの航空無線のある周波数帯です。
ADS-Bの1090MHzです。ちょっと画面ではわかりにくいですが、中央のDCオフセットによる直線の左に2回パルスが出ているのが見えます。それなりの速度で変調を受けているのでスペクトルが広がっていますが、時間は一瞬です。
アンテナの接続を変えてアップコンバータを経由にしてみました。中波のAM放送1MHzの付近です。リニア表示なので強調されてしまうこともありますが、強烈な信号が並びます。間にも沢山見えますが、遠距離の放送局の他、一部は混変調だろうと思われます。
21MHzのアマチュア無線です。
角度を変えながら眺めていると、ノイズフロアの海面が一面に広がっていて、そこに立つ波が情報を運んでくるようにも見えます。
新しめのスペクトラムアナライザ機種ではこのようなスペクトラムの立体表示されているのを見たことがあります。SDR受信ソフトウェアでもスペクトラムやウォーターフォール表示がありますので、もちろん情報量的には違いは無いのですが、ぐるぐる回して立体的に表示するとちょっと違った感じ飽きず眺めることができます。
もしトラブルが起きた場合には、Exntensionのbackgroundまたはspectrum.htmlというリンクをクリックすると、JavaScript Consoleでエラーメッセージが出ていないかどうかを確認することができます。
ちょっとやっつけで試してみただけですが、JavaScriptは意外とパワフルです。DSP処理の枠組みはまだまだ整っているとは言えませんが、こんなことがブラウザで可能なんだという一例としてご紹介しました。
動画(パーティクル表示バージョン)
リファレンス
- 今回のソース on github https://github.com/ttrftech/threejs-spectrum
- Chrome Radio Receiver Extension https://chrome.google.com/webstore/detail/radio-receiver/miieomcelenidlleokajkghmifldohpo
- jsfft JavaScriptによるFFTライブラリ https://github.com/dntj/jsfft
- three.js 3Dライブラリ https://threejs.org/
追記
追試いただきました。ありがとうございます。
. @edy555 さんの、three.jsとRTL-SDRによるスペクトラム表示をやってみました。アンテナがしょぼいので弱いFM放送波1つだけですが。 pic.twitter.com/Tk1iQSkxD9
— Taka (@sdrfun)
また、コメントでご指摘いただきましたが、linuxのChromeでは–enable-webgl –ignore-gpu-blacklistというオプションを付けないとWebGLが動作しないそうです。ご留意ください。
あとrtl-sdr.comで紹介されていました。https://www.rtl-sdr.com/3d-frequency-spectrum-visualization-chrome-rtl-sdr/