Quantcast
Channel: OSQZSS
Viewing all 643 articles
Browse latest View live

USRP N210でGPS信号の受信

$
0
0
USRP N210の動作が確認できたので,いつものようにGPS信号を受信してみます.
受信した信号をファイルに記録するために,UHD examplesのひとつである
rx_samples_to_fileを使います.

$ ./rx_samples_to_file --file gps.bin --type short --nsamp 5000000 --rate 5000000 --freq 1575420000 --gain 40
linux; GNU C++ version 4.8.2; Boost_105400; UHD_003.008.000-14-ga90a6af0

Creating the usrp device with: ...
-- Opening a USRP2/N-Series device...
-- Current recv frame size: 1472 bytes
-- Current send frame size: 1472 bytes
Using Device: Single USRP:
Device: USRP2 / N-Series Device
Mboard 0: N210r4
RX Channel: 0
RX DSP: 0
RX Dboard: A
RX Subdev: WBXv3 RX+GDB
TX Channel: 0
TX DSP: 0
TX Dboard: A
TX Subdev: WBXv3 TX+GDB

Setting RX Rate: 5.000000 Msps...
Actual RX Rate: 5.000000 Msps...

Setting RX Freq: 1575.420000 MHz...
-- Tune Request: 1575.420000 MHz
-- The RF LO does not support the requested frequency:
-- Requested LO Frequency: 1575.420000 MHz
-- RF LO Result: 1575.421245 MHz
-- Attempted to use the DSP to reach the requested frequency:
-- Desired DSP Frequency: 0.001245 MHz
-- DSP Result: 0.001245 MHz
-- Successfully tuned to 1575.420000 MHz
--
Actual RX Freq: 1575.420000 MHz...

Setting RX Gain: 40.000000 dB...
Actual RX Gain: 38.000000 dB...

Waiting for "lo_locked": ++++++++++ locked.

Done!

N210のRXゲインは,最大で38dBのようです.
データレートは5MHzにダウンコンバートしています.

bladeRFなどでは,サンプリング周波数とベースバンドフィルタの帯域を
ユーザが指定することができますが,N210のアーキテクチャは異なります.

Ettus Research: USRP Bandwidth

RX2のラインでは,カットオフ周波数40MHzのLPFを通ったアナログ信号が,
ADCによって100MHzのサンプリング周波数でデジタル化されます.
それをDDC(digital down converter)によって,デシメーションしています.

記録されたデジタル信号のPSDはこんな感じ.
ベースバンドフィルタの帯域を指定できるbladeRFとは,大きく異なります

 (クリックで拡大)

DCオフセットは少なめ.

 (クリックで拡大)

GPS信号も問題なく見つかりますが,ノイズフロアがかなり不安定です.
GPS信号用のBPFをRFラインに挿入した方が良いのかな?

 (クリックで拡大)

 (クリックで拡大)

とりあえず受信の確認はできたので,次はTXに挑戦しよう.

USRP N210でRF Record & Playback

$
0
0
USRPを開発しているEttus Researchは2010年にNational Instrumentsに買収され,
NIからもNI-USRPとして同じデバイスが販売されています.

NI-USRPのコミュニティーを探してみると,ぴったりのトピックが見つかりました.

NI Community: RF Record and Playback with NI USRP

GPS信号の記録と再生についても取り上げられており,セットアップについても
いくつかヒントがありました.

1. GPS信号のBPSは必要.
2. 16dBのアクティブアンテナに加えて,30dBのアンプも追加.
3. GPSDOなど,より安定した外部クロックを入力.
4. Txのレベルは0dBのゲイン設定で-15dBm.
5. GPS信号のレベルにするには,十分なattenuationが必要.

別の実験で使用したフィルタ付きのLNAが手元にあったので,
1と2はこれで解決.



外部入力に使えそうなクロックはないので,3はあきらめます.
USRP N210は,2.5ppmのTCXOを搭載しているので,短時間での
安定性は,そこまで問題にならないように思えます.

このセットアップで,前回同様にGPS信号をファイルに記録します.
データレートは,GPS L1信号の帯域に合わせて,2.5MHzにしました.

$ ./rx_samples_to_file --file gps.bin --type short --nsamp 250000000 --rate 2500000 --freq 1575420000 --gain 30

LNAを追加したため,14ビットのADCのレンジを有効に使っています.

 (クリックで拡大)

BPFのおかげで,ノイズフロアも安定しています.

 (クリックで拡大)

 (クリックで拡大)


さて,次はファイルに記録されたデータをGPS L1信号の周波数で送信します.

仕様上,地上でのGPS信号の受信レベルは,-130dBmとされています.
オープンスカイであれば,+20dB程度の信号が観測されるので,
Txのレベルが-110dBmになるようにattenuatorを挿入します.



これをubloxのGPS受信機に接続し,送信開始.

