dsp package#

Submodules#

dsp.acquisition module#

acquisition.py

file

sturdr/dsp/acquisition.py

brief

Satellite acquisition methods.

date

October 2024

refs

  1. “Understanding GPS/GNSS Principles and Applications”, 3rd Edition, 2017
    • Kaplan & Hegarty

  2. “A Software-Defined GPS and Galileo Receiver: A Single-Frequency Approach”, 2007
    • Borre, Akos, Bertelsen, Rinder, Jensen

dsp.acquisition.PcpsSearch(rfdata: ndarray, upsampled_code: ndarray, doppler_range: float64, doppler_step: float64, sampling_freq: float64, intermediate_freq: float64, coherent_integration: int = 1, non_coherent_integration: int = 1)#

Implementation of the parallel code phase search (PCPS) method

Parameters:
rfdatanp.ndarray

Data samples recorded by the RF front end

upsampled_codenp.ndarray

Local code

doppler_rangenp.double

Max doppler frequency to search [Hz]

doppler_stepnp.double

Frequency step for doppler search [Z]

sampling_freqnp.double

Front end sampleing frequency [Hz]

intermediate_freqnp.double

Intermediate frequency of the RF signal [Hz]

coherent_integrationint, optional

number of coherent integrations to perform, by default 1

non_coherent_integrationint, optional

number of non-coherent periods to accumulate, by default 1

Returns:
correlation_mapnp.ndarray

2D correlation results

dsp.acquisition.Peak2NoiseFloorComparison(correlation_map: ndarray)#

Compares the two highest peak to the noise floor of the acquisition plane

Parameters:
correlation_mapnp.ndarray

2D-array from correlation method

Returns:
first_peak_idxnp.ndarray

Indexes of hihgest correlation peak

acquisition_metricnp.double

Ratio between the highest and second highest peaks

dsp.acquisition.Peak2PeakComparison(correlation_map: ndarray, samples_per_code: int, samples_per_chip: int)#

Compares the two highest peaks of the correlation map

Parameters:
correlation_mapnp.ndarray

2D-array from correlation method

samples_per_codeint

Number of samples per code

samples_per_chipint

Number of code samples per code chip

Returns:
first_peak_idxnp.ndarray

Indexes of hihgest correlation peak

acquisition_metricnp.double

Ratio between the highest and second highest peaks

dsp.acquisition.SerialSearch(rfdata: ndarray, code: ndarray, doppler_range: float64, doppler_step: float64, sampling_freq: float64, code_freq: float64, intermediate_freq: float64)#

Implementation of the serial acquisition method (very slow), limited to 1 ms

Parameters:
rfdatanp.ndarray

Data samples recorded by the RF front end

codenp.ndarray

Local code (not upsampled)

doppler_rangenp.double

Max doppler frequency to search [Hz]

doppler_stepnp.double

Frequency step for doppler search [Z]

sampling_freqnp.double

Front end sampleing frequency [Hz]

code_freqnp.double

GNSS signal code frequency [Hz]

intermediate_freqnp.double

Intermediate frequency of the RF signal [Hz]

Returns:
correlation_mapnp.ndarray

2D correlation results

dsp.discriminator module#

discriminator.py

file

sturdr/dsp/discriminator.py

brief

Standard satellite tracking match filter discriminators.

date

October 2024

refs

  1. “Understanding GPS/GNSS Principles and Applications”, 3rd Edition, 2017
    • Kaplan & Hegarty

  2. “Principles of GNSS, Inertial, and Multisensor Integrated Navigation Systems”, 2nd Edition, 2013
    • Groves

  3. “Global Positioning System: Signals, Measurements, and Performance”, 2nd Edition, 2006
    • Misra & Enge

dsp.discriminator.DllNcdp(IE: float64, IP: float64, IL: float64)#

Delay Lock Loop - Normalized coherent dot product discriminator

Parameters:
IEnp.double

in-phase early discriminator

IPnp.double

in-phase prompt discriminator

ILnp.double

in-phase late discriminator

