2014年 08月 20日

192kHz サンプリングのUSBオーディオデバイス

バンドスコープ を作ったのはいいが、41.1kHz サンプリングだし、0Hz付近にUSB オーディオデバイス由来の強力なノイズが入ってるのがイケてないので、良さげな192kHz サンプリングのUSBオーディオデバイスが欲しくなった。

SDR 用サウンドカードのまとめ みたいなページを見てみたけど、現状手に入るなかでよさそうなのは Steinberg UR22 というのしかない。これも注釈がついてて「ノイズがあるよ」って書いてあるけど、HFでは問題にならなそうとのことなので、買ってみた。

asin:B00B19JBW2:detail 3

独自のドライバが必要で (UAC2 とかじゃない) 嫌な感じだけど、普通に Mac 用の提供されている (Yamaha Steinberg Driver とかでググる) のでそこらへんではハマらなかった。

しかしこれ、用途的に宅録みたいなの向けなので、入力や出力がちょっとややこしい。入力はXLR(キヤノンコネクタ)バランス入力・3極標準プラグ (ステレオ標準プラグ = 6.3mm) バランス入力・2極標準プラグ (モノラル標準プラグ = 6.3mm) アンバランス入力といろいろ対応されている。KX3 の出力は 2.5mm ステレオジャックでこれはアンバランスなので、2.5mm ステレオジャックからモノラル標準ジャック2本へ変換が必要になる。

2.5mm ジャック -> 3.5mm プラグへの変換は KX3 注文時に一緒に買ってあるので、以下のように3.5mmジャック・ジャックと、3.5mm プラグ → 6.3mm プラグ×2 の変換を買った。

asin:B003UXCZHA:detail 4

asin:B000UDADBI:detail 4

入力なしのとき

ちょっとノイズが立ってるところがあるけど、全域でだいぶノイズが少なくなった。中心周波数付近のノイズが皆無になったのはデカい…

±30kHz 付近のノイズは電源のスイッチングノイズで、直接オーディオインターフェイスに飛びこんでいるっぽい。それ意外の 60kHzぐらいから90kHz までのノイズはUSBインターフェイスのノイズっぽい。

入力いれたとき


両端に向かってゲインが下がっていくのは KX3 のマニュアルにも書いてあって、KX3 出力時点でこうなってしまう。FFT したあと補正するのがいいと思うけど、まだやってない。

The RX I/Q outputs from a receiver are not “flat” over an infinite frequency range; the signal-conversion process results in some slope (decrease in gain) as you move farther from the center frequency. In the case of the KX3, the signal will be reduced by about 2.5 dB at +/- 24 kHz, 4 dB at +/- 48 kHz, and 7 dB at +/- 96 kHz. The spectrum amplitude on the display, including the apparent noise floor of the receiver, will “roll off” by these amounts.

KX3 Owner's man Rev B4

192kHz の範囲が一望できるのがなんかすごい広くなる。

96kHz サンプリングだとあんまり気にならない範囲になる。狭くなるけど CW の場合 96kHz ぐらいで見たほうが選局しやすい気がする…

だいぶいい。

身近なノイズ源を特定する

ウォーターフォール表示で遊んでいて、アマチュア無線のバンド全域に繰り返し強いノイズが入っていたり、部分的に超強力なノイズが入っていたりすることがあって、気になっていた。

少し自分の周辺機器をみまわして電源を切ったり入れたりしたらかなり変わったのでメモしておく

主要機器を切った状態

切れそうな機械の電源をだいたい切った状態


すぐ電源切れないデバイスも結構あるけど、かなり静かになった。

エアコン

規則的なノイズが全域に入る。エアコンはどのバンドでもノイズが入るけど、14MHz帯が一番ひどい。

空気清浄機

ダイキンの空気清浄機の電源を入れるとエアコンと似たようなノイズがかなり強く全域に入る。