$ ./tx_samples_from_file --file gps.bin --type short --rate 2500000 --freq 1575420000 --gain 0
linux; GNU C++ version 4.8.2; Boost_105400; UHD_003.008.000-14-ga90a6af0

Creating the usrp device with: ...
-- Opening a USRP2/N-Series device...
-- Current recv frame size: 1472 bytes
-- Current send frame size: 1472 bytes
Using Device: Single USRP:
Device: USRP2 / N-Series Device
Mboard 0: N210r4
RX Channel: 0
RX DSP: 0
RX Dboard: A
RX Subdev: WBXv3 RX+GDB
TX Channel: 0
TX DSP: 0
TX Dboard: A
TX Subdev: WBXv3 TX+GDB

Setting TX Rate: 2.500000 Msps...
Actual TX Rate: 2.500000 Msps...

Setting TX Freq: 1575.420000 MHz...
-- Tune Request: 1575.420000 MHz
-- The RF LO does not support the requested frequency:
-- Requested LO Frequency: 1575.420000 MHz
-- RF LO Result: 1575.421245 MHz
-- Attempted to use the DSP to reach the requested frequency:
-- Desired DSP Frequency: -0.001245 MHz
-- DSP Result: -0.001245 MHz
-- Successfully tuned to 1575.420000 MHz
--
Actual TX Freq: 1575.420000 MHz...

Setting TX Gain: 0.000000 dB...
Actual TX Gain: 0.000000 dB...

Checking TX: LO: locked ...

Done!

u-centerで受信を確認してみると,見事に測位しています!

 (クリックで拡大)

これでGNSS信号シミュレータに一歩近づきました.
次は,ベースバンド信号を数値的に生成して送信できるようにしよう.

【追記】メモ

NI Community: GPS Simulation with NI USRP and LabVIEW

bladeRFで再挑戦

$
0
0
USRP N210でコツをつかんだので,bladeRFでのrecord & playbackに再挑戦.

GPS信号の受信では,USRPと同様にBPF付きのLNAを追加.ゲインは40dBです.
bladeRFでは,I/Q信号の分布を確認しながら,rxvga1を30dBに,rxvga2を18dBに
調整しました.

このrxvga1とrxvga2は,それぞれLMS6002DのMixerとLPFの後段のゲインになります.

 (クリックで拡大)

Recordの手順は以下の通り.

$ bladeRF-cli -i

bladeRF> set frequency 1575.42M

Set RX frequency: 1575420000Hz
Set TX frequency: 1575420000Hz

bladeRF> set samplerate 4M

Setting RX sample rate - req: 4000000 0/1Hz, actual: 4000000 0/1Hz
Setting TX sample rate - req: 4000000 0/1Hz, actual: 4000000 0/1Hz

bladeRF> set bandwidth 2.5M

Set RX bandwidth - req: 2500000Hz actual: 2500000Hz
Set TX bandwidth - req: 2500000Hz actual: 2500000Hz

bladeRF> set rxvga1 30
bladeRF> print rxvga1

RXVGA1 Gain: 30dB

bladeRF> set rxvga2 20
bladeRF> print rxvga2

RXVGA2 Gain: 18dB

bladeRF> cal lms

Calibrating LMS LPF tuning module...
LPF tuning module: 23

Calibrating LMS TX LPF modules...
TX LPF I filter: 35
TX LPF Q filter: 27

Calibrating LMS RX LPF modules...
RX LPF I filter: 1
RX LPF Q filter: 35

Calibrating LMS RXVGA2 modules...
RX VGA2 DC reference module: 25
RX VGA2 stage 1, I channel: 37
RX VGA2 stage 1, Q channel: 21
RX VGA2 stage 2, I channel: 33
RX VGA2 stage 2, Q channel: 27

bladeRF> cal dc rx

RX DC I Setting = 38, error ~= -2
RX DC Q Setting = 34, error ~= 6

bladeRF> rx config format=bin file=gps.bin n=400000000
bladeRF> rx start
bladeRF> rx

State: Running
Last error: None
File: gps.bin
File format: SC16 Q11, Binary
# Samples: 400000000
# Buffers: 32
# Samples per buffer: 32768
# Transfers: 16
Timeout (ms): 1000

DCのキャリブレーションが上手く行き,オフセットのない信号が受信できました.

 (クリックで拡大)

 (クリックで拡大)

GPS信号の受信も確認できます.

 (クリックで拡大)

次は,記録したデータを同じRFの設定で再生します.

bladeRFでは,TXのゲイン設定でattenuationもできます.
RFラインに挿入した50dBのattenuatorに加えて,txvga1を-10dBに設定しました.

Playbackの手順は以下の通り.

bladeRF> set txvga1 -10
bladeRF> print txvga1

TXVGA1 Gain: -10dB

