PocketSDRすごい(pocket_acq編)

categories: gnss
tags: qzss sdr

はじめに

東京海洋大学の高須知二先生がGitHubにて公開されているPocketSDRのサンプルコードを試してみました。

このGitHubにある資料は、GNSS (Global Navigation Satellite System) 信号受信のためのソフトウェア無線 (SDR: software defined radio)に関するものであり、電波受信するハードウェア設計資料と、信号処理するソフトウェアからなります。実際のGPSなどの信号受信にはハードウェアが必要です。しかし、このハードウェアにて収録したデータがサンプルとして付属していますので、ここに書かれている通りに実行すると、WindowsだけでなくmacOSでも信号捕捉を試せます。

私は、Intel CPUのMac mini(macOS Big Sur、バージョン11.6.1)と、Apple Silicon M1 CPUのMac mini (macOS Monterey、バージョン12.0.1)の2台で、HomebrewのPythonを利用して、動作を確認しました。

準備

Homebrewの設定が完了していることを仮定します。macOS付属のPythonはバージョン2.7と古いので、 バージョン3系列であるHomebrewのPythonを利用します。

ターミナルやiTerm2を開き、pipコマンドにてPocketSDRの実行に必要なPythonモジュール(NumPy, SciPy, Matplotlib)をインストールし、gitコマンドにてPocketSDRをダウンロードします。

$ brew upgrade
$ pip3 install numpy scipy matplotlib
$ git clone https://github.com/tomojitakasu/PocketSDR pocketsdr

みちびき1号機後継機の新信号L1 C/Bの捕捉

みちびき1号機後継機は、2021年10月26日11:19:37に打ち上げ成功しました。この後継機が放送するL1 C/B信号を捕捉します。信号捕捉プログラムpocket_acq.py実行例のパスをWindowsのバックスラッシュ(または円記号)からスラッシュに変更し、明示的にHomebrewのPythonを指定します。

$ cd pocketsdr/python
$ python3 pocket_acq.py ../sample/L1_20211201_054600_24MHz_I.bin -f 24 -fi 6 -sig L1CB -prn 203 -p

awesome pocketsdr

まだ市販受信機では受信できないL1 C/B信号の相関プロットが表示できて感激です。ターミナルには信号捕捉に要した時間TIME = 495.3 msが表示されています。上段にはここで指定した擬似ランダム雑音(PRN: pseudo random noise)番号203についてタイミングに対する相関が、下段にはその時間タイミングを基準としたコードオフセットに対する相関が、それぞれプロットされています。グラフ中には、捕捉したタイミング、ドップラ周波数、信号強度に比例する値C/N0も記されています。下段グラフにて、1つの主ピークの他に、2つの副ピークがあります。これは、L1 C/BなどのBOC (binary offset code) の相関プロットの特徴です。

pocket_acq.pyはデータファイルを引数に取り、

  • 信号名-sig
  • PRN番号-prn
  • サイクル数単位の信号探索積分時間-tint
  • ミリ秒単位の時間オフセット-toff
  • メガヘルツ単位のサンプリング周波数-f
  • メガヘルツ単位の中間周波数-fi

のオプションがあります。-f-fiはデータ収録時の値を指定することになります。

PRN番号は、カンマ記号にて複数PRN番号を、マイナス記号にてPRN番号範囲を、それぞれ指定できます。複数PRN番号を指定すると、PRN番号に対するC/N0プロットになります。

また、表示オプションとして、相関プロットを追加する-pと、3次元プロットにする-3dがあります。これらの説明は、pocket_acq.pyのソースコードにありました。

このL1 C/B信号を3次元プロットします。

$ python3 pocket_acq.py ../sample/L1_20211201_054600_24MHz_I.bin -f 24 -fi 6 -sig L1CB -prn 203 -3d

awesome-pocketsdr2

信号捕捉は、ドップラ周波数方向と、コードオフセット時間方向との2次元探索しながら、相関ピークを見つけることです。

他衛星信号の捕捉

PRN番号-prnと信号種別-sigを変えれば、他衛星の捕捉も可能です。例えば後継機でないみちびき1号機の従来信号L1 C/Aを捕捉してみました。

python3 pocket_acq.py ../sample/L1_20211201_054600_24MHz_I.bin -f 24 -fi 6 -sig L1CA -prn 193 -p

awesome-pocketsdr3

スマートフォンアプリGNSS Viewによると、時刻2021-12-01 05:46UTCでの東京のL1 C/A可視衛星PRN番号は10, 12, 15, 23, 24, 25, 193, 194, 199(マスク角20度)だそうです。これらの衛星の信号強度をプロットします。

awesome-pocketsdr4

python3 pocket_acq.py ../sample/L1_20211201_054600_24MHz_I.bin -f 24 -fi 6 -sig L1CA -prn 10,12,15,23,24,25,193,194,199

awesome-pocketsdr5

このコードを読むと、とても勉強になりそうです。PocketSDRは、大学生を対象とした新しいフェーズに入った衛星測位技術を加速させる人材育成の教材としても使われるそうです。若い人にはチャンスがたくさんあります。


この記事には一連の関連記事があります。