PocketSDR APにてbladeRFを使いたい(その2)

category: gnss
tags: pocketsdr qzss sdr

みちびき初号機がもうすぐ停止

みちびき初号機(QZS-1: quasi-zenith satellite 1)の電波が、2022年3月24日の後継機(QZS-1R: QZS-1 replacement)の運用開始後に、停止するそうです。それまでに、QZS-1、2、3、4、1Rすべてが可視状態のときの信号を収録したいと思っています。

qzs-1 signal termination announcement

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が大きめなため、あまり適さないかもしれません。この接続により、有効ビット数が増えました。

pre-amplifier and bladeRF

次の課題である信号取りこぼしですが、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 installation

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というものです。

GPSDO

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度の割合で測位衛星信号観測の信号が大きく乱れる課題について、継続して解決を目指します。ソフトウェア無線機のファームウェアバージョンについては、試行錯誤が必要なようです。

長い間、頑張ってくれたみちびき初号機の引退の日が近づいています。それまでに記念となる信号収録を達成したいです。


関連記事