bladeRF> print txvga2

TXVGA2 Gain: 0dB

bladeRF> cal dc tx

TX DC I Setting = -147, error ~= 25.489208
TX DC Q Setting = 474, error ~= 10.132919

bladeRF> tx config file=gps.bin format=bin
bladeRF> tx start
bladeRF> tx

State: Running
Last error: None
File: gps.bin
File format: SC16 Q11, Binary
Repetitions: 1
Repetition delay: none
# Buffers: 32
# Samples per buffer: 32768
# Transfers: 16
Timeout (ms): 1000

TXのDCオフセットのキャリブレーションがあまり上手くいっていません.
それでも,bladeRFのTXに接続されたubloxの受信機で無事に受信を確認.

 (クリックで拡大)

しかし,信号を捕捉するのですが,しばらくするとロックが外れてしまいます.
コールドスタートをかけると再捕捉するので,信号は途切れずに出力されているようです.

搬送波信号のQiを見ると,多くの信号で3となっており,あまり良い品質ではありません.
どうやら,再生されている信号の周波数の安定性がいまひとつのようです.

USRPでも外部クロックを推奨されていたので,OCXO搭載のGPSDOでも購入しようかな.

【追記】Myriad RFのプロジェクトが増えている.

https://myriadrf.org/

HackRFでもRecord & Playback

$
0
0
勢いに任せて,HackRF OneでもGPS信号のrecord & playbackに挑戦.



GPS信号の受信では,帯域が2.5MHzになるように,サンプリングレートを2.6MHzに設定.
ゲインは,I/Q信号の分布を確認しながら,ベースバンドを30dB,LNAを40dBにしました.

$ hackrf_transfer -r gps.bin -f 1575420000 -s 2600000 -n 260000000 -g 30 -l 40 -a 0
call hackrf_sample_rate_set(2600000 Hz/2.600 MHz)
call hackrf_baseband_filter_bandwidth_set(2500000 Hz/2.500 MHz)
call hackrf_set_freq(1575420000 Hz/1575.420 MHz)
call hackrf_set_amp_enable(0)
samples_to_xfer 260000000/260Mio
Stop with Ctrl-C
5.0 MiB / 1.000 sec = 5.0 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
2.6 MiB / 1.000 sec = 2.6 MiB/second
2.4 MiB / 1.000 sec = 2.4 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.0 MiB / 1.000 sec = 5.0 MiB/second
4.5 MiB / 1.000 sec = 4.5 MiB/second
3.1 MiB / 1.000 sec = 3.1 MiB/second
1.0 MiB / 1.000 sec = 1.0 MiB/second
5.0 MiB / 1.000 sec = 5.0 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
4.7 MiB / 1.000 sec = 4.7 MiB/second

受信は確認できるものの,ゼロ近辺の値の頻度だけが突出しています.
気になりますが,いまのところ原因不明.

 (クリックで拡大)

 (クリックで拡大)

 (クリックで拡大)

また,長時間連続してデータを記録していると,ときおり転送レートが低下しており,
取りこぼしがありそうです.この転送レートの低下は,TXのときには発生しません.
USB 2.0ではなく,HDDへの書き込みの問題?

hackrf_transfer -t gps.bin -f 1575420000 -s 2600000 -a 1 -x 0
call hackrf_sample_rate_set(2600000 Hz/2.600 MHz)
call hackrf_baseband_filter_bandwidth_set(2500000 Hz/2.500 MHz)
call hackrf_set_freq(1575420000 Hz/1575.420 MHz)
call hackrf_set_amp_enable(1)
Stop with Ctrl-C
5.0 MiB / 1.000 sec = 5.0 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.0 MiB / 1.000 sec = 5.0 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second
5.2 MiB / 1.000 sec = 5.2 MiB/second

User cancel, exiting...
Total time: 100.01574 s
hackrf_stop_tx() done
hackrf_close() done
hackrf_exit() done
fclose(fd) done
exit

TXのRFゲインとして14dBのMGA-81563をオンにしています.
このときのRFラインに挿入したattenuatorは60dBです.

ubloxの受信機で信号を確認すると,問題なく受信できました.
しかし,やはり記録したファイルにデータの取りこぼしがあるようで,
そのタイミングで信号が落ちてしまいます.

 (クリックで拡大)

HackRF Oneに搭載されている25MHzの基準クロックは水晶振動子で,周波数偏差は20ppmです.

Kyocera: Surface Mount Type CX3225GB

bladeRFに搭載されている38.4MHz+/-1ppmのVCTCXOと比較すると許容偏差が大きいのですが,
受信信号のQiは6を示すこともあり,比較的良好です.

HackRF Oneの受信ポートは,アクティブアンテナ用に3.3VのDCを供給できるのが魅力的.
送信時もMGA-81563をオフにすれば,必要なattenuatorの数も減らせる?
受信データの取りこぼしさえなければ,かなり使えそうです.
SSDで試してみるかな.