モーターのブラシノイズなんだろうか? よくわからない。放電ノイズっぽくはないけど

スイッチング電源のノイズ

特定の周波数ごとに強力なノイズが入る。負荷に応じてノイズが揺らぐのが特徴っぽい。7MHz や 10MHz あたりが一番ひどい。ハイバンドになるほど強度が下がっていく。

蛍光灯のノイズ

14MHz帯に入っていた。画像はつけた直後で、なんか周波数を変えながら「ログインしてきました!」って面してるのが蛍光灯ノイズ。

これとは別に蛍光灯のデスクライト(インバーター制御)もあって、それはそれでこれとは違うノイズの入りかたをする。デスクライトのほうがだいぶ広範囲でひどい。

その他

USB HDD か、その電源アダプタ(スイッチング)かがノイズを出していたが電源ケーブルにコアを巻いたら、これはかなり改善した。HDD 側のノイズが電源ラインに戻ってたのかな?

今回、

  • 扇風機
  • MacBook Proの電源アダプタ

はノイズ源ではなかった。

2014年 08月 16日

KX3 の KY コマンド

KX3 はシリアル通信経由で直接 CW をエンコードして送信できる。つまりいわゆる専用の CW USB インターフェイスが必要がない。(RTTY も KX3 側でエンコードしてくれるので、これによって送信できる)

使うのは KY コマンドで

KY text;

の型式で送る。KY に続く空白を W にした場合、このコマンドで指定した文字列の送信が終わるまで、後続のコマンドの実行が保留される。(一旦キーの速度を変える場合に便利)

コマンドのリファレンスには「@ を送ると即時送信停止になるよ」というようなことが書いてあるが、これは K2 というリグの話で、KX3 ではあてはまらない。

KX3 では @ は常に @ のモールス符号が送出されるようになっていて、即時停止には RX コマンドを使う。RX コマンドは即時に送信を止めて受信モードに戻る (送信中符号の送信完了も待たない)

KX3 側のバッファはあまりないみたいだが、TB コマンドで今何バイトバッファに入っているかを知ることができる。ただ、9文字以上だと常に9になってしまうので、正確にはわからない。

この機能を使って PC キーイングを作る場合以下のようになりそう

  • TB コマンドを頻繁にポーリングして状態更新しつづける
  • 送信したい文字列はバッファにいれ、5文字程度までで分割して KY 実行
  • 残り2文字程度になったらバッファから残りを KY

KX3 側に保持されているバッファの内容を取得することはできず、残り送信文字数だけしかわからない。なので同期が正確にできないと厳しい。この機能は送信中にコマンド実行する必要があるので RFI が比較的でやすく信用できるかというと微妙な気がする。

とりあえず既に USB CW インターフェイスを作ったときの UI があって、WebSocket の互換サーバーさえ書ければ動かせるので、試してみる。

2014年 08月 15日

KX3 用の Mac OS X バンドスコープ (Panadaptor) 実装を golang で

できたもの

できたものはこんな感じのです。

前提

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円ぐらいの安いサンプリングデバイスを使っているせいかもしれないけど、良さげなのは結構なお値段なのできつい。

Steinberg 2x2 USB 2.0 オーディオインターフェース UR22 - Steinberg(スタインバーグ)

Steinberg(スタインバーグ)

3.0 / 5.0

これが欲しいです。

2014年 08月 12日

Elecraft KX3 Bottom Keyer Paddle Pin assign

"KXPD3 Keyer Paddle" は普通の KEY 端子とは別に、下部で4ピンで出ているのを使っている。マニュアルにも回路図にもピン配置が書いていないので調べた。(KXPD3 は持ってない)

ピン番号は回路図に倣った。KX3SchematicDiagramDec2012.pdf の9ページ

3V3 は何のためについているかわからないけど、330Ωがついているので10mAしか流れない。実測したけど9mAしか流れない。

GND はケースに導通しているのと共通