Returns:
taunp.double

chip error/misalignment [chip]

dsp.discriminator.DllNneml(IE: float64, QE: float64, IL: float64, QL: float64)#

Delay Lock Loop - Normalized non-coherent early minus late discriminator

Parameters:
IEnp.double

in-phase early discriminator

QEnp.double

quadra-phase early discriminator

ILnp.double

in-phase late discriminator

QLnp.double

quadra-phase late discriminator

Returns:
taunp.double

chip error/misalignment [chip]

dsp.discriminator.DllVariance(cn0: float64, T: float64)#

Variance in the DLL discriminator

Parameters:
cn0np.double

Carrier to noise density ratio magnitude (not dB-Hz)

Tnp.double

Integtation time [s]

Returns:
np.double

variance in the DLL discriminator [chips^2]

dsp.discriminator.FllAtan2(IP_1: float64, IP_2: float64, QP_1: float64, QP_2: float64, T: float64)#

Frequency Lock Loop - ATAN2 discriminator

Parameters:
IP_1np.double

First half in-phase prompt discriminator

IP_2np.double

Second half quadra-phase prompt discriminator

QP_1np.double

First half in-phase prompt discriminator

QP_2np.double

Second half quadra-phase prompt discriminator

Tnp.double

Integration time for sub-correlators [s]

Returns:
f

frequency error/misalignment [rad/s]

dsp.discriminator.FllNddcp(IP_1: float64, IP_2: float64, QP_1: float64, QP_2: float64, T: float64)#

Frequency Lock Loop - Nomralized decision-directed-cross-product discriminator

Parameters:
IP_1np.double

First half in-phase prompt discriminator

IP_2np.double

Second half quadra-phase prompt discriminator

QP_1np.double

First half in-phase prompt discriminator

QP_2np.double

Second half quadra-phase prompt discriminator

Tnp.double

Integration time for sub-correlators [s]

Returns:
f

frequency error/misalignment [rad/s]

dsp.discriminator.FllVariance(cn0: float64, T: float64)#

Variance in the FLL discriminator

Parameters:
cn0np.double

Carrier to noise density ratio magnitude (not dB-Hz)

Tnp.double

Integtation time [s]

Returns:
np.double

variance in the FLL discriminator [(rad/s)^2]

dsp.discriminator.PllAtan2(IP: float64, QP: float64)#

Phase Lock Loop - ATAN2 discriminator, sensitive to data bits

Parameters:
IPnp.double

in-phase prompt discriminator

QPnp.double

quadra-phase prompt discriminator

Returns:
phi

phase error/misalignment [rad]

dsp.discriminator.PllCostas(IP: float64, QP: float64)#

Phase Lock Loop - Costas discriminator

Parameters:
IPnp.double

in-phase prompt discriminator

QPnp.double

quadra-phase prompt discriminator

Returns:
phi

phase error/misalignment [rad]

dsp.discriminator.PllNddc(IP: float64, QP: float64)#

Phase Lock Loop - Normalized decision-directed-costas discriminator

Parameters:
IPnp.double

in-phase prompt discriminator

QPnp.double

quadra-phase prompt discriminator

Returns:
phi

phase error/misalignment [rad]

dsp.discriminator.PllVariance(cn0: float64, T: float64)#

Variance in the PLL discriminator

Parameters:
cn0np.double

Carrier to noise density ratio magnitude (not dB-Hz)

Tnp.double

Integtation time [s]

Returns:
np.double

variance in the PLL discriminator [rad^2]

dsp.gnss_signal module#

gnss_signal.py

file

sturdr/dsp/gnss_signal.py

brief

Common GNSS signal functions.

date

October 2024

refs

  1. “A Software-Defined GPS and Galileo Receiver: A Single-Frequency Approach”, 2007
    • Borre, Akos, Bertelsen, Rinder, Jensen

  2. “Understanding GPS/GNSS Principles and Applications”, 3rd Edition, 2017
    • Kaplan & Hegarty