【追記】HackRFの基板にアクセスしたかったので,ケースを取り外す.



上側に爪がついていて,下側の穴に引っかけています.
かなりキツイので,ケースにキズを付けずに外すのは難しそう.

P22にCLKINとVCC,GNDのピンが出ているので,ここにTCXOを搭載した
子基板を差し込んで,クロックの精度を改善しよう.

CLKINは10MHzのCMOS入力.Digikeyで探してみたけれど,あまり選択肢はない.

FOX924B: OSC TCXO 10.000MHZ HCMOS SMD

【追記2】アナログ部のRFシールドは未実装.これもDigikeyで購入できる.

BMI-S-230-F-R: BOARD SHIELD 2INX1.5IN FRAME
BMI-S-230-C: BOARD SHIELD 2INX1.5IN COVER

【追記3】アクリルケースを付ける.OSH Stensilsから購入できます.



HackRFの問題解決

$
0
0
HackRFで記録したGPS信号にゼロ近傍の値が多いのは,サンプリングレートに
関係なく,初めの10msの間だけのようです.解決方法があるのかもしれませんが,
とりあえず最初の受信データは捨てることにします.

受信データの欠損ですが,hackrf-devに質問を投げたら,すぐに解決方法を
教えてくれました.

まず,通信の問題かHDDの問題か切り分けるために,ファイルへの書き込みなしで
hackrf_transferを実行します.

$ hackrf_transfer -r /dev/null -f 1575420000 -s 2600000 -n 260000000 -g 30 -l 40 -a 0

これであれば,転送レートが低下することがありませんでした.
どうやらHDDへの書き込みが問題のようです.

そこで,データの書き込みにramdiskを使います.

$ sudo mkdir /tmp/ramdisk
$ sudo chmod 777 /tmp/ramdisk
$ sudo mount -t tmpfs -o size=1G tmpfs /tmp/ramdisk
$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/sda5 112252 23470 83058 23% /
none 1 0 1 0% /sys/fs/cgroup
udev 3921 1 3921 1% /dev
tmpfs 787 2 786 1% /run
none 5 0 5 0% /run/lock
none 3932 1 3931 1% /run/shm
none 100 1 100 1% /run/user
tmpfs 1024 0 1024 0% /tmp/ramdisk
$ hackrf_transfer -r /tmp/ramdisk/gps.bin -f 1575420000 -s 2600000 -n 260000000 -g 30 -l 40 -a 0

記録したデータを再生してみると,GPS受信機で信号が途切れることなく観測できました.
ノートPCのHDDをSSDに換装しようかな.

しかし,Qiは5や6になることが時々あるものの安定せず,航法メッセージがデコードできません.
水晶振動子ではダメか.次は外部クロックを試そう.

一発で測位まで確認できたUSRP N210とは比較になりませんが,価格的には圧倒的に安価.
GNSS信号の記録・再生も,不安定ながら何とかなりそうな感じです.
HackRF One,お勧めです!

【追記】TXでMGA-81563をオフにして,RFラインから相当分のattenuatorを
外したのですが,この組み合わせでは信号が確認できませんでした.
トータルのゲインが合っていれば受信できるものでもないのかな?

【追記2】HackRF OneのクローンがIndieGoGoでキャンペーン中.オリジナルより$100ほど安い.

IndieGoGo: HackRF Blue - A $200 HackRF

【追記3】フェライト,すごい!

YouTube: Hackrf usb cable reduce noise with ferrite

スマートアンテナの試作

$
0
0
小型衛星用GNSS受信機モジュールfireflyの実装例として,スマートアンテナを設計してみました.
Elecrowから基板が届いたので,早速実装.





firefly受信機モジュールのスマートアンテナということで,「fireant」と命名.
アンテナのantと,小型であるということで蟻を掛けています.

FreeCADで設計した筐体の試作には,光造形を試してみました.
切削加工はさすがに高価なので,3Dプリントサービスを調べていたら,こんなサービスを発見.

株式会社クロスエフェクト:光造形エコノミー便

小型の造形物で,納品まで10日待てるのであれば,通常の1/3程度の価格でサービスが受けられます.

仕上がってきた筐体がこちら.
厚みのある板状のためか,多少反っていますが,フィットチェックにはまったく問題ありません.



半透明の素材のおかげで,展示用に丁度良いかも.





何だかこれで満足してしまいましたが,本題の受信性能もちゃんと調べます.

WindowsでHackRF

$
0
0
HackRF Oneのhost softwareをWindowsでbuildしようとしたのですが,
いろいろと嵌ったので,メモを残しておきます.

公式の手順はこちら.あっさりしすぎ.

HackRF: How to build host software on Windows

まずは,MinGWをインストールします.

