OSQZSS

オープンソース準天頂衛星(QZSS)受信機

BeiDouのICD公開

2012-12-27 21:07:20 | ソフトウェア受信機
BeiDouのICDが公開されました.
公式の英語ページのトップからダウンロードできます.

早速,以前に復調した航法メッセージをデコードしてみました.
Secondary codeの極性を反対にしていたため,航法メッセージの
ビットも反転していましたが,復調自体には問題なかったようです.

さらに,InterleavingやBCHの確認のために,SOWを確認したところ,
30秒のデータから5つのサブフレームを読み出すことができました.
6秒ごとにカウントアップしています.

Subframe 4: 196518
Subfreme 5: 196524
Subframe 1: 196530
Subframe 2: 196536
Subframe 3: 196542

Subframe 1からデコードしたWNは363となりました.
正確には計算していませんが,2006/01/01からのweek numberなので,
だいたい合ってる?

Ephemerisの構成は,ほとんどGPSと同じなので,ソフトウェア受信機に
組み込むのは簡単そう.

しかし,手持ちのアンテナでは受信強度が弱すぎで,まともに復調できる
衛星数が少なく,測位まで出来そうにありません.

BeiDou対応のアンテナが欲しい…

【追記】

ICDと同じプレスカンファレンスで,BeiDouが正式名称だとアナウンスされたようです.
BeiDou Navigation Satellite System.略してBDS.
Dが大文字なのが重要.
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

FFT in Qsys

2012-12-23 13:00:37 | FPGA
備忘録を兼ねて,DE0-NanoでのFFTの実装手順をまとめておきます.

プロジェクトファイルは下記のリンクからダウンロードできます.

http://www.sensorcomm.co.jp/osqzss/fpga/fft/DE0_Nano_QSYS_FFT.zip (3.08MB)

(1) FFTのMegaCore FunctionはQsysではサポートされていないため,
MegaWizard Plug-In ManagerをQuartus IIのToolメニューから起動します.



(2) MegaWizard Plug-In ManagerのPage 1で,Create a new custom megafunction variationを
選択します.

 (クリックで拡大)

(3) 次のページでFFTのmegafunctionを選択します.

 (クリックで拡大)

(4) FFT MegaCore Functionの画面から,Parameterizeをクリックします.

 (クリックで拡大)

(5) Parametersタブで,Target Device FamilyとFFTのサイズを指定します.

 (クリックで拡大)

(6) Architectureタブで,I/O Data Flowの指定します.今回はStreamingを選んでいます.

 (クリックで拡大)

(7) 設定が終了したら,FFT MegaCore Functionの画面でGenerateをクリックします.

(8) MegaCore Functionが生成されると,Quartus IIのFilesにfft.qipが追加されます.



(9) MegaWizardによって生成されたFFT MegaCore FunctionをQsysに取り込むために,
wrapperモジュールを作成します.wrapperの中身は,ダウンロードファイルの中の
fft_avalon_wraper.vを参照してください.(typoだ…)



(10) Qsysを起動したら,まずはいつも通りにNios IIを実装します.

 (クリックで拡大)

(11) FFT MegaCore FunctionをQsysの新しいコンポーネントとして追加するために,
Component LibraryタブからNew component...をクリックします.

(12) Component EditorのHDL Filesタグで,Top Level Moduleとして(9)で作成した
wrapperを追加します.

 (クリックで拡大)

(13) 次にSignalsタブで,InterfaceとSignal Typeを設定します.

 (クリックで拡大)

(14) 次にInterfacesタブを開きます.Master has no read or write interfaceのエラーは,
Remove Interfaces With No Signalsボタンをクリックすると解消されます.
Interface must have an associated resetのエラーは,Associated Resetの
プルダウンメニューから適切なリセット信号を選ぶことで解消します.

 (クリックで拡大)

(15) コンポーネントが正常に生成されると,Libraryに新たなコンポーネントとして追加されます.
早速これをクリックして,FFTをシステムに追加します.

 (クリックで拡大)

(16) FFTの入出力先に,今回はFPGAの内部メモリを使うことにします.Component Linraryから,
On-Chip Memory (RAM or ROM)コンポーネントをシステムに2つ追加します.

 (クリックで拡大)