dsp.gnss_signal.CarrierNCO(sampling_freq: float64, freq: float64, freq_jitter: float64, size: float64, remainder_phase: float64 = 0.0)#

Create a local carrier replica

Parameters:
sampling_freqnp.double

Sampling frequency of the front end receiver [Hz]

freqnp.double

Current carrier frequency [rad/s]

freq_jitternp.double

Current carrier frequency jitter [rad/s^2]

sizenp.double

Desired replica length

remainder_phasenp.double, optional

Initial fractional phase of the carrier, by default 0.0

Returns:
replicanp.ndarray

Local carrier signal replica

remainder_phasenp.double

Initial fractional phase of the carrier during the next period

dsp.gnss_signal.CodeNCO(code: ndarray, sampling_freq: float64, code_freq: float64, code_len: float64, remainder_phase: float64 = 0.0)#

Return the upsampled version of the code provided

Parameters:
codenp.ndarray

Code to upsample

sampling_freqnp.double

GNSS receiver front end sampling frequency [Hz]

code_freqnp.double

GNSS signal code frequency [Hz]

code_lennp.double

Length of the normal (not upsampled) code

remainder_phasenp.double, optional

Initial fractional phase of the code, by default 0.0

Returns:
upsampled_codenp.ndarray

Upsampled version of provided code

remainder_phasenp.double

Initial fractional phase of the code during the next period

dsp.gnss_signal.Correlate(signal: ndarray, code: ndarray)#

Correlate a signal and code replica

Parameters:
signalnp.ndarray

Recorded signal data and carrier replica multiplied together

codenp.ndarray

Local code replica from NCO

Returns:
I, Qnp.double

GNSS correlator values

dsp.gnss_signal.CorrelateEPL(signal: ndarray, code: ndarray, tap_spacing: int, noise_spacing: bool = False)#

Generate the standard Early-Prompt-Late correlator values

Parameters:
signalnp.ndarray

Recorded signal data and carrier replica multiplied together

codenp.ndarray

Local code replica from NCO

tap_spacingint

Number of samples between each correlator

Returns:
IE, QE, IP, QP, IL, QL, IP_1, QP_1, IP_2, QP_2np.double

GNSS correlator values

dsp.gnss_signal.shift(arr, num)#

dsp.lock_detector module#

lock_detector.py

file

sturdr/dsp/lock_detector.py

brief

Standard tracking loop lock detectors.

date

October 2024

refs

  1. “Understanding GPS/GNSS Principles and Applications”, 3rd Edition, 2017
    • Kaplan & Hegarty

  2. “Principles of GNSS, Inertial, and Multisensor Integrated Navigation Systems”, 2nd Edition, 2013
    • Groves

  3. “Global Positioning System: Signals, Measurements, and Performance”, 2nd Edition, 2006
    • Misra & Enge

dsp.lock_detector.CodeLockDetector(Amp_memory: float64, noise_memory: float64, IP: float64, QP: float64, IN: float64, QN: float64, dt: float64, alpha: float64 = 0.01)#

Code lock detector and Carrier-to-Noise ratio estimator, must be reset if integration period changes

Parameters:
Amp_memorynp.double

Previous amplitude squared value

noise_memorynp.double

Previous noise power value

IPnp.double

Inphase promt value

QPnp.double

Quadraphase prompt value

INnp.double

Inphase nosie correlator value

QNnp.double

Quadraphase noise correlator value

dtnp.double

_description_

alphanp.double, optional

Smoothing (filtering) coefficient, by default 0.01

Returns:
lockbool

Carrier Phase lock result

cn0_magnp.double

Estimated carrier-to-noise ratio magnitude (not dB-Hz)

A2np.double

New (filtered) amplitude squared value

n2np.double

New (filtered) noise power value

dsp.lock_detector.LowPassFilter(new: float64, old: float64, alpha: float64 = 0.01)#

Implementation of a moving average (low-pass) filter

Parameters:
newnp.double

New value

oldnp.double

Old value

alphanp.double, optional

Forgetting coefficient, by default 0.01