MinGW: mingw-get-setup.exe (2013-10-04)

インストール先はC:\MinGWを選びます.

 (クリックで拡大)

Basic Setupからは,以下のパッケージを選択しました.

mingw-developer-toolkit
mingw32-base
mingw32-gcc-g++
msys-base

 (クリックで拡大)

pthreadsも忘れずにインストールします.

 (クリックで拡大)

パッケージの選択が完了したら,InstallationメニューからApply Changesをクリックし,
インストールを開始します.

 (クリックで拡大)

さて,ここでMinGWのインストールの確認のためにgccを実行してみると,
ドライブにディスクがありませんと警告がでます.

 (クリックで拡大)

どうやら,MinGWのパッケージに含まれるgccは,まずはEドライブを探しに行くようです.
実行環境によっては,Eドライブが存在しないために,この警告が出てしまいます.

MinGWのフォーラムにバグとして報告されているのですが,去年の12月から動きがありません.

MinGW: No Disk error when running g++ from cmd/tcc while a card reader with empty slots is connected

Windows版のgccの開発は,MinGW-w64にシフトしたようなので,こちらをインストールします.

MinGW-w64: mingw-w64-install.exe (2014-10-30)

設定はとりあえずデフォルトで.インストール先はC:\mingw-w64にしています.

 (クリックで拡大)

次に,CMakeをインストールします.

CMake: Win32 Installer (cmake-3.1.0-rc2-win32-x86.exe)

インストール先のフォルダはC:\CMakeを選びます.PATHは後から追加します.

 (クリックで拡大)

これで開発ツールは整いました.環境変数のPATHに以下の順番でフォルダを追加します.

C:\CMake\bin;C:\mingw-w64;C:\MinGW\bin;C:\MinGW\msys\1.0\bin

つづいて,libusbxをダウンロードして,C:\libusbx-1.0.18-winへ展開します.

libusbx: libusbx-1.0.18-win.7z (2014-01-25)

最後に,HackRFのパッケージをダウンロードして,C:\hackrfへ展開します.

HackRF: hackrf-2014.08.1.zip (2014-08-28)

これでbuildに必要なパッケージがすべて揃いました.
Windowsのアクセサリからコマンドプロンプトを起動し,以下の手順でhost softwareをbuildします.

>cd C:\hackrf\host
>mkdir build
>cd build
>cmake ../ -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=C:\libusbx-1.0.18-win\include\libusbx-1.0 -DLIBUSB_LIBRARIES=C:\libusbx-1.0.10-win\MinGW32\dll\libusb-1.0.dll
>make

こでれ,HackRFのツールとライブラリがbuildされます.
ツールの実行に必要な以下のファイルを一式,C:\hackrf\binにコピーします.

C:\MinGW\bin\pthreadGC2.dll
C:\libusbx-1.0.18-win\MinGW32\dll\libusb-1.0.dll
C:\hackrf\host\build\libhackrf\src\libhackrf.dll
C:\hackrf\host\build\hackrf-tools\src\hackrf_info.exe
C:\hackrf\host\build\hackrf-tools\src\hackrf_transfere.exe

HackRFのUSBドライバのインストールには,zadigを使用します.

zadig.akeo.ie: zadig_v2.1.1.exe (2014-11-30)

HackRFをUSBポートに接続し,zadigを実行します.
デバイスにHackRF Oneを選び,WinUSBをインストールします.

 (クリックで拡大)

デバイスマネージャーを開くと,Universal Serial Bus devicesとして
HackRF Oneが認識されています.

 (クリックで拡大)

コマンドプロンプトからhackrf_infoを実行すると,無事にHackRF Oneが見つかりました.

 (クリックで拡大)

ubuntuと同様に,まずはファイル書き込みなしで受信データの転送を確認します.
Linuxの/dev/nullは,Windowsではnulになります.(nullではないので注意.)

>hackrf_transfer.exe -r nul -f 1575420000 -s 2600000 -n 260000000 -g 30 -l 40 -a 0

データ転送は問題ないようですが,実行停止の際にエラーが発生します.
これは,HackRFのページでもNote for Windows buildとして言及されていますが,
コマンドプロンプトを使っても解決しない?

とりあえず,WindowsからでもHackRF Oneが動きそうなので,
taro君のGNSS-SDRLIBに繋いでみよう.

taroz: GNSS-SDRLIB

Visual StudioでHackRF

$
0
0
GNSS-SDRLIBでHackRFを使うためには,Visual Studioでビルドできないとダメなのかと思い,
こちらを参考にVisual Studio Express 2012で試してみました.

HackRF.net: Compile HackRF using Visual Studio

中国語ですが,雰囲気は判ります.

すでにCMakeはインストール済みなので,libusb-1.0とpthreadをダウンロードし,Cドライブの直下に展開します.

