PocketSDRすごい(pocket_acq編)
はじめに
東京海洋大学の高須知二先生が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
まだ市販受信機では受信できない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
信号捕捉は、ドップラ周波数方向と、コードオフセット時間方向との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
スマートフォンアプリGNSS Viewによると、時刻2021-12-01 05:46UTCでの東京のL1 C/A可視衛星PRN番号は10, 12, 15, 23, 24, 25, 193, 194, 199(マスク角20度)だそうです。これらの衛星の信号強度をプロットします。
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
このコードを読むと、とても勉強になりそうです。PocketSDRは、大学生を対象とした新しいフェーズに入った衛星測位技術を加速させる人材育成の教材としても使われるそうです。若い人にはチャンスがたくさんあります。
関連記事
- Pocket SDRすごい(リアルタイム測位機能) 13th October 2024
- Pocket SDRを用いたGalileo E6B信号の受信 27th January 2023
- リフローでやらかしました 19th January 2023
- Pocket SDRハードウェア製作(第3報) 30th September 2022
- Pocket SDRハードウェア製作(第2報) 14th September 2022
- Pocket SDRハードウェア製作(第1報) 4th September 2022
- PocketSDRすごい(パーツ購入編) 9th April 2022
- PocketSDR APにてbladeRFを使いたい(その2) 16th March 2022
- PocketSDR APにてbladeRFを使いたい 5th March 2022
- PocketSDRすごい(スナップショット測位編) 23rd February 2022
- PocketSDRすごい(FFTWによる高速化) 19th February 2022
- PocketSDRすごい(L6信号デコード編) 19th January 2022
- PocketSDRすごい(pocket_trk編) 28th December 2021