前提
KX3 にはオーディオ帯域までダウンコンバージョンされた信号が直接でる出力端子があり、一般的なステレオ音声入力を持つコンピュータを使ったソフトウェア解析により広帯域の無線信号を復調できる。
なのでこの信号を使って MacBook 上で FFT して広域の時系列データをウォーターフォール表示し、信号を高速で見つけられるようにしたい。
具体的には Windows においては OmniRig 及び HDSDR によって実現できることを Mac で行いたい。
問題
OmniRig と HDSDR は Mac 上に VM を立てて Windows を動かせば当然動くが、残念ながらパフォーマンスがあまりでない。特に CPU 使用率が非常に高くなってエコではない。
wine によるエミュレーションを行ってもある程度動かすことができるが、自分の環境では KX3 とのシリアル通信に難があった (書きこみはできるが読みこみができない) また、この方法も CPU リソースを大量に使う。
このため、Mac OS X 上でネイティブに動く似たようなソフトウェアが必要だと感じた。
最初の目標
- FFT してウォーターフォール表示する
- KX3 とシリアル接続し、周波数を相互に同期する
コンピュータ側で復調したりする機能は今回特に必要性を感じなかったので大変シンプルな要件
また、できれば KX3 側の局発を変えても、ウォーターフォール表示の履歴をスムーズに繋げたいと思った (既存の SDR ソフトだと必ず局発を中心にウォーターフォールが表示されてしまうため、時系列データがずれて表示されてしまう)
実装
今回実装言語として go を採用した。以下の理由がある
- 最近流行っててかっこよさそうだから
- ナイーブに書いてもそこそこ早いという噂があったから
音声入力まわりは portaudio、グラフィックス表示まわりは OpenGL を使って実装した。
FFT ウォーターフォール
入力の I/Q 信号は局発の位相を90度ずらしてコンバージョンした直交信号になっており、これを複素数として FFT すると、正の周波数と負の周波数を一発で解析できる。今まで FFT しても実数しか扱ったことがなく負の周波数部分は捨てたことしかなかったが初めてちゃんと使った。
基本、表示側はこれをうまいこと表示しているだけでおわってる。バッファは container/ring の ring.Ring でリングバッファとしていて、解析済みのビットマップを1行そのまま保持している。
シリアル通信
goserial というライブラリがあるので基本これを使ってやるだけだけど、いろいろとハマる。
- FTDI のライブラリが不安定でよく kernel panic になる (強制再起動)
- どうも read でブロックしているときに close しようとすると close も block し、そのときプロセスを無理矢理 kill させると Mac 全体が落ちる、ということがわかった。もしプロセスが block しているようなら、USB を物理的に抜くと read に EOF が返り、close も成功させることができる
- KX3 は SET のコマンドにレスポンスを返さない
- FA00007100000; とだけ送っても、それが成功したのかどうかはわからない。
- FA00007100000;FA; として必ずレスポンスを返すようにして解決
go に慣れていなくて、make(chan T) し忘れたせいで一晩ハマったりもした (なぜか1度だけ chan 通信が動くという謎挙動になった)。
結果
当初の目的はひとまず果たすことができた。
- MacBook Pro Retina, 13-inch, Late 2013 (2.4GHz Core i5 / 16GB メモリ / Intel Iris) において CPU は 30% 未満
- もっと減らしたいけど、とりあえずまぁまぁいい感じ
- GL の表示はかなりスムーズ
- 処理が遅すぎると音声の入力バッファがあふれるので頑張る必要がある
- バンド内でどれぐらい局が出ているか一見でわかりやすくなった
- クリックしてすぐその信号を聞けるので捗る
40m (7MHz) 帯を見ながら実験してたけど、このバンドは終始賑やかというのが可視化されて面白かった。逆に、他のバンドはいつ見てもうちのロケーションでは殆ど聞こえないということもわかった。悲しい事実も可視化された。
あと気になっているのは、0Hz付近に常に高いスペクトルがでてしまうことだけど、よくわかってない。3000円ぐらいの安いサンプリングデバイスを使っているせいかもしれないけど、良さげなのは結構なお値段なのできつい。
これが欲しいです。
- トップ
-
tech
-
KX3 用の Mac OS X バンドスコープ (Panadaptor) 実装を golang で
- トップ
-
ham
-
KX3 用の Mac OS X バンドスコープ (Panadaptor) 実装を golang で