PocketSDR APにてbladeRFを使いたい(その2)
みちびき初号機がもうすぐ停止
みちびき初号機(QZS-1: quasi-zenith satellite 1)の電波が、2022年3月24日の後継機(QZS-1R: QZS-1 replacement)の運用開始後に、停止するそうです。それまでに、QZS-1、2、3、4、1Rすべてが可視状態のときの信号を収録したいと思っています。
bladeRFでの信号とりこぼし
中部大学の海老沼 拓史 先生は、ソフトウェア無線機bladeRFを用いたGPS L1帯信号の収録に成功されています。
さらに、その収録信号のプレイバックも成功されていて、素晴らしいです。海老沼先生は、利得40 dBの低雑音増幅器(LNA: low noise amplifier)と、ramdiskを使われたそうです。私が悩んでいた、RXVGA2(receiver variable gain amplifier 2)の値にも述べられていました。
そこで、信号収録に再チャレンジします。受信アンテナとbladeRFの間に、私の手持ちのLNA、Anritsu MA8610Aを接続しました。このLNAの利得は20 dB、周波数範囲は9 kHzから2.2 GHz、雑音指数(NF: noise figure)は5 dBです。このLNAは、測位衛星電波受信には、周波数帯域幅がとても広く、利得が低めで、NFが大きめなため、あまり適さないかもしれません。この接続により、有効ビット数が増えました。
次の課題である信号取りこぼしですが、Ubuntuにすでに用意されているramdisk領域を再利用することにしました。容量も779メガバイトあり、簡単な実験には充分です。
$ df -h
Filesystem Size Used Avail Use% Mounted on
...
tmpfs 779M 0 779M 0% /run/user/1000
この/run/user/1000
に信号収録ファイルを書き込み、PocketSDR APのpocket_psd.py
でそのヒストグラムを確認しました。これにより、ヒストグラムやスペクトラムが乱れる頻度は少なくなったようですが、まだ数秒に一度程度、乱れていました。
次に、Ubuntu 20.04 LTSから、Ubuntu 18.04 LTSへのOSダウングレードを試しました。のちにOSを元に戻すかもしれないと思い、雑ではありますが、SSD自体を取り替えて、OSを新規インストールしました。
Ubuntu 18.04 LTSではNuandのPPAファイルが使えませんので、ソースコードからビルドしました。ファームウェアが新しくなっていましたので、ファームウェアv.2.4.0とFPGAビットストリームv.0.14.0の、ともに最新の組み合わせを試しました。
bladeRF-cli --flash-firmware bladeRF_fw_v2.4.0.img
bladeRF-cli -l hostedx40-v.0.14.0.rbf
しかしながら、この組み合わせにおいて、私の環境ではcal lms
の実行に失敗し、シェルに戻ってしました。
bladeRF> cal lms
[ERROR @ host/libraries/libbladeRF/src/backend/usb/libusb.c:1090] Transfer timed out for buffer 0x562e9f639380
[WARNING @ fpga_common/src/lms.c:3032] DC Calibration (module=1) failed to converge.
ファームウェアのバージョンをv.2.3.1に戻し、FPGAビットストリームのバージョンv0.11.0を利用したところ、DCオフセットキャンセルまでできましたので、この条件で試します。
その結果ですが、あいかわらず、数秒に一度、ヒストグラムやスペクトルが乱れました。
USRP B205mini-iでもチャレンジ
USRP B205mini-iでも試してみました。
/usr/lib/uhd/examples/rx_samples_to_file --freq 1575420000 --bw 2500000 --rate 4000000 --duration 1 --gain 60 --wirefmt sc8
こちらでも、数秒に一度、スペクトル乱れがありました。PCをLattePandaからHP Z210に代えてみましたが、スペクトル乱れはなくなりませんでした。
異なる無線機でも、異なるPCでも、同じような現象が現れるので、私が何か間違っているのかもしれません。試行錯誤は結構、好きなので、頑張ってみます。
試行錯誤のための測定スクリプト
信号観測と処理をくり返していると、諸元や日時のメモを忘れがちです。そこで、測定と記録を半自動化するPythonコードmeasure.py
を作成しました。コードを実行した日時を記録し、諸元を表すファイル名のbladeRFの設定ファイルを作り、測定を実行して、readme.txt
ファイルにそのファイル名と諸元を追加していくものです。そのまま実行すると、GPS L1帯の信号を収録しますが、-band
オプションにより他の周波数帯の信号を収録できます。
measure.py
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
fn_readme = 'readme.txt'
fn_blade = 'blade_'
cmd_bladerf = 'bladeRF-cli'
dict_gnss_freq = {
# band: f_center [MHz] f_sample [MHz] f_bw [MHz]
'L1' : '1575.42 4 2.5 ',
'L2' : '1227.60 4 2.5 ',
'L5' : '1176.45 24 20.0 ',
'L6' : '1278.75 12 8.75',
'B1I': '1561.098 12 3.84',
'B2I': '1207.140 12 3.84',
'B3I': '1268.520 24 14.0 ',
'E1' : '1575.42 24 3.84',
'E6b': '1207.14 24 14.0 ',
'G1' : '1602.00 12 2.5 ',
'G2' : '1246.00 12 2.5 ',
'G3' : '1202.025 24 20.0 ',
}
blade_bw = [1.5, 2.5, 2.75, 3, 3.84, 5, 5.5, 6, 7, 8.75, 10, 12, 14, 20, 28]
import datetime
import subprocess
import sys
if __name__ == '__main__':
gnss_band = 'L1'
f_center, f_sample, f_bw = dict_gnss_freq[gnss_band].split()
i = 1
while i < len (sys.argv):
if sys.argv[i] == '-band':
i += 1
gnss_band = argv[i]
f_center, f_sample, f_bw = dict_gnss_freq[gnss_band].split()
if float(f_bw) not in blade_bw:
print ('The bandwidth {} should be either '.format(f_bw), end='')
print (blade_bw)
sys.exit ()
dt_now = datetime.datetime.utcnow ()
# file path example: L1_20211202_084700_4MHz_IQ.bin
fn_bin = gnss_band + '_' + dt_now.strftime ('%Y%m%d_%H%M%S') \
+ '_' + f_sample + 'MHz_IQ.bin'
# conf file name example: pocket_L1L2_8MHz.conf
fn_conf = fn_blade + gnss_band + '_' + f_sample + 'MHz.conf'
entry_conf = '''
set frequency rx {fc}MHz
set bandwidth rx {fb}MHz
set samplerate rx {fs}MHz
set agc rx off
set gain rx 60
set rxvga2 18
cal lms
cal dc rx
rx config format=bin n=400k file={fn}
rx start
rx wait
'''.format (
fc = f_center,
fb = f_bw,
fs = f_sample,
fn = fn_bin).strip()
print (entry_conf)
with open (fn_conf, 'w') as fp:
fp.write (entry_conf)
ret = subprocess.run ([cmd_bladerf, '-s', fn_conf])
if ret.returncode != 0:
print ("bladeRF error")
sys.exit (1)
entry_readme = '''
File Path : {fn}
Date Time : {dt} UTC
Duration : {td} ms
Conf File : {conf}
Channel : 1
F_LO : {fc:.3f} MHz
F_ADC : {fs:.3f} MHz
Sampling : IQ
F_IF : 0.0 MHz
BW_IF : {fb:.1f} MHz
'''.format (
fn = fn_bin,
dt = dt_now.strftime ('%Y-%m-%d %H:%M:%S'),
td = t_dur,
conf = fn_conf,
fc = float (f_center),
fs = float (f_sample),
fb = float (f_bw)).strip()
print (entry_readme)
with open (fn_readme, 'a') as fp:
fp.write (entry_readme)
GPSDO準備中
安定したクロックをソフトウェア無線機に供給しようと思い、GPSDO(GPS disciplined oscillator)も準備しています。ひとつはかなり昔に購入したヒューレットパッカード(HP)Z3805Aで、もう一つは最近購入した中国製のTM5301というものです。
Z3805Aについては、GPS rolloverがうまくいかずに、異なる日付(2002-07-31)を示しています。シリアルポートのビットレートは9,600 bit/sで、:syst:stat?
はHPのSCPIコマンドです。SCPIコマンドについては、LeapSecond.comにある記事がとても参考になりました。
:syst:stat?
------------------------------- Receiver Status -------------------------------
SYNCHRONIZATION ............................................. [ Outputs Valid ]
SmartClock Mode ___________________________ Reference Outputs _______________
>> Locked to GPS TFOM 3 FFOM 0
Recovery 1PPS TI +7.9 ns relative to GPS
Holdover HOLD THR 1.000 us
Power-up Holdover Uncertainty ____________
Predict 10.0 us/initial 24 hrs
ACQUISITION ............................................ [ GPS 1PPS CLK Valid ]
Satellite Status __________________________ Time ____________________________
Tracking: 6 Not Tracking: 0 GPS 10:03:41 31 Jul 2002
PRN El Az SS 1PPS CLK Synchronized to GPS Time
1 33 48 113 ANT DLY 0 ns
3 62 73 160 Position ________________________
6 29 265 71 MODE Hold
14 60 220 127
17 56 332 144 LAT N 34:24:xx.xxx
19 36 314 102 LON E 132:26:xx.xxx
ELEV MASK 15 deg HGT +xx.xx m (MSL)
HEALTH MONITOR ......................................................... [ OK ]
Self Test: OK Int Pwr: OK Oven Pwr: OK OCXO: OK EFC: OK GPS Rcv: OK
scpi >
TM5301についても、USB出力にビットレート9,600 bit/sのNMEAメッセージが出ていました。トレーニング状況についてはNMEAメッセージにありませんでした。出力は安定しているようです。
信号レベルは…そのまま接続できそうにないので、これから考えます。
おわりに
数秒に1度の割合で測位衛星信号観測の信号が大きく乱れる課題について、継続して解決を目指します。ソフトウェア無線機のファームウェアバージョンについては、試行錯誤が必要なようです。
長い間、頑張ってくれたみちびき初号機の引退の日が近づいています。それまでに記念となる信号収録を達成したいです。
関連記事
- 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を使いたい 5th March 2022
- PocketSDRすごい(スナップショット測位編) 23rd February 2022
- PocketSDRすごい(FFTWによる高速化) 19th February 2022
- PocketSDRすごい(L6信号デコード編) 19th January 2022
- PocketSDRすごい(pocket_trk編) 28th December 2021
- PocketSDRすごい(pocket_acq編) 4th December 2021