Open source GPS C/A信号の抽出
オープンソースGPSを作ろうという企画ですが、ぼちぼち作業をしています。少し進展がありましたので、その経過報告ということで記事にしてみます。
今回の報告は以前の3段階フェーズ分けに従うと、第2段階の信号処理、つまり受信機用ソフトウェアの段階のことで、その段階の中でもかなりはじめの部分になります。今後、こういった報告記事が続くと思いますので、までは、整理の意味をかねて、GPSの信号処理がどういった段階に分けられるか紹介しておこうと思います。
- GPSのハードウェアによってデジタル化されたデータからC/Aコードと呼ばれる粗い測位用のコードを探す
- 一度C/Aコードが見つかったら、それを時間的に補足しつづける
- C/Aコードよりもかなり遅い速度で伝送されてくる航法データの取得
- 擬似距離の計算
- 測位情報(位置や速度、時刻等)の生成
まず本題に入る前に、C/Aコードについて簡単に説明したいと思います。
C/Aコードというのは、GPS衛星ごとに割り付けられている識別用のデータです。これが受信した信号の中のどの時刻にあるかどうかで、現在どの衛星が見えているのか、そしてどの衛星の電波をどういったタイミングで受信できたか、というのがわかります。
このC/Aコードはとても面白い性質をもっており、複数のC/Aコードが重なっていても、どれがどれであるのか、また同じ衛星のC/Aコードでもタイミングが違えば、両者を識別することが可能となっています。GPSがシステムとして同じ周波数帯を全衛星で共有しても混信しないのは、このコードのお陰です。こういったコードを使う方式はCDMA方式と呼ばれるもので、実は携帯電話もこの技術を使用しています。
ということでGPSの信号処理は、このC/Aコードを抽出することからはじまります。
C/Aコードですが、実は受信信号を見てもあるのかないのか簡単にはわかりません。感覚的に言えば宝捜しをしているような感じです。
理由はいくつかあります。
まずGPS衛星の放出している電波が地上に届くまでに非常に弱くなっているため、受信した信号自体は一見ノイズと区別がつきません。
そして次は、どのGPS衛星が見えているのか、位置や時刻がわらない場合にはわからないことによるものです。そのため、受信した電波に対して、どの衛星のC/Aコードがあるのか、複数または最悪全部をしらみつぶしに探す必要があるためです。
また、C/Aコードは一定時間間隔で繰り返されているので、いいタイミングでキャッチしないと目的のC/Aコードがあるのかないのかわかりません。
さらにはGPS衛星は宇宙空間でかなり高速に動いているので、送信されてくる信号にはドップラー効果が加わり、送られてくる周波数も完全な決め打ちの周波数ではありません。
では実際のところどうすればいいのでしょうか?
いくつか方法があるようですが、全ての方法について共通して言えることは、この辺にこういったあるC/Aコードが存在するはずだというのを処理する側で作ってやり(レプリカ生成)、それと受信信号を比較することによって特定のC/Aコードの有無を判定するというものです。
今回は以前紹介したTSUIさんという方の本(今後、TSUI本と称することにします)の8.7章の方法を使いました。FFTをしまくる方法で、専門用語でいうとCircular Correlation(循環相関方式とでも言うのでしょうか)というらしいです。
前の記事で紹介したNovatel受信機から取り出したデータをこの方法で処理しC/Aコードの有無を調べてみました。図はその結果を示したものです。
結果、衛星番号4,17,24,28のGPS衛星が放出したC/Aコードを抽出することに成功しました。メインソース、C/Aコードに関するソースを置いておきます。その他必要なソースはcommonディレクトリ内のどこかにあると思います。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。