libusb-1.0.18-win.7z (2014-01-25)
pthreads-w32-2-9-1-release.zip (2012-07-12)

HackRFのパッケージは,新たにC:\hackrf_vseに展開しました.

これで準備が整ったので,コマンドプロンプトからCMakeを実行し,Visual Studioのプロジェクトを生成します.

 (クリックで拡大)

生成されたソリューションファイルをダブルクリックして,Visual Studioでプロジェクトを開きます.

 (クリックで拡大)

さて,このままBuild Solutionを実行すると,エラーが発生します.

 (クリックで拡大)

これは,変数の宣言を関数の先頭に移すことで解決します.

 (クリックで拡大)

ビルドが成功すると,HackRFのライブラリとツールが,それぞれ以下のフォルダに出来上がります.

C:\hackrf_vse\host\build\libhackrf\src\Release
C:\hackrf_vse\host\build\hackrf-tools\src\Release

ツールの実行に必要なファイルを一式,C:\hackrf_vse\binにコピーします.

libusb-1.0.18-win\MS32\dll\libusb-1.0.dll
pthreads-w32-2-9-1-release\Pre-built.2\dll\x86\pthreadVSE2.dll
C:\hackrf_vse\host\build\libhackrf\src\Release\hackrf.dll
C:\hackrf_vse\host\build\hackrf-tools\src\Release\hackrf_info.exe
C:\hackrf_vse\host\build\hackrf-tools\src\Release\hackrf_transfere.exe

これでVisual StudioでビルドしたHackRFのツールが使えるようになりました.

スマートアンテナの受信性能

$
0
0
小型衛星向けのスマートアンテナであるfireantの受信性能を,
市販のGPS+GLONASSアンテナに接続したfirefly評価キット
比較してみました.

評価基板に付属しているアンテナは,TallysmanのTW4421になります.
fireantと一緒にならべて,屋上で受信します.



実験したときのskyplotは,こんな感じです.



Tallysmanのアンテナで受信した信号強度はこちら.



それに対して,スマートアンテナのfireantはこちら.



高仰角の衛星の信号強度はfireantの方がわずかに低めになり,
低仰角だと逆にfireantの方が随分と高めに出ています.

グランドプレーンの効果があまりなく,ビームが広めなのかもしれません.
地上ではマルチパスの問題がありますが,宇宙であれば関係ないかも.

また,fireantではGLONASSの信号強度の方がGPSより低めです.
アンテナの中心周波数がずれているのかな?

何の調整もせずにそれなりに受信できていますが,いまひとつ.
もう少し受信性能を改善したいところです.

HackRF One External Clock

$
0
0
GPSDOをお借りすることができたので,HackRF OneのCLKINに接続.
その効果を試してみます.

Jackson Labs: GPSTCXO Eval Board



HackRF OneのCLKINへの入力は,10MHzのLVCMOSレベルとなります.
3.3Vを超えたりマイナスの電圧にならないよう,注意しましょう.

HackRF Oneは,CLKINへの入力を検知すると,自動的にそちらに
リファレンスを切り替えます.CLKINが選択されているかどうかは,
以下のコマンドで確認できます.

$ hackrf_si5351c -n 0 -r
[ 0] -> 0x01

ちなみに,CLKINが選択されていないときは,0x51が返ってきます.

後は,これまでと同じように,GPS信号を記録・再生します.



GPSDOの効果はてき面で,再生したGPS信号でスムーズに測位できました.
信号のQiもすべて7で,問題なく航法データがデコードできています.
信号強度も高目な気がします.

 (クリックで拡大)

これはもうGPSDOを買うしかない!

DST: GPS同期10MHzのTCXO信号源 GPSTCXO

bladeRFも問題解決

$
0
0
bladeRFのTXが安定しなかったのも,RXデータのHDDへの書き込み速度の
問題かと思われるので,同じセットアップでramdiskへ記録してみました.



その結果,bladeRFでも無事にGPS信号のplaybackに成功.
bladeRFのTXに接続されたubloxのGPS受信機で,とても安定した
受信と測位が確認できました.

 (クリックで拡大)

TXデータの読み出しは,HDDからでもramdiskからでも変化なし.
RXデータの書き込み速度だけの問題のようです.
そろそろSSD搭載の新しいノートPCを買わないとダメかな.

nuandのショップから購入できるbladeRFは,出荷前にVCTCXOの
周波数オフセットを40ppb(0.04ppm)にキャリブレートしてくれるようです.

nuand: bladeRF x40

別売りの専用ケースも購入すると,bladeRF x40は合計で$440.
リファレンスクロックが20ppmのXOで,送受信がhalf-duplexの
hackRFが$300することを考えると,お買い得かも.

【追記】bladeRFもWindowsで動くようにしておこう.

bladeRF wiki: Getting Started: Windows

GPS signal simulation