(17) On-Chip Memoryの名前を,それぞれinput_ram_0とoutput_ram_0とします.

 (クリックで拡大)

(18) input_ram_0のデータをFFTへstreamingとして入力するために,Scatter-Gather DMA Controllerを
システムに追加します.



(19) Transfer modeにMemory to Streamを選択し,sgdma_m2s_0という名前にします.

 (クリックで拡大)

(20) 同様に,FFTからのstreamingの出力をoutput_ram_0に書き込むために,SGDMAを
もう一つ追加します.こちらのTransfer modeはStream to Memoryとなり,名前は
sgdma_s2m_0とします.

 (クリックで拡大)

(21) FFTとSGDMA,SGDMAとOn-Chip Memoryを接続します.

 (クリックで拡大)

(22) これでFFTとNios IIが接続されました.システムをGenerateしてからQuartus IIに戻り,
論理合成をします.



(23) ソフトウェアの開発は,これまでと同じようにNios II Software Build Tools for Eclipseの
ファイルメニューからNios II Application and BSP from Templateを選び,BSPを生成します.

(24) Nios IIからのFFTの実行は,ダウンロードファイルの中のMain.cを参照してください.
基本的な動作としては,まずinput_ram_0とoutput_ram_0の先頭アドレスをそれぞれのSGDMAに
登録.次に入力データとしてサイン波をinput_ram_0に書き込み,FFTを実行,出力データを
output_ram_0から読みだしてJTAG UARTにプリントアウトという流れになっています.
SGDMAで転送されるデータのバイト単位での順番に注意してください.
コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

FFT MegaCore Function

2012-12-22 21:39:42 | FPGA
DE0-Nanoに基本的なGPS受信機の機能が実装できたので,
次のステップとしてFFTによるGPS信号の高速捕捉エンジンを
追加したいと思います.

DSP機能のひとつとして,AlteraからFFTのIPが提供されて
いますので,これを使うことにします.

Altera: FFT MegaCore Function

Qsysでの実装には,Altera Forumの記事を参考にさせて
いただきました.

Altera Forum: FFT in SOPC

とりあえずFFTは256ポイントで,内部メモリに保存した波形を
Scatter-Gather DMAを利用してFFTにストリームとして入力し,
同じように出力結果を内部メモリに書き込んでいます.

50Hzのサイン波をFFTで処理した結果がこちら.
ちゃんと50Hzのところにピークが出ています.



GPS L1 C/A信号は,1.023MHzの拡散符号で変調しているので,
1msの拡散コードを処理するためには,少なくとも2048ポイント,
エイリアシングが怖いので,余裕があれば4056ポイントのFFTが
必要になります.

IFFTも必要ですし,全衛星の拡散符号も保存しておかないといけない.
デシメーションもやらないと.

DE0-Nanoではリソースが足りなくなりそうなので,DE2-115が欲しいな.
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Beidouの航法メッセージ(2)

2012-12-21 21:13:58 | ソフトウェア受信機
secondary codeの謎も解けたので,航法メッセージの
ビット列を読みだしてみました.

GPSと同じように,サブフレームに相当する300ビット毎に
並べてみると,繰り返しのビット列が見つかるはずです.





異なるBeidou衛星の航法データで,それぞれ3B7とEDFが
300ビット毎に出現しています.

これらに共通するb00111011011111のどこかにサブフレームの
先頭を示すpreambleが含まれていると予想されます.

また,どこかにサブフレームIDや送信時刻を示すカウンタが
あるはずですが,さすがに判らない…

大人しくICDの公開を待つのか?
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

BeidouのICDが公開間近

2012-12-19 23:43:27 | ソフトウェア受信機
12月28日,ついにBeidouのICDが公開!...かな?

GPS World: Compass ICD Rumored Again

前回の暫定版はあまりにもがっかりだったので,
今回は頼むよ.

Beidou B1信号(1561.098MHz)の受信には,Antcom社の
3GNSSAシリーズを使用しています.

カタログにはBeidou信号も受信可能と書いてありますが,
B1信号のアンテナゲインは天頂方向で-1dB,仰角30度では
-6dBと低すぎ.

LバンドアンテナであるTrimble社のZephyr Model 2を
試してみたのですが,こちらもいまひとつ.

