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#