Time Difference of Arrival

A terminal transmits at a time t₀ that the network doesn’t know, so no single arrival time gives a range. The difference between two base stations’ arrival times does, though: it cancels t₀ and fixes rᵢ − r₁, which puts the terminal on a hyperbola with the two stations as foci. With two stations the terminal could be anywhere on that curve. A third station adds a second hyperbola, and the terminal sits where the two cross. Drag the stations and the terminal to try it.

Base stations
Top view · 40 m × 24 m
Base station (BS1 = reference) Terminal (drag) Hyperbola (r₁, rᵢ) Estimate 95% CRLB ellipse

Measurement

Position fix

This measurement — —
RMSE, 300 trials — Monte Carlo over the jitter
CRLB bound — best RMSE any unbiased solver can get
GDOP — position error ÷ range error cσ

What the base stations record

arrival time at each station

Each row shows the pulse as one base station hears it. The network can’t see the emission instant t₀ (grey dashed line), so it can’t read absolute ranges off these timestamps. The brackets are what it can measure: each station’s arrival time relative to BS1. Multiplying by c gives a range difference, and each range difference gives one hyperbola.

How TDoA works
Step 1 · differences cancel the unknown clock

Station i hears the pulse at tᵢ = t₀ + rᵢ/c. The terminal isn’t synchronized to the network, so t₀ is unknown and a single tᵢ says nothing. Subtract two stations and t₀ drops out:

c · (tᵢ − t₁) = rᵢ − r₁ = Δrᵢ

The set of points whose distances to two fixed foci differ by a constant is one branch of a hyperbola. The branch bends around whichever station heard the pulse first.

Step 2 · count equations

N stations give N − 1 independent differences. Picking another station as the reference, or adding BS2−BS3, adds nothing new. A 2D position has two unknowns, so you need at least three stations. With two you get a curve, which is the row of grey candidates in the 2-station view. In 3D you need four. Even with three, two hyperbola branches can cross twice. When the terminal is near such a spot, the trial cloud splits into two clusters.

Step 3 · geometry turns timing error into position error

Jitter σ on each arrival time puts √2·cσ of error on each range difference, which is the width of the dashed bands. Where the bands cross at a steep angle, the overlap is a small diamond. Where they cross at a shallow angle, it stretches into a long sliver. That stretch factor is the GDOP. It stays small inside the stations’ convex hull and grows quickly outside it. Out there the hyperbolas become nearly parallel, so the range to the terminal is poorly constrained even when its bearing is fine.

Step 4 · the network must share one clock

TDoA frees the terminal from synchronization but moves the requirement onto the base stations. Try the BS2 clock offset: 1 ns of offset shifts every hyperbola through BS2 by about 30 cm. The error is a fixed bias, so the trial cloud moves off the truth as a whole instead of spreading out. Cellular networks discipline their clocks with GPS for this reason, and UWB anchors are synchronized over cable or by wireless sync packets.

Solver

The estimate minimizes the weighted squared mismatch of all range differences using Gauss–Newton, started from ten points across the room. The weight accounts for the shared reference: BS1’s jitter appears in every difference, so the differences are correlated with covariance c²σ²(I + 11ᵀ). The CRLB ellipse is the inverse Fisher information from the same model, evaluated at the true position.