$
0
0
GPS信号のrecord & playbackが出来るようになったので,次のステップとして,
numericalに生成したベースバンド信号のTXに挑戦です.

まずは,単純にドップラーなしのC/Aコードを生成し,サンプリングします.
C/AコードはPRN01を選びました.

信号の生成を簡単にするために,1チップにつき4サンプルとしたので,
サンプリング周波数は1.023×4=4.092MHzとなります.

これに適当なガウスノイズを加えた後,ローパスフィルタを通します.
今回はTXにbladeRFを使うため,量子化は12ビットに収まるようにしています.

 (クリックで拡大)

 (クリックで拡大)

FIRフィルタの設計は初めてなので,いまひとつパラメータの設定が
思うようにいきませんが,とりあえずこれで良しとします.

確認のためにソフトウェア受信機で信号を探してみると,当然ながら
PRN01だけが見つかります.

 (クリックで拡大)

さて,これでベースバンド信号は準備できましたので,bladeRFを
GPS受信機に接続し,1575.42MHzの中心周波数でTXしてみます.

 (クリックで拡大)

無事にPRN01の受信が確認できましたが,Qiは3と低いままです.
ローパスフィルタのカットオフ周波数が低すぎるのがダメなのかな?

まだまだ課題は山積みですが,GPS信号シミュレータへ一歩近づきました.

【追記】bladeRFはtxvga1でattenuationが設定できるので,
ベースバンド信号にノイズを加えなくても適切なSNRが得られます.
USRP N210やHackRFにはない機能で,地味に便利.

 (クリックで拡大)

複数衛星もいける!

 (クリックで拡大)

【追記2】libbladeRF.hで定義されているtxvga1の最大値と最小値.

#define BLADERF_TXVGA1_GAIN_MIN (-35)
#define BLADERF_TXVGA1_GAIN_MAX (-4)

航法メッセージの追加

$
0
0
GPS signal simulatorに,航法メッセージの機能を追加しました.
RINEXファイルから読み込んだephemerisでsubframe 1,2,3を生成.
almanacの生成は面倒だったので,subframe 4と5はpage 25に固定しています.

読み込んだephemerisの衛星番号と同じPRN02でbaseband信号を生成し,
bladeRFでTXした結果がこちら.

 (クリックで拡大)

航法メッセージの追加で,信号のQiが3から7になり,
Z-counterとephemerisのデコードにも成功しています!

後は,ephemerisから計算された衛星位置と任意の受信機位置から
疑似距離を計算し,それに応じた適切なコード遅延をC/Aコードに
与えれば,GPS信号シミュレータの完成です.

HackRF One External TCXO

$
0
0
Elecrowから届いた基板で,HackRF Oneのexternal clockピンに10MHzのTCXOを接続.



TCXOはDigikeyから購入したFOX924B.周波数安定性は2.5ppmです.
3.3Vの電源は,近くのヘッダピンから取っています.

GPSDOほどの安定性は望めませんが,それでも内蔵のXOよりはましなはず.
早速,GPS信号のrecord & playbackを試してみます.



結果は残念賞.多少は信号が安定して航法メッセージのデコードまで進むものの,
Qiは相変わらず4から6あたりを行ったり来たり.信号強度もふらふらしています.

 (クリックで拡大)

何がいけないのだろう?
HackRF Oneは手軽なデバイスなので,なんとかしたいな.

コード遅延の追加

$
0
0
常に変化している衛星と受信機間の距離に応じたコード遅延と
ドップラでbasebandを生成するのは思っていた以上に難しい.

いまひとつ信号が安定しませんが,なんとか初測位.

 (クリックで拡大)

ちなにみ,simulatorで設定した受信機位置は,以下の通り.

llh[0] = 35.666531 / R2D;
llh[1] = 139.792383 / R2D;
llh[2] = 58.475;

測位結果は数百mほどずれていますが,初めてとしてはまずまず.

今年はここまでかな.

一進一退

$
0
0
年明け早々,足首を痛めてしまい,自宅で療養していたらすっかり引きこもりに.
やっとテンションが上がってきたので,GPS信号シミュレータを細々と改修.

 (クリックで拡大)

全衛星の信号捕捉から航法メッセージのデコードまでスムーズに進むように
なったものの,相変わらず疑似距離残差が大きく,測位結果はINVALIDのまま.
しばらくすると,受信機側で自動にリセットしてしまう.

航法メッセージのエンコードにバグがあるのか,コード遅延の計算にミスがあるのか,
切り分けが難しい…

【追記】参考までにRAWデータ.Dopplerが大きな衛星で残差も大きな傾向?

 (クリックで拡大)

【追記2】どうも処理が重いのでプロファイラで評価したいけれど,
Visual Studioでプロファイラが使えるのは2010までだとPremium以上,
2012ではProfessionalから.手元にあるのは2008のProfessional…

