hackrf_sweep コマンドの動作を調べたので記録しておく。このコマンドは HackRF One のファームウェアと協調して、うまく広い帯域をスイープできるように作られている。

まずいくつか定数がある

  • サンプリング周波数は 20MHz
  • フィルタ周波数は 15MHz
  • オフセット周波数は 7.5MHz (設定した周波数の7.5MHz上の周波数になる)
  • step_width は 20MHz
  • interleaved モード

とにかく interleaved モードを理解しないといけない。interleaved ではないモード (linear) は単純に step_width を足していくだけなので単純明快だが、interleaved ではファームウェア側は +5MHz、+15Mhz を繰替えしてスイープする動作をする。

これで何が嬉しいか?というと、いくらか効率を犠牲にして (スキャン時間や計算量が2倍) フィルタの減衰がかかる両端の領域や、DCオフセットがある中央の領域を捨てて綺麗な帯域だけからスペクトラムを合成できる。

詳しい動作

グラフをかいてみた。中央が0Hzで±10MHz (サンプリング周波数20MHz) の周波数領域を示している。全体の赤い領域が1回でとれる 20MHz サンプル、15MHz フィルタされた信号の全体で、青の領域と紫の領域だけを採用してさらにズラしていく。次は5MHzずらせば真ん中にある隙間と次の5MHz分が埋まり、その次は15MHzずらせば……と続く。

見ての通り帯域の端のほうではローパスフィルタ(アンチエイリアシングフィルタなので必須)による減衰の影響をうける ので避けたいし、0HzにはどうしてもDCオフセットが乗るので避けたい。

一回のサンプルで20MHzの帯域にうち、10MHzぶんの帯域しか取得しないが、全領域でできるだけフラットでノイズのない結果を得られる。

  1. トップ
  2. tech
  3. HackRF One の Sweep Mode の動作


HackRF という SDR 用の無線フロントエンドがある。オープンソースハードウェア。この手のものは他に LimeSDR (高い) や RTL-SDR (安い) などがあるが、HackRF は最高周波数が 6GHz までという点とコスパが良い点が大きな特徴。

アルミケース・TCXOモジュール・ロッドアンテナ付きで $125 ほど。

TCXO モジュールはインストールされていないので、一旦ケースを分解して装着する必要があった。適当にググって解決。

brew でツールが入る

brew install hackrf

TCXO がちゃんと認識されているかはこれでわかる (ref. HackRF One · mossmann/hackrf Wiki · GitHub

hackrf_debug --si5351c -n 0 -r 
[  0] -> 0x01 # 認識されている場合
[ 0] -> 0x51 # 認識されていない場合

これらのツールはあくまでCUIツールなので、GUI で何かするためには他ものがいる。Mac だと Gqrx はデフォルトで HackRF の入力に対応しており復調もできる。

スペクトラムアナライザーっぽく使えるのだとqspectrumanalyzerが一応使える。ただし非常に重く、よく落ちてしまう。

アンテナポートへの電源供給

GPS アクティブアンテナのように電源供給が必要な場合、アンテナポートに電源供給することができる。関連ツールにはコマンドオプションがある。

スイープモード

スイープモードというのが実装されている。HackRF One のハードウェア的には 20MHz サンプルなので、20Mhz 分の帯域しか同時に見ることはできないが、連続して局発周波数などを動かしてサンプリングしていくことで、擬似的に広い範囲の帯域を見ることができる。広域スペアナ的に使えるといえばわかりやすいか。

詳しい動作はまた今度説明したい。

TX

送信もできるけど HackRF One 本体からの出力は最大でも 15dBm (0.03W) なので、外部にリニアアンプなどが必要になる。

が、そもそもこの機械の仕様でアマチュア免許などは下りないと思うので、ダミーロードつけて微弱無線局として遊ぶしかないと思う。とはいえ、微弱無線局の定義も非常に厳しいので、基本的にはもったいないけど、国内ではおかざりと思ったほうが良い。

ソースコードの歩きかた

HackRF はオープンソースなのですべてのコードを読むことができる。かなり綺麗に書かれているほうだと思うので、すんなり読みくだせるものが多い。

基本的にツール側から攻めていくのがわかりやすそう

これ以下に hackrf_info などのツールのソースコードがある。

ツール類はほぼ libhackrf を呼んでいて、こちらも同じレポジトリ内にある。難しいことはあまりしておらず、素直に libusb の関数を呼びだしているので読みやすい。機能もたくさんあるわけではない。

ファームウェアは若干複雑ではあるが、USB の API から攻めていくのが読みやすい気がする。

cpld (FPGA の弟みたいなやつ) まわりはまだちゃんと読めてない。

  1. トップ
  2. tech
  3. HackRF One で遊ぶ

「設定」→「共有」→「画面共有」という項目がでるはずだが、ない場合、vino (gnome desktop 環境の vnc サーバコンポーネント) がインストールされていない。おそらく初回セットアップ時の構成によるのだろう。

sudo apt install vino

して「設定」を再起動すれば項目が出現する。

また、このままだと macOS から接続できない (互換性がないと言われる)。encryption を切ってやれば接続できる。SSH でポートフォワードする場合 vnc レイヤーでの暗号化は特に必要ないので無効にしても良いだろう。

export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/ # Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.

sudo  gsettings set org.gnome.Vino require-encryption false
sudo  gsettings   get org.gnome.Vino require-encryption # 確認
  1. トップ
  2. tech
  3. Ubuntu 18.04 の VNC (画面共有)