Returns:
outputnp.double

Filtered value

dsp.lock_detector.PhaseLockDetector(IP_memory: float64, QP_memory: float64, IP: float64, QP: float64, alpha: float64 = 0.01)#

Carrier phase lock detector (Kaplan)

Parameters:
IP_memorynp.double

Previous inphase prompt value

QP_memorynp.double

Previous quadraphase prompt value

IPnp.double

Inphase promt value

QPnp.double

Quadraphase prompt value

alphanp.double, optional

Smoothing (filtering) coefficient, by default 0.001

Returns:
lockbool

Carrier Phase lock result

Inp.double

New (filtered) inphase prompt value

Qnp.double

New (filtered) quadraphase prompt value

dsp.tracking module#

tracking.py

file

sturdr/dsp/tracking.py

brief

Satellite scalar tracking methods.

date

October 2024

refs

  1. “Understanding GPS/GNSS Principles and Applications”, 3rd Edition, 2017
    • Kaplan & Hegarty

  2. “Are PLLs Dead? A Tutorial on Kalman Filter-Based Techniques for Digital Carrier Syncronization”
    • Vila-Valls, Closas, Navarro, Fernandez-Prades

  3. “A Software-Defined GPS and Galileo Receiver: A Single-Frequency Approach”, 2007
    • Borre, Akos, Bertelsen, Rinder, Jensen

dsp.tracking.FLLassistedPLL_2rdOrder(phase_err: float64, freq_err: float64, vel_accumulator: float64, T: float64, w0p: float64, w0f: float64)#

2nd order PLL/DLL assisted by 1st order FLL Digital Loop Filter

Parameters:
phase_errnp.double

Phase error input (discriminator) [rad]

freq_errnp.double

Frequency error input (discriminator) [rad/s]

vel_accumulatornp.double

Velocity accumulator memory (previous value)

Tnp.double

Coherent integration time [s]

w0pnp.double

Natural radian frequency of the PLL [rad/s]

w0fnp.double

Natural radian frequency of the FLL [rad/s]

Returns:
outputnp.double

Doppler/Frequency esitmate from the Digital Loop Filter

vel_accumulatornp.double

Updated velocity accumulator memory

dsp.tracking.FLLassistedPLL_3rdOrder(phase_err: float64, freq_err: float64, acc_accumulator: float64, vel_accumulator: float64, T: float64, w0p: float64, w0f: float64)#

3rd order PLL/DLL assisted by 2nd order FLL Digital Loop Filter

Parameters:
phase_errnp.double

Phase error input (discriminator) [rad]

freq_errnp.double

Frequency error input (discriminator) [rad/s]

acc_accumulatornp.double

Acceleration accumulator memory (previous value)

vel_accumulatornp.double

Velocity accumulator memory (previous value)

Tnp.double

Coherent integration time [s]

w0pnp.double

Natural radian frequency of the PLL [rad/s]

w0fnp.double

Natural radian frequency of the FLL [rad/s]

Returns:
outputnp.double

Doppler/Frequency esitmate from the Digital Loop Filter

acc_accumulatornp.double

Updated acceleration accumulator memory

vel_accumulatornp.double

Updated velocity accumulator memory

dsp.tracking.NaturalFrequency(bw: float64, order: int)#

Calculate the natual radian frequency of the loop filter given the noise bandwidth

Parameters:
bwnp.double

Noise bandwidth [Hz]

orderint

Loop filter order (2 or 3)

Returns:
w0np.double

Loop filter’s natural radian frequency [rad/s]

Raises:
ValueError

Invlaid loop filter order

dsp.tracking.PLL_2ndOrder(phase_err: float64, vel_accumulator: float64, T: float64, w0d: float64)#

2nd order Phase/Delay Lock Loop

Parameters:
phase_errnp.double

Phase error input (discriminator) [rad or chip]

vel_accumulatornp.double

Velocity accumulator memory (previous value)

Tnp.double

Coherent integration time [s]

w0dnp.double

Natural radian frequency of the DLL [rad/s]

