import numpy as np from galileo_rx.signal_profiles import galileo_e1_profile from galileo_rx.signals.code_provider import SyntheticCodeProvider from galileo_rx.signals.signal_generator import ChannelModelConfig, SatelliteSignalConfig, SyntheticSignalGenerator from galileo_rx.tracking.correlator import CorrelatorBank, SampleStreamCorrelator from galileo_rx.tracking.nco import CarrierNco, CodeNco def make_bank(fs: float, phase: float) -> CorrelatorBank: profile = galileo_e1_profile() return CorrelatorBank( profile, SyntheticCodeProvider(), "E1B", 1, CarrierNco(fs, 500.0), CodeNco(fs, 4092, profile.code_rate_hz, phase), 0.25, 0.75, ) def test_vector_and_sample_stream_correlators_agree() -> None: fs = 4.5e6 profile = galileo_e1_profile() generator = SyntheticSignalGenerator( profile, SyntheticCodeProvider(), fs, satellites=[SatelliteSignalConfig(1, "E1B", code_delay_chips=3.2, doppler_hz=500.0)], channel=ChannelModelConfig(add_awgn=False), ) samples, _ = generator.generate(500) vector = make_bank(fs, -3.2).correlate(samples) stream = SampleStreamCorrelator(make_bank(fs, -3.2)) for sample in samples: stream.accept(sample) cycle = stream.dump() for tap in ("very_early", "early", "prompt", "late", "very_late"): assert abs(getattr(vector, tap) - getattr(cycle, tap)) < 1e-8