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ぶんの帯域しか取得しないが、全領域でできるだけフラットでノイズのない結果を得られる。