Returns:
_type_

_description_

dsp.tracking.PLL_3rdOrder(phase_err: float64, acc_accumulator: float64, vel_accumulator: float64, T: float64, w0p: float64)#

3nd order PLL/DLL Digital Loop Filter

Parameters:
phase_errnp.double

Phase error input (discriminator) [rad or chip]

acc_accumulatornp.double

Acceleration accumulator memory (previous value)

vel_accumulatornp.double

Velocity accumulator memory (previous value)

Tnp.double

Coherent integration time [s]

w0pnp.double

Natural radian frequency of the PLL [rad/s]

Returns:
outputnp.double

Doppler/Frequency esitmate from the Digital Loop Filter

acc_accumulatornp.double

Updated acceleration accumulator memory

vel_accumulatornp.double

Updated velocity accumulator memory

class dsp.tracking.TrackingKF(w0p: float64 = 0.0, w0f: float64 = 0.0, w0d: float64 = 0.0, doppler: float64 = 0.0, carrier_phase: float64 = 0.0, code_phase: float64 = 0.0, nominal_carrier_freq: float64 = 9898655796.636864, nominal_code_freq: float64 = 1023000.0, intermediate_freq: float64 = 0.0, cn0: float64 = 5000.0, T: float64 = 0.001)#

Bases: object

Attributes:
A
B
C
P
Q
R
T
cn0
kappa
u
w0d
w0f
w0p
x

Methods

Run(phase_err, freq_err, chip_err)

Run the Kalman Filter DLL/PLL

UpdateCarrierAidingCoeff(nominal_code_freq, ...)

Update coefficient for carrier aiding inside the DLL filter

UpdateCn0(cn0)

Update tracking loop carrier-to-noise density ratio

UpdateDoppler(doppler)

Update tracking loop carrier-to-noise density ratio

UpdateIntegrationTime(T)

Update tracking loop integration time

UpdateNaturalFreqs(w0p, w0f, w0d)

Update the natural frequencies for the equivalent loop filters

A: ndarray#
B: ndarray#
C: ndarray#
P: ndarray#
Q: ndarray#
R: ndarray#
Run(phase_err: float64, freq_err: float64, chip_err: float64)#

Run the Kalman Filter DLL/PLL

Parameters:
phase_errnp.double

Phase discriminator [rad]

freq_errnp.double

Frequency discriminator [rad/s]

chip_errnp.double

Chip discriminator [chips]

Returns:
xnp.ndarray

Current state estimates of PLL/DLL Kalman Filter

T: float64#
UpdateCarrierAidingCoeff(nominal_code_freq: float64, nominal_carrier_freq: float64)#

Update coefficient for carrier aiding inside the DLL filter

Parameters:
nominal_code_freqnp.double

Code frequency (e.g. 1.023e6 for GPS L1 C/A) [Hz]

nominal_carrier_freqnp.double

Carrier frequency (e.g. 1575.42e6 for GPS L1 C/A) [Hz]

UpdateCn0(cn0: float64)#

Update tracking loop carrier-to-noise density ratio

Parameters:
cn0np.double

Carrier-to-noise density ratio magnitude (not dB-Hz)

UpdateDoppler(doppler: float64)#

Update tracking loop carrier-to-noise density ratio

Parameters:
cn0np.double

Carrier-to-noise density ratio magnitude (not dB-Hz)

UpdateIntegrationTime(T: float64)#

Update tracking loop integration time

Parameters:
Tnp.double, optional

Integration time [s]

UpdateNaturalFreqs(w0p: float64, w0f: float64, w0d: float64)#

Update the natural frequencies for the equivalent loop filters

Parameters:
w0pnp.double

Natural radian frequency of the PLL [rad/s]

w0fnp.double

Natural radian frequency of the FLL [rad/s]

w0dnp.double

Natural radian frequency of the DLL [rad/s]

cn0: float64#
kappa: float64#
u: ndarray#
w0d: float64#
w0f: float64#
w0p: float64#
x: ndarray#

Module contents#