2014年 08月 09日

Elecraft KX3

移動用のオールモードトランシーバーが欲しい

と思いはじめ、いろいろ調べてみた。移動といっても車も自転車もないので、バッテリーやアンテナなども含め徒歩や公共交通機関で運搬可能な範囲でなければならない。

国内だと FT-817ND というリグがこの用途ではスタンダードなようでかなりたくさんの人が使っている。FT-817ND は2001年発売とかなので、おそろしく長く売ってる無線機となっていて、国内には競合製品がない。

ほかにも候補があるか?と思ってさらに調べてみると、アメリカ Elecraft 社の KX3 というのが良さそうだということがわかった。こちらは2012年?ごろに発売された比較的新しい無線機で、FT-817ND と同じぐらい小さい。

結論からいうと表題の通り KX3 を買ったが、以下のポイントで決めた

  • 変調/復調を全部DSPでやってる
    • クラシックなスタンドアロン無線機の外観だが中身は完全にSDRでかっこいい
    • I/Q信号 (直交信号) を出力する端子があるので、サンプリングデバイスさえあればPC SDRも可能
  • 消費電力がFT-817NDに比べて多少低い (特に待機電力は低い)
    • 移動に使いたいので少しでも効率が良いと嬉しい
  • 軽い
  • ファームウェア更新の頻度が高い
    • ちゃんとメンテされており、なおかつ更新して改善できるほどの柔軟性がある

問題は主にコスト面で、FT-817ND がフィルタ込みで9万円ぐらいで買えるのに対し、KX3 は必要なオプションを入れていくと1.5倍ぐらいになる。また、技適を取得していない無線機なので、局免をとるのに結構ハードルがある。

届くまで

特に何も考えず Elecraft に直で注文した。

  1. JSTで木曜日の午前中に発注 USPS Priority Mail Express International
    1. オーダー確認メールがすぐにくる
    • なんか他の人だとこのメールに返信してる人がいるけど、ただの確認なので返信する必要ないと思う
  2. JSTで金曜日の早朝に発送
    1. PST だと木曜日の午後なので、2営業日以上かかると書いてあったけどかなり早く発送された
  3. カリフォルニア州フリーダム → サンノゼ → サンフランシスコと移動
  4. 金曜日のうちに Processed Through Sort Facility / ISC SAN FRANCISCO (USPS) になる (サンフランシスコ国際空港から発送の状態)
    1. PST では金曜早朝
  5. その日のうちに航空便に乗るかなと思ったが乗らず5日(3営業日)経過
  6. 翌週、JST 火曜日の夜に東京国際郵便局に着
    1. USPS側ではステータスは更新されず、JP (Japan Post) 側だけ先に更新
  7. 水曜日午前中、通関手続中に
  8. 2時間ぐらいで次の通関手続中
  9. 木曜日午前中に国際交換局から発送に
  10. 金曜の早朝に配達店到着
  11. 金曜の昼ごろ到着

国外にあるうちは USPS のほうが細かくステータスがアップデートされるけど、国内に入った瞬間からJPのほうが早く更新されるようになるみたい。2時間ぐらい遅れてUSPSにも反映される。


オプションや価格

モジュールキットと完成品とがあるんだけど、せっかくなのでモジュールキットにした。地味にこういうの苦手なのでちょっと心配なんだけど、Elecraft の About ページ 見てたらキットにしなければならない気がしてきたのでそうした。

ケーブルセットは案外 L 型のコネクタが手に入りにくいので買っておいた。ルーフィングフィルターは自分の用途だとたぶん必要ないけど、CW メインでやるという意気込みをもって追加した (あとから追加すると調整が面倒)。アンテナチューナーはワイヤーアンテナでもいける感じのやつなので、最悪長いケーブルさえあれば出れるように追加した。

  • KX3-K KX3 160-6 M Xcvr (Modular Kit)
  • KX3-PCKT Accessory Cable Set
  • KXFL3 dual-Passband Roofing Filter
  • KXAT3 Internal, 20-W Automatic Antenna Tuner

