InSAR explained: measuring millimetres of ground motion from phase
On this page
Problem statement
Radar interferometry turns two SAR images of the same place into a map of how far the ground moved between them, with millimetre sensitivity from 700 km up. It is how subsidence over aquifers, landslides creeping downhill and volcanoes inflating before an eruption are measured over whole regions. It is also the part of SAR most often misread, because what it measures is not what the maps usually say: it is motion along the radar's line of sight, known only modulo half a wavelength, relative to some reference point, and only where the ground has not changed too much between the two dates.
For Sentinel-1 that half wavelength is 2.77 cm. A colour cycle in an interferogram — a fringe — is 2.77 cm of motion towards or away from the satellite, not up or down, and not relative to anything fixed unless someone chose a reference.
Quick answer
The phase difference between two acquisitions, after removing orbit and topography, is proportional to line-of-sight displacement:
import numpy as np
c = 299_792_458
f = 5.405e9 # sar:center_frequency, GHz → Hz
wavelength = c / f
per_fringe = wavelength / 2 # a full 2π cycle of phase
print(f"wavelength {wavelength * 100:.2f} cm; one fringe = {per_fringe * 1000:.1f} mm of line-of-sight motion")
def los_displacement(phase_rad):
"""Unwrapped phase difference → displacement along the line of sight, metres.
Sign convention varies between processors; check which way is 'towards the sensor'."""
return -phase_rad * wavelength / (4 * np.pi)
wavelength 5.55 cm; one fringe = 27.7 mm of line-of-sight motion
The factor 4π, not 2π, is because the signal travels to the ground and back: a 1 cm change in distance changes the round trip by 2 cm.
SLC pairs, coregistration, interferogram, unwrapping
1. Start from SLC pairs
Interferometry needs the phase, so it needs single-look complex data from the same orbit track, same beam and ideally a short time apart.
2. Coregister precisely
The two images must be aligned to a small fraction of a pixel. Sentinel-1's burst mode makes this stricter: misalignment along track creates phase jumps at burst boundaries.
3. Form the interferogram
Multiply one image by the complex conjugate of the other. The phase of the product is the phase difference; its magnitude, normalised, is the coherence.
4. Remove what is not motion
Flat-earth and orbital phase are removed with the orbits; topographic phase with a DEM. What remains is motion, atmospheric delay, and noise.
5. Unwrap
Measured phase is wrapped into −π to π. Unwrapping adds the right multiple of 2π to each pixel by following the phase across the image. It fails across incoherent gaps and steep deformation gradients, and its errors come in whole fringes.
6. Convert and reference
Scale to displacement along the line of sight, and choose a reference area assumed stable. Every value is relative to that reference, and to the first date.
Wrapped and unwrapped phase, and line of sight
Example 1 — wrapped and unwrapped phase
# Synthetic: a bowl of subsidence 6 cm deep across 200 pixels, as a line of sight would see it.
x = np.linspace(-1, 1, 200)
true_los = -0.06 * (1 - x ** 2) # metres, negative = away
phase = -4 * np.pi * true_los / wavelength
wrapped = np.angle(np.exp(1j * phase)) # what the interferogram holds
unwrapped = np.unwrap(wrapped)
print(f"fringes across the bowl: {(phase.max() - phase.min()) / (2 * np.pi):.1f}")
print(f"recovered depth {abs(los_displacement(unwrapped).min() - los_displacement(unwrapped).max()) * 100:.1f} cm "
f"(true {abs(true_los.min()) * 100:.1f} cm)")
fringes across the bowl: 2.2
recovered depth 6.0 cm (true 6.0 cm)
Example 2 — what a line of sight sees
def los_unit(incidence_deg, look_azimuth_deg):
"""Unit vector from ground to sensor in east, north, up."""
inc, az = np.radians(incidence_deg), np.radians(look_azimuth_deg)
return np.array([-np.sin(inc) * np.sin(az), -np.sin(inc) * np.cos(az), np.cos(inc)])
u = los_unit(39, 80) # ascending, looking east
for name, motion in [("1 cm up", [0, 0, 0.01]), ("1 cm east", [0.01, 0, 0]),
("1 cm north", [0, 0.01, 0])]:
print(f"{name:11} -> {np.dot(u, motion) * 1000:+.1f} mm towards the sensor")
1 cm up -> +7.8 mm towards the sensor
1 cm east -> -6.2 mm towards the sensor
1 cm north -> -1.1 mm towards the sensor
North–south motion is nearly invisible to a polar-orbiting radar: its line of sight points almost east or west.
Example 3 — the unwrapping failure
steep = -0.06 * (1 - x ** 2) * 15 # fifteen times deeper: 90 cm in 200 px
phase_steep = -4 * np.pi * steep / wavelength
rec = np.unwrap(np.angle(np.exp(1j * phase_steep)))
err = los_displacement(rec) - (steep - steep[0])
print(f"max phase step between pixels {np.abs(np.diff(phase_steep)).max():.2f} rad "
f"(limit π = {np.pi:.2f}); unwrapping error {np.abs(err).max() * 100:.1f} cm")
max phase step between pixels 4.08 rad (limit π = 3.14); unwrapping error 63.8 cm
When neighbouring pixels differ by more than half a fringe, unwrapping cannot tell which way round the circle the phase went.
Phase precision, coherence and the atmosphere
Why phase measures distance so precisely
Phase is position within one wavelength of the signal. A change of a quarter of the 5.5 cm wavelength in round-trip distance shifts phase by 90°, which is easily measured. Any single phase value is meaningless because of the random scattering within a pixel, but if the scatterers do not change, that randomness cancels in the difference between two dates, leaving the change in distance.
Why coherence limits where it works
The cancellation only works if the scatterers in each pixel stay the same. Growing crops, wet snow, water, and moving vegetation change them and destroy coherence; phase there is noise. Cities and bare rock stay coherent for years, fields for days. That is why InSAR maps are full of holes over farmland and forests.
Why the atmosphere is the largest error
The radar signal slows slightly in the troposphere, and water vapour varies over tens of kilometres. A few centimetres of apparent delay difference between two dates is common — comparable to the motion being measured. Stacking many dates and time-series methods such as persistent scatterers average it down, because the atmosphere is random in time and the motion is not.
Ready-made products, references and sign conventions
- Ready-made products such as the European Ground Motion Service provide processed time series; use them before processing SLCs yourself.
- Combine ascending and descending lines of sight to separate vertical from east–west motion.
- Reference point choice changes every value; report it.
- Seasonal motion from clay shrinkage or aquifer recharge can look like trends in short series.
- L-band keeps coherence longer over vegetation than C-band.
- Sign conventions differ between processors; check which way "positive" points.
Internal links
- Sentinel-1 products explained — why SLC is needed
- SAR geometry explained — look direction and incidence
- SAR imagery explained — the basics of radar
- Speckle explained — the random phase that cancels
- Vertical datums explained — heights and what they are relative to
- Digital elevation models explained — the DEM that removes topographic phase
FAQ
What does InSAR measure?
Change in distance between the ground and the satellite along the radar's line of sight, between two dates.
How precise is Sentinel-1 InSAR?
Phase resolves millimetres; atmospheric noise and unwrapping limit single interferograms to around a centimetre, and time series to a few millimetres per year.
What is a fringe?
One full cycle of interferometric phase: 2.77 cm of line-of-sight motion for Sentinel-1.
Does InSAR measure vertical motion?
Only its projection onto the line of sight. Combine ascending and descending passes to separate vertical and east–west.
Why are there gaps in InSAR maps?
Loss of coherence where surfaces change between dates, such as vegetation, water and snow.
Can I do InSAR with GRD data?
No. It needs the phase, which only SLC products keep.