GPS Signal Acquisition and Position Fix
~180 min8 StepsReceive live GPS L1 signals with an RTL-SDR, generate PRN codes from scratch, implement FFT-based satellite acquisition, decode navigation messages with GNSS-SDR, and compute a position fix via trilateration.
- RTL-SDR Blog V3 or V4 (TCXO version — critical for GPS)
- Active GPS patch antenna with SMA connector (requires bias tee power)
- GNSS-SDR installed (from apt or built from source)
- Python 3.10+ with NumPy, SciPy, Matplotlib
- Clear sky view for the GPS antenna — at least 60° above horizon in all directions
GPS L1 at 1575.42 MHz is a right-hand circularly polarized (RHCP) spread-spectrum signal. It's transmitted at only 20–50 watts from satellites 20,200 km away, arriving at Earth at about −130 dBm — well below the thermal noise floor of your SDR without special processing. That's why GPS needs spread-spectrum techniques.
GPS (Global Positioning System) transmits precision ranging signals that enable receivers to compute their position via trilateration from multiple satellites. Understanding the L1 signal structure is essential for building a software receiver.
GPS L1 signal specification
Carrier
1575.42 MHz RF carrier — RHCP. The satellite phase-modulates this with the ranging code and navigation data.
C/A Code (PRN)
1023-chip Gold code unique to each satellite. Chips at 1.023 MHz. BPSK-modulates the carrier at ±180°. Repeats every 1 ms.
Navigation Message
50 bps data: satellite orbit (ephemeris), clock corrections, satellite health, almanac for all satellites. BPSK on top of C/A code.
Why the signal is below the noise floor — and how GPS works anyway
The GPS signal at −130 dBm sits about 20 dB below the thermal noise floor of a typical RTL-SDR (noise floor ≈ −110 dBm in 2 MHz bandwidth). The receiver recovers it using correlation: multiply the received signal with a locally-generated replica of the known 1023-chip PRN code. After 1 ms of integration (one full code period), the correlation peak rises 30 dB above noise — making the signal detectable with SNR of ~20 dB.