なかなかかかる。無線機に関税はかからないけど、消費税は税関でかかる。

注文しちゃったあとで調べたら国内代理店だと、ちょうど代理店の手数料分1万ちょいだけ浮く感じだった。直販だと届くまでに日数がかかるのと、ちゃんと届くのが不安とかがあるので、代理店で買ってもいいレベルの差ではあるかもなあという印象。

組立

思いのほか小さい箱で届く。

検品からはじめて、最初に動かすまで4時間ぐらいかかってしまった。めちゃくちゃ難しいみたいなことはないんだけど、小さいだけあって中身が狭いので、ビス締めるのが微妙にむずかったり、ケーブルの接続がしにくいとかがあった。とりあえずちゃんと動いたのでよかった。

ビスの長さが一部 (スピーカーまわり) で違ったんだけどなんとかなったっぽい。アメリカンな感じ…

ファームウェアはなぜか最初から最新 (2014-07-11) の beta 版 (production 版と別れてるんだけど) が書きこまれていたのでアップデートはしていない。

2014年 07月 25日

自作 USB CW キーイングデバイスを作る

去年AVR で USB 接続の PC キーヤーを作るということをやったのだけど、結局ちゃんと形にはせず放置してしまっていた。最近なんとなく自分の中で PC キーイングの機運が高まってきたので、まじめに安定したものを作ろうと頑張って、ある程度成果がでてきた。

当然似たようなデバイスは既にあるので、改めて作る必要はないんだけど、自分で作れそうなものは、一回ぐらい自分で作りたいものですね。

ハードウェア

安定して動くように試行錯誤した結果、USB のデータラインに 100pF のパスコン (ノイズ対策)、リセットピンを外部プルアップ (USB のデータラインに電流が多く流れて、リセットされやすくなるので)、USB ラインのツェナーダイオードをちゃんと計ってから使う、18MHz の水晶 (CRCチェック用) とかになった。あとはもともとと同じだと思う。

ファームウェア

USB まわりを割と丁寧に実装しなおした。UI との整合性をとるため、機能をちょいちょい足している。usbFunctionWrite で -1 を返すと STALL の意味になるとか、V-USB のドキュメントをよく読んだほうがいい。

ソフトウェア

ドライバをカーネルレベルで書くのはデバッグが大変で嫌なので、最初から libusb 関係のものを使うことしか考えてなかった。最初は Chrome App から直接 chrome.usb で扱おうとしたのだが、いろいろあってやめて、ruby + libusb + em-websocket で WebSocket サーバを書いて中継している。

libusb の同期的インターフェイスは、実際のところ非同期インターフェイスのラッパーになっており、マルチスレッド環境で使うとレースコンディションが発生することがある。libusb のドキュメントにいろいろ書いてあるが、面倒なので ruby 側で mutex のロックをかけるようにしたら解決したので深く追ってない。

また、ホットプラグ対応もなんか刺さったりしてつらいのでやめて、デバイスが接続されていないときは定期的にポーリングするというクソっぽいけど正確に動く実装にした。

インターフェイス

そして WebSocket で通信するページをペライチで作って試してている。全部込みで動画にしてみた。

今後

まずは無闇にストールしたり、刺さったりしないという基本的な部分で安定することを目指して頑張った。「もう無理では……」と思ったこともあったけど、いつのまにか結構安定した。ただ、実際の運用まで行ってないので、インターフェアにどれぐらい耐性があるかはわかってない。試験電波を出してオシロで信号ラインを見た感じだと大丈夫そうだけど、よくわからない。

手持ちのユニバーサル基板に組んだので、作ってみたらケースを含めちょっと大きくなってしまった。内容的にはたいしたことがないので、フリスクケースに収まるような基板を作ってみたい。