3D FIXの成功

$
0
0
疑似距離の生成にバグを発見.
やっと3D FIXまでたどり着けました!

 (クリックで拡大)

しかし,相変わらず30秒ほどすると受信機がリセットしてしまいます.
サブフレームをすべてデコードしたタイミングでもあるので,
ephemeris以外のコンテンツに不具合があるのかもしれません.
サブフレーム4と5で,別のページを試してみよう.

あと,ubloxの受信機が自動にリセットする条件も知りたい.
シリアル通信の接続ごと切れるので,Hardware Resetなのか?

【追記】試しに受信機をLEA-4Tから6Tにしてみたら,
Qiが3から先に進まず,航法メッセージがデコードできない.
受信機内部で航法メッセージのvalidityをどのような条件で
チェックしているのか不明ですが,いずれにせよサブフレームの
生成には問題がありそう.

GPS信号シミュレータの完成

$
0
0
ubloxの受信機をパッチアンテナに繋げて,ライブのGPS信号を受信しながら
航法メッセージを眺めていると,サブフレーム4と5のページ番号に51や57など,
明らかに大きな数字が出力されていることに気づきました.

ICDを読み直してみると,サブフレーム4と5には,ページ番号そのものではなく,
それに対応したSV IDというものが挿入されているようです.RTFM!

シミュレータではページ番号を25に固定していますので,この場合のSV IDは
サブフレーム4では63,サブフレーム5では51になります.

また,サブフレーム1の送信時刻は,30秒の整数倍のGPS時刻に揃っているようです.
つまり,サブフレーム1のHOWに含まれるTOWのmodulo 30は,常に6秒となります.

この2つの修正で,30秒ごとの受信機リセットも解消され,LEA-6Tでも
スムーズに測位できるようになりました.



 (クリックで拡大)

まだベースバンド信号ファイルを生成するだけのオフラインのシミュレータですが,
とりあえず動作するものが完成です.

bladeRFにはLE数の大きなFPGAが搭載されているので,これを上手く使って
リアルタイム化したいな.

【追記】fwriteでサンプリング毎にファイルに書き込んでいるのが遅いのかなと
思い,setvbufで内部バッファを大きく取って数十MBをまとめて書き込んだり,
openやwriteなどの低水準関数を使ってみたりしたのですが,まったく改善なし.
どこがネックになっているのだろう?

OpenMPによる並列化

$
0
0
シミュレータの実行速度が遅いのは,単純にサンプル毎に必要な演算が
多いのが原因のようです.

まず,コンパイラオプションをDebugからReleaseのデフォルト値に
するだけで,実行速度が倍になりました.それでも実時間の4倍ほどの
処理時間が掛かります.このときのCPU使用率は12%と,余裕があります.

 (クリックで拡大)

さらに,マルチコアを有効に使うために,OpenMPを試してみました.
受信信号の生成は,各衛星で同じ処理なので,ここを並列化します.

 (クリックで拡大)

サンプル毎に衛星間で並列化を行うと,スレッドの生成コストが高く,
並列化の効果がありません.そこで,衛星毎のforループを並列化し,
その中である一定時間分のサンプルを生成します.その後,それらを
足し合わせて,まとめてファイルに書き込むという構成にしました.

この並列化で,8コア全部が有効に使用され,平均して50%程度の
CPU使用率になっています.

 (クリックで拡大)

実行速度も,Core i7-3770,3.4GHzでほぼ実時間となりました.
快適というほどではありませんが,ストレスなくシミュレーション
ファイルの生成ができます.

コード位相計算の簡略化

$
0
0
受信機が静止しているのであれば,ある時刻の疑似距離とrange rateから
1秒後の疑似距離を線形近似しても,5cm以下の誤差しか発生しません.

疑似距離の精度としては無視できるレベルなので,OpenMPで並列化したループの中の
コード位相および搬送波位相は,range rateに応じた位相の進みを積算するだけにしました.

擬似距離とrange rateはループの外で毎秒アップデートするだけなので,
計算負荷の高い衛星位置の計算などは,低頻度に抑えられます.

 (クリックで拡大)

この簡略化で,処理速度が随分と改善されました.
90秒分のデータの生成に50秒程度と,リアルタイム化も見えてきたかな?

【追記】こんな製品を発見.

Skydel Solutions: Software-Defined GNSS Simulator

【追記2】1秒間であれば,delta rangeをrange rateの代わりにして
位相を積算することで,1秒後の疑似距離の近似誤差はゼロになります.
range rateに誤差が生じますが,受信機側の信号追尾では問題にならない程度です.

これで速度の計算が不要になり,計算負荷がさらに低減.
実時間の2倍の処理速度でベースバンド信号が生成できるようになりました.
これは快適!
Viewing all 643 articles
Browse latest View live