dsp package#
Submodules#
dsp.acquisition module#
acquisition.py
file  | 
sturdr/dsp/acquisition.py  | 
brief  | 
Satellite acquisition methods.  | 
date  | 
October 2024  | 
refs  | 
  | 
- 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  | 
  | 
- 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  | 
  | 
- 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  | 
  | 
- 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  | 
  | 
- 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
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#