あとは、ログツールとの連携をしたいと思っているけど、ログツールを作りなおしているので、まだまだ先になりそう。

MorseRunner

ただ聴くだけのモールス練習に若干飽きてきて、MorseRunner というのを試してみたら、おもしろかった。Mac でも homebrew の wine で普通に動いてくれる。

コンテストを想定した練習ソフトみたいな感じになっていて、F1 で CQ を出して、呼んでくる局のコールサインを聴きとって入力し、RET を押すと、自動的に相手局にコンテストナンバーが送られ、相手局が返してくるコンテストナンバーを聴きとって入力したら1局終わり。

聴きとれないときは F7 押したりするともう一度打ってくれたりする。結構実際に交信しているみたいで楽しい。

以下の画像は HST モードで1時間やってみたもの。ぶっちゃけ15分ぐらいから辛くて早く終わってほしい感じになる。普段は 10分のシングルコールかパイルアップで遊んでる。シングルコールはあんまり頭使わないので、だんだん眠くなるけど、聴きとれるというのが楽しい。パイルアップは、とにかく2文字とって訊き返すというのが大事でおもしろい。

シングルコールがただ聴くだけだから一番局数は稼げる?と思うけど、自分の場合 30wpm でやると、だいたい10分で30局超えたらいいみたいな感じだった。しかし S と H の区別がはっきりつけられないので厳しい気持ちになることがある。

2014年 07月 08日

電圧バラン・電流バラン

あんまり日本語の文書だと見ない気がするけど、英語圏由来の文書だとしばしばみるような気がする Voltage Balun, Current Balun ってなんなのだろうと思って調べたけど、つまり以下のような話だった

  • 電圧バラン (Voltage Balun)
    • トランスとして働く (同時にインピーダンス変換が可能)
    • 強制バラン
  • 電流バラン (Current Balun)
    • コモンモードチョークフィルタとして働く (電圧は変更しない)
    • フロートバラン・ソーターバランとも呼ばれる

基本、電流バランで十分なら電流バランのほうが効率が良く、インピーダンスマッチも同時にしたいなら電圧バランを使う、でいいのかな。

2014年 06月 28日

ブラウザでモールス練習

WebAudio 使ったモールス練習機を自分で作って使っているので公開する。

ほんとに全く聴きとれないときから使っているので、コッホ法というスタンダードなモールスの覚えかたに従って練習してくように作ってある。

見た目的に想像つくと思いますがスマートフォンでも動きます (Chrome for Android でだけ確認)。


コッホ法とは以下のような特徴のトレーニング方法で、無線電信の巧みと技にも書いてあるが、心理学者のルドウィグ・コッホさんが効率的にモールスを習得するための研究した結果を反映したもので、知られているトレーニング方法の中では唯一根拠があるといえそう。

  • 送信スピードは最低でも15wpm (word per minutes) 以上にする
    • 1文字の「符号」をまとまって認識するため
  • 最初は2文字だけから始まり、90%以上聴きとれるようになったら1文字足していく

最初は文字間の無音を長くして、だんだん狭くしていくといいらしい。文字間の無音は長点と同じ長さしかないので、聴いてみると案外短い。1文字ずつシーケンシャルに聴きとっていると間に合わないので、脳内でバッファリングしながら解読する必要がある。

覚える順番は LCWO.net準拠にしてある。LCWO.net もブラウザでモールス練習できるサイトで便利。グラフ化もしてくれるので、学習成果をテストするのに使ってた。ただ、mp3 をいちいちダウンロードしてくる感じなので、そのへんがちょっと使いにくい。コッホ法一通り終わって (20wpm 90%) からは Code Group のほうで 24wpm ぐらいまでちょくちょくテストしてたけど、最近はランダムじゃなくて意味のある単語の練習をしているので、やってない。

もう1年ぐらい前に作ったやつだけど日記にしていなかった。