Beidouを受信したいけど,アンテナがネックになりそう.
コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Beidouの航法メッセージ

2012-12-18 19:15:31 | ソフトウェア受信機
BeidouのICDが出ない限り,航法メッセージのデコードは
出来ないのですが,それでもビット列を眺めていれば,
preambleくらいの手がかりはあるのではないかと思い,
ソフトウェア受信機で信号追尾をしてみました.

あわよくZ-countのようなカウントアップの動作が見つかれば,
送信時刻が推測でき,疑似距離が生成できることになります.







相変わらず信号強度は低いのですが,航法メッセージによる
BPSK変調は観測できます.

予想外だったのがビットの長さ.GPS C/A信号では,1ビットの
長さは20ms(C/Aコード20個分)です.しかし,Beidouでは
1コード(1ms)ごとに変調されているようです.

これで充分なBERが確保できるとは思えないのだが…
FECでも使っているのでしょうか?



航法メッセージを16進数で表示してみると,どうも同じような
パターンが並んでいるだけです.

航法メッセージが放送されていないのか,デコードの方法が
間違っているのか,どうなのだろう?

【追記】

InsideGNSSに掲載されていた記事によると,Beidouの航法
メッセージの構造はGPSとほぼ同じらしい.

InsideGNSS:More Compass Points

やっぱり時刻カウンタの位置は特定されているんだ.

これで受信機によってはBeidouの疑似距離を出力できる
理由に納得.

【追記2】

ふと気付いたのだけれども,同じようなパターンはすべて
20ビット長である.もしかして,secondary codeで変調
しているのだろうか?

出現頻度の高いFD958と026A7は,丁度ビットが反転している
関係にある.

【追記3】

早速Google先生に質問してみたら,secondary codeに関する
参考文献を教えてくれた.

InsideGNSS:Initial Observations and Analysis of Compass MEO Satellite Signal

2007年とか,どれだけ周回遅れなんだ…
勉強不足.

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

L5民生信号でコード測位

2012-12-16 10:54:38 | みちびき
10月に打ち上げられたGalileo IOVの3号機と4号機から,
そろそろL5信号が放送されるようになります.

IOVは,実証実験のためか,4機同時に観測できる時間帯が
多く,すでにL5信号を送信しているGPS Block IIFや
みちびきと組み合わせれば,L5民生信号でのコード測位を
試すことができそうです.

L1 C/Aコードに比べて拡散コードの周波数が10倍ですので,
単純に測位のばらつきだけであれば,10倍の精度向上が
期待できます.

そこで,RTKLibの可視衛星予測機能を使って,東京で
観測できる衛星をチェックしてみました.GPS衛星は
Block IIF衛星のPRN01,PRN24,PRN25のみ使用します.





1日1回程度,Galileo IOVは4機まとめて観測できる
チャンスがあるのですが,GPS衛星は1機しか見えません.
みちびきを加えて,最大6機観測できそうです.

6機観測できればPDOPも2程度と良好で,コード測位の
精度を評価するには十分.

ただし,どうしても仰角が低い衛星が出てくるので,
受信環境の良い基地局でないと難しいかも.

研究室のNovAtel受信機もGalileo対応にアップグレード
しようかな…
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Namuru-NanoのROM化

2012-12-13 22:35:39 | FPGA
Sim's blogの記事を参考に,Namaru-NanoをROM化してみます.

(1) QsysでEPCS Flash Controllerを追加します.



(2) EPCS Flash Controllerの接続は以下の通り.

clkをaltpll_0.c0に接続
resetをclk_0.clk_resetとnios2_qsys_0.jtag_debug_module_resetに接続
epcs_control_portをnios2_qsys_0.data_masterとnios2_qsys_0.instruction_masterに接続

さらに,Exportで出力ポートを指定し,Baseに適当なアドレスを割り振ります.
IRQを指定するのも忘れずに.

 (クリックで拡大)

(3) nios2_qsys_0をダブルクリックして開き,Reset vector memoryに
epcs_flash_controller_0を選びます.



手順(2)でepcs_control_portをnios2_qsys_0のinstruction_masterに接続して
いないと,Reset vector memoryに選ぶことができませんのでご注意ください.

(4) Generationタブを開き,Generateボタンをクリックしシステムを生成します.
Warningが出ますが,とりあえず無視.

 (クリックで拡大)

