GNSS Series — Part 2 of 3 · All parts · Next: Chronicle 3
Chronicle 2: Why Signals Matter
In the previous article we explored the basics of position estimation: measuring the signal travel time and converting it into distances. And from there, with at least four satellites we solved the position and clock discrepancies.
But before any of that math can even begin, the receiver has to hear the satellites buried in the background noise, lock onto their signals in time, and stay in sync…while everything else moves.
In this chronicle we explore how GNSS signals are structured and how a receiver detects, tracks and decodes them.
What is inside a satellite signal
Each GNSS satellite acts like a small radio station, continuously broadcasting a structured signal.
This signal contains three essential components that allow receivers to identify the satellite, measure the signal travel time and compute the location.
The three components are:
Pseudorandom Code
helps the receiver identify the satellite and precisely align time
Navigation message
a slow stream of data with the information needed to compute the position
Carrier
the underlying radio frequency that actually carries the signal through space
Together, these three elements form the transmitted GNSS signal and each of them contributing with a different piece of information the receiver needs to understand completely signal.
The code (PRN): the satellite’s fingerprint
PRN stands for Pseudorandom Noise Code. This is a binary signal that contains a random sequence which repeats periodically (this is where the “pseudo” comes from). Each satellite has its own unique code, which acts as an identifier and lets the receiver tell them apart.
🛰️ Think of it as each satellite broadcasting its own unique rhythm, allowing the receiver to distinguish it from all the others.
The navigation data: slow bits that matter
The navigation message is a slow data stream (50 bits per second for GPS) but carries essential information:
- Ephemerides – precise orbit parameters that tell us where the satellite was at the moment it transmitted its signal.
- Clock information – corrections for the satellite clock
- Health status – flags that inform if the satellite has any issues
When people talk about satellite orbits you will often hear about Keplerian elements. These are six parameters that describe an ideal Kepler orbit. In GNSS, the receiver gets those elements from the ephemeris, broadcast in the navigation message. Of course, the real orbits are not perfectly Keplerian, so the navigation message also includes small corrections to account for perturbations and clock effects. By combining the ephemeris and these corrections, the receiver can compute a precise satellite position at the moment of the signal transmition.
The carrier: the vehicle to ride from space
The carrier offers the medium for the two signals to travel at a specific frequency or radio band and reach the receiver. The ones you will see most are:
- L1 / E1: 1575.42 MHz (common, widely supported)
- L5 / E5a: 1176.45 MHz (cleaner, very useful when combined with L1/E1)
There are other bands, like GPS L2 and Galileo E5b/E6, but L1/E1 and L5/E5a cover what most phones use.
In navigation nomenclature, the discrete transition are called: bits in the bavigation data and chips in the PRN code.
These three components are not transmitted separately. They are combined into a single radio signal broadcast continuously by the satellite.
How the signal is built
The satellite signal is created by first combining the navigation data and PRN code, and then modulating the result onto a radio-frequency carrier.
The transmitted satellite signal is built in two steps:
- Combine the data and the code
- Modulate that result onto a radio carrier so it can travel through space and reach the receiver
Code + Navigation message
We first mix the navigation message (the slow bits) with the PRN code which is a faster chip sequence.
The resulting combination is our baseband message signal, s_t(t).
Note: You can also find in literature that the XOR operation is a module-2 sum.
Modulation onto the carrier
Modulation means placing the signals on a carrier. The generated signals are on the baseband. Now we need to put the baseband signal on a carrier so it can propagate and fit in the allocated spectrum.
One of the modulations used is the BPSK (Binary Phase Shift Keying).(There are fancier modulations like BOC/CBOC, but BPSK captures the core idea).
Here is what that looks like mathematically, don’t worry if it seems abstract at first:
s(t) = A \cdot D(t) \cdot C(t) \cdot cos(2 \pi f_c t + \varphi)\\
with
- s(t): signal that the satellite broadcasts
- A: amplitude of the signal
- D(t): navigation message
- C(t): PRN or C/A code
- cos(2 \pi f_c t + \varphi) : carrier; for instance, f_c=1575.42 MHz for L1
Why modulate? Higher frequency carriers allow for smaller antennas and “live” in protected frequency bands reserved for GNSS signals, which reduces interference from other radio services.
Most phones use L1/E1 (1575.42 MHz) and increasingly L5/E5a (1176.45 MHz).
For the sake of simplicity, we only consider one satellite. In reality, all the satellites in the constellation transmit on the same frequency.
That is possible thanks to modulation, as for example BPSK (Binary Phase-Shift Keying).
We have seen how the resulting combination of the signals look like and how the receiver can hear one specific satellite. Now, let’s take it further and see how it can actually understand them.
Once transmitted, this signal travels more than 20000 km through space before reaching the receiver.
From space to receiver
Now that we know what the satellite transmits and how the signal is constructed, let’s follow its path from space to the receiver and see how it is processed.
Before computing the position, the receiver has to hear each satellite and make sense of what is saying. Once transmitted, the combined signal travels more than 20000 km before reaching the receiver.
By the time it reaches Earth, the signal has been delayed, attenuated, Doppler-shifted, and buried in noise.
🛰️ What the satellite sends
The transmitted signal can be written as:
s(t) = A \cdot D(t) \cdot C(t) \cdot cos(2 \pi f_c t + \varphi)\\
Together, they create the modulated signal your receiver hears, a precise combination of data, identity and rhythm.
📡 What the antenna receiver receives
The signal doesn’t arrive exactly as it left the satellite. On its way down, it crosses 20,000 km of atmosphere, getting delayed, shifted, and slightly distorted. We can write the received signal as:
r(t) = A\cdot D(t - \tau) \cdot C(t- \tau) \cdot cos(2 \pi (f_c + f_D) t + \varphi) + \varepsilon(t)
Each term tells a small part of the story of how it reached the receiver as
- \varepsilon(t): all the unwanted extras; noise and errors introduced in the transmission.
- r(t): signal at the receiver
- A: the amplitude, weakened by distance and atmospheric attenuation
- C(t-\tau): C/A code shifted in time by \tau(code delay)
- D(t-\tau): navigation message data arriving a little late due to travel time \tau(code delay)
- cos(2 \pi \ (f_c + f_D) \ t + \varphi): carrier whose frequency f_c has been slightly shifted by the Doppler effect f_D Hz as the satellite and receiver move relative to each other
As the signal travels it will be attenuated and additional noise and error will add to it, but we ignore this part for now.
In short, your receiver doesn’t hear a perfect tone, and later stages of the receiver will untangle all these effects to recover the signal as cleanly and time-aligned as possible.
Inside the receiver
The receiver processes the signal in stages:
- Antenna: captures the RF (radiofrequency) signal and transforms it to an electrical signal
- Analog section of the receiver: the signal coming out of the antenna is downconverted from RF to an intermediate frequency. Then it is demodulated, i.e. we separate the carrier from the combination of the navigation message and C/A code
- Analog-digital converter (ADC): samples the signal so we can process it
- Digital section of the receiver: this is where the magic happens. The input signal (the combination of the navigation message and C/A code) goes through three steps that allow us to decode the information received from the satellite:
- acquisition – find each satellite in the noise,
- tracking – keep lock and measure precisely,
- navigation – decode the slow data to get ephemerides and clock info.
Think of it as the meet →follow → understand: the receiver first finds a satellite, then follows it tightly while everything moves, and finally understands the slow data it is sending.
Let’s take a closer look at how the receiver finds a satellite in the first place, the acquisition.
Acquisition: finding the satellite
Before the receiver can measure the distance, it must first detect which satellites are present.
Acquisition is the “meet” phase. Imagine trying to find one specific melody in a room full of statics. You slowly slide your tuner until the sound snaps into place.
In this phase, the receiver detects which satellites are present and obtains coarse estimates of their code delay (\tau) and Doppler (f_D).
For doing this, the spotlight turns to the PRN code…so it is time to shine PRN!
We remember that the key PRN characteristics are:
Unique + Pseudo Random + Noise
Because they are unique, the receiver can store a “database” with all PRNs from a constellation (or even multiple constellations).
The incoming signal is a noisy recording and the database is a collection of known fingerprints.
The receiver has the task to detect which fingerprints (satellites) are present and roughly align them with the local copies stored in its database.
But… what powers this search engine of our PRN database?
The answer is correlation.
Because PRNs are pseudorandom, one PRN looks like noise to any other. But if we take the correct PRN from the database and slide it chip by chip over its 1023-chip period (for GPS L1), there is one alignment where the local code matches the received one. At that point, the correlation spikes…And that’s the magic, the satellite reveals itself..!
Currently, the GPS constellation has 32 satellites, which in the worst case scenario means that we have 32 PRNs x 1023 chip combinations.
But there’s one more complication: the Doppler shift. This is because the satellite and the receiver are moving simultaneously, the signal shifts in frequency. Without compensating for it, the correlation peak might not be strong enough to detect. For L1 GPS, f_D is within the range of 5-10 KHz. If we search in steps of 500 Hz, we have 40 blocks, meaning 41 points to add to the searching area.
The acquisition problem therefore becomes a three-dimensional search:
PRN × code delay × Doppler frequency\\
e.g. 32 PRNs x 1023 chips x 41 frequency blocks.
Even for a single constellation this means testing over 1 million hypotheses! Receivers speed this up with clever FFT-based methods. If you enjoy performance optimization problems you can have a lot of fun 🙂
Outcome of acquisition:
For each detected satellite, the receiver knows which PRN is present and has coarse estimates of its code delay and Doppler. This is enough to move to the next phase: tracking.
Tracking: Keeping lock on the signal
Tracking is the ‘follow’ phase. After a satellite has been found, the receiver must stay in sync with it while both the satellite and the receiver move.
The goal of tracking is to maintain a stable lock on each detected satellite and refine the initial coarse estimates of the code delay and Doppler. In particular, the receiver improves the estimate of the code delay, (\tau) to sub-chip precision and the Doppler frequency (f_D) to Hz-level accuracy and begins tracking the carrier phase.
During tracking, the receiver continuously compares the incoming signal with locally generated replicas and refines them using feedback control loops. This is where precision is gained.
The refinement is handled by tracking loops: feedback systems that constantly correct the local replicas (PRN code and carrier).
At this stage, the signal is characterized by these three parameters: \tau, f_D, \varphi.
The receiver maintains the corresponding local replicas:\hat{\tau}, \hat{f_D}, \hat{\varphi}
The differences between the signal and replicas are:
\Delta \tau = \tau - \hat{\tau}, \Delta f_D = f_D - \hat{f_D}, \Delta \varphi = \varphi - \hat{\varphi}The role of the tracking loops is to drive these differences towards 0.
\Delta \tau \approx 0, \Delta f_D \approx 0, \Delta \varphi \approx 0 .
Different loops handle different aspects of the signal. The Delay Lock Loop (DLL) refines code timing to sub-chip precision, while the Frequency and Phase Lock Loops (FLL/PLL) track Doppler and carrier phase as the relative motion evolves.
By constantly adjusting the local replicas, the receiver keeps them tightly aligned with the real signal. The output of this process is a steady stream of clean navigation bits together with precise timing and frequency observables.
Outcome of tracking
The receiver achieves sub-chip code alignment, corresponding to timing precision on the order of tens of nanoseconds (roughly 30 cm in range), and maintains continuous lock on the satellite signal.
Decoding the navigation message: PVT
Navigation is the understanding phase. At this point, the receiver is locked into each satellite and everything is well aligned. This allows it to decode the navigation message and convert precise timing measurements into position, velocity, and time (PVT).
Tracking tells us how long the signal took to arrive. To turn the timing information into position, we need to know the exact time when the satellite transmitted and the position from where it did it. That is what the navigation message tell us.
The parameters carried inside the navigation include:
- Ephemeris parameters: orbital information of the transmitting satellite
- Clock parameters: time references and clock corrections
- Health status: indicators showing if the satellite is operating properly
- Additional corrections: such as ionospheric model parameters
From timing to distance
In Chronicle 1, we have seen that the receiver reconstructs the signal transmission time t_s. Combined with the reception time t_r, this builds the pseudorange:
\rho_i = c \cdot (t_r-t_s)
This distance is called a pseudorange because it still contains clock errors,both from the satellite and the receiver, but it forms the foundation of all GNSS positioning.
Where does transmission time come from?
Let’s now get more practical and understand how we actually compute the pseudoranges, determine the satellite position and reconstruct the true transmission time.
The navigation message is structured as a nested timing hierarchy, where each layer builds on the previous one: message, frame, subframe, bits, CA code, chips.
For GPS L1 C/A, the structure looks like this:
| Level | Duration | What it contains |
|---|---|---|
| Navigation message | 12.5 minutes | 25 frames |
| Frame | 30 seconds | 5 subframes |
| Subframe | 6 seconds | 300 bits of navigation data |
| 1 bit of subframe | 20 ms | 20 C/A code periods |
| CA code (PRN code) | 1ms | 1023 chips |
| CA chip (PRN code bit) | ~1us | Smallest PRN unit |
(For constellations the lengths are different, but the principle is the same. For Galileo for example, the navigation message length is 10 minutes.)
From the navigation message, we can extract the so-called GPS time. GPS time is expressed as a week number and time-of-week (TOW). In the navigation message, the Time-of-Week (TOW) is given in 1.5 seconds units.
Reconstruct the transmission time (what the satellite “said”)
To compute when the satellite actually transmitted the signal, the receiver climbs up through these timing layers:
With
- N = number of bits in the subframe: 1 bit => 6 s / 300 bits = 20 ms/bit
- M = number of CA codes: 20 CA codes in 1 subframe’s bit = 1 ms/CA code
- \tau = time delay => roughly certain number of chips in CA code
The reception time can be reconstructed as:
t_r = t_b + (N-1) \cdot 20 \cdot 10^{-3} + (M-1) \cdot 10^{-3} + \tau
And from the table above we know that
- Each navigation bit lasts 20ms
- Each C/A code lasts 1ms
The process is: once the replicas are aligned with the broadcasting message, this gives the time delay (\tau). Then moving up in the granularity of the navigation message gives the number of C.A codes (M) and the number of bits in the subframe (N).
Using the GPS time from the navigation message, the receiver obtains an accurate estimate of the transmission time.
That allows the receiver to calculate the reception time. And from here we get to the position as described in Chronicle 1.
What began as noise from orbit becomes a coherent understanding of where you are, how fast you’re moving, and what time it is.
The ground segment
If we have the
- Satellite positions (xi,yi,zi)(xi,yi,zi) computed from ephemeris
- Pseudoranges $\rho_i$ from timing
- At least four satellites
the receiver solves a system of equations to estimate its position and the receiver clock bias. Check Chronicle 1 again to understand how the position is estimated.
But there is one more thing missing: how do we get the satellite exposition?
Decode navigation message to compute satellite position
Satellites move in their orbits, experiencing variations that need to be monitored and corrected for a proper estimation of their position. But they do not work alone, even if until now it seemed so.
The ground segment (counterpart of space and user segments) is responsible for this task.
Up to this point, we’ve been exploring how the receiver determines its Position, Velocity, and Time (PVT) from the satellite signals. But the satellites themselves also need accurate information about their own position and clock.
This is achieved through a global network of ground stations that constantly receive and monitor data from the satellites. These stations estimate each satellite’s precise orbit and clock behavior, then upload the necessary corrections back to the satellite.
In a way, this process is like a reverse PVT: instead of the receiver figuring out where it is based on signals from space, the ground segment determines where the satellites are and how their clocks drift, ensuring the entire system stays synchronized and accurate
What comes next?
The phone listens, locks and decodes from a faint whisper 20 000 km away, extracting time and distance to compute location.
But the signal’s journey is not perfect. As it leaves the satellites, it travels through Earth’s atmosphere, it slows down and bends, introducing tiny errors in the distance calculations.
How we correct for these effects, and what other error sources come into play, will be the story of the next article. Stay tuned.