Qsysでの作業はここまでですので,Quartus IIに戻ります.

(5) メニューバーのAssignmentsからDeviceダイアログを開きます.



さらに,ダイアログ中央のDevice and Pin Options...のボタンをクリックします.

(6) Dual-Purpose Pinsのカテゴリーを選び,DCLK,Data[0],Data[1]/ASDO,
FLASH_nCE/nCSOをUse as regular I/Oにします.

 (クリックで拡大)

(7) メニューバーのAssignmentsからPin Plannerを起動します.



(8) Pin PlannerでEPCSに接続するピンの設定をします.DE0_Nanoでは
data0(PIN_H2),dclk(PIN_H1),sce(PIN_D2),sdo(PIN_C1)です.

 (クリックで拡大)

なお,DE0-NanoのサンプルプロジェクトであるDE0_Nano_GOLDEN_TOPを
利用すると,標準でEPCSを使用するピンの設定になっていていますので,
(5)~(8)の作業は不要です.

(9) Qsysで追加したEPCS Flash Controllerを呼び出せるように,
トップのverilogファイルを修正します.



(10) 以上でQuartus IIでの作業は終了です.コンパイルしてから出来上がった
DE0_Nano.sofをDE0-Nanoに書き込んでおきます.

(11) Nios II Software Build Tools for Eclipseを起動します.

(12) Qsysで新しいシステムを生成したので,BSPを作り直します.BSPプロジェクトを
右クリックしてメニューを開き,Nios IIからGenerate BSPを実行します.



(13) 次に,Namuru_Nanoプロジェクトを右クリックしてメニューを開き,
Build Projectを実行し,新しいNamuru_Nano.elfを生成します.

(14) これでEPCSに書き込むファイルの準備が整いました.Namuru_Nanoプロジェクトを
右クリックしてメニューを開き,Nios IIからFlash Programmerを起動します.



(15) Nios II Flash ProgrammerのFileメニューからNewを選び,
SOPC Information Fileを選択します.

 (クリックで拡大)

(16) Files for Flash ConversionのAddボタンをクリックして,
まずはELFファイルを選択します.

 (クリックで拡大)

(17) 次に,SOFファイルを追加します.

 (クリックで拡大)

(18) これでFPGAに書き込む回路とNios IIで実行するソフトウェアの両方を
EPCSに書き込む準備ができました.CPU nameに関するwarningは無視します.
Startをクリックすると,書き込みが開始されます.

 (クリックで拡大)

手順(2)でepcs_flash_controllerのresetをnios2_qsys_0のjtag_debug_module_resetに
接続していないと,EPCSの書き込みでエラーが発生しますのでご注意ください.

(19) 以上で書き込み終了です.DE0-Nanoの電源を落とし再起動すると,
Namuru-Nanoが実行されるようになりました.GPS受信機の完成です!
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

測位演算機能の追加

2012-12-12 18:53:17 | FPGA
半年ぶりのNamuru-Nano.
ツールの使い方をすっかり忘れている…

後処理による測位で,疑似距離は正常に生成されている
ことは確認できていたので,測位演算のタスクを実装.

2時間ほど動作させてみたけれど,特に問題もなく動き
続けています.測位精度も前回の後処理と同じレベル.



さて,GPS受信機としてフルに動作するようになったので,
次はDE0-Nano単体で動作するように,ROM化を試してみよう.

Sim's blog:DE0でNios IIのROM化
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

放送歴との比較

2012-12-02 12:45:07 | みちびき
ローカル座標系の間違いを改修したついでに,
みちびきの放送歴と最終歴の比較もしてみました.

比較したのはQZ-visionからダウンロードした
brdc3300.12qqzfq17160.sp3です.



Radial方向にやけに大きなオフセットが…
放送歴の計算を間違っているのか?

公開されているSIS-UREの精度と比較すると,
随分と誤差が大きいのが気になります.

【追記】

SP3の軌道は衛星重心,放送歴はアンテナ位相中心の
位置なので,ただ差分を取っただけではRadial方向に
マイナスのオフセットが生じてしまうようだ.

MGEXのサイトを見ると,重心からアンテナまで3m程度.
今回の結果とだいたい一致します.
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする