The Doppler effect is the change in frequency you measure when the source of a wave and the observer move toward or away from each other: closing motion raises the frequency, separating motion lowers it. Christian Doppler presented the idea in Prague on 25 May 1842. Today the same shift lets a siren drop in pitch as it passes, lets radar measure the speed of cars and wind, and lets a GPS receiver find satellites and compute its own velocity.
This post goes one level deeper than our tour of the electromagnetic spectrum and our history of GPS and GNSS. It pairs with Maxwell's equations explained, which tells you why radio and light travel at c in the first place, and with the laws of gravity from Newton to Einstein, because GPS has to correct for relativity as well as for Doppler.
A note on numbers. The speed of light comes from NIST's CODATA tables. The speed of sound formula comes from NASA Glenn Research Center. Weather radar facts come from NOAA's JetStream pages on the NEXRAD network, police radar bands from the US Code of Federal Regulations, GPS carrier frequencies from the official interface specification IS-GPS-200, the Sputnik and Transit history from the two Johns Hopkins Applied Physics Laboratory scientists who did the work, and the Doppler history from the MacTutor archive at the University of St Andrews. Inputs we chose ourselves, such as a siren's pitch or a car's speed, are labelled as illustrative. Every calculation was rerun with the short Python script in the walkthrough.
Key takeaways
- The idea: a moving source bunches up or stretches out the wave crests it emits, and a moving observer meets crests faster or slower. Either way, the received frequency differs from the emitted one.
- Sound needs two formulas: for sound in still air, f = f₀ (c + v_o) / (c − v_s). Source motion and observer motion give different answers at the same speed, because sound travels relative to the air, not relative to you.
- Light needs one: electromagnetic waves have no medium, so only relative velocity matters. The exact relativistic formula collapses to Δf/f ≈ v/c when v is much smaller than c, which covers satellites, radar, Wi-Fi and almost all engineering.
- Radar doubles it: a reflected wave is shifted twice, so Δf = 2v f₀ / c. A car at 100 km/h shifts a 24.15 GHz radar return by about 4.5 kHz.
- Satellites shift by kilohertz: a satellite in a 420 km orbit can approach a ground station at up to about 7.2 km/s, enough to move a 437 MHz downlink by roughly 10.5 kHz.
- GPS depends on it: a stationary receiver sees GPS L1 signals shifted by up to about ±4.9 kHz. Receivers search over that range to acquire satellites, then turn the measured shifts into velocity.
- History: Doppler's 1842 paper, train borne musicians in 1845, Hubble's 1929 velocity and distance relation, and the 1957 Sputnik tracking that led directly to Transit, the first satellite navigation system.
What is the Doppler effect, who described it and when?
Picture a source that emits a crest every millisecond. If the source sits still, the crests spread out as evenly spaced rings and anyone nearby receives one crest per millisecond. If the source moves to the right, each new crest is emitted from a point slightly further right than the last. The rings crowd together in front of the source and spread apart behind it. A listener in front receives crests more often than one per millisecond, a listener behind receives them less often. Nothing about the source has changed; only the spacing of the crests in space and the rate at which they arrive.
The observer can produce the same effect by moving. Walk toward a stationary source and you meet crests sooner than you would standing still. Walk away and each crest has to chase you.
NASA's Imagine the Universe pages introduce the effect with exactly this picture: a fire truck idling in a station driveway emits evenly spaced waves, and once it drives off the waves ahead of it are compressed and those behind are stretched. NOAA uses the same image to explain weather radar, noting that as an emergency vehicle or train passes "the siren or whistle's pitch lowers."
Christian Doppler and the 1842 paper
According to the MacTutor History of Mathematics archive, Christian Andreas Doppler was born in Salzburg on 29 November 1803 and died in Venice on 17 March 1853. On 25 May 1842, while teaching in Prague, he presented a paper to the Royal Bohemian Society of Sciences titled, in English translation, On the coloured light of the double stars and certain other stars of the heavens.
MacTutor describes this as the first statement of the principle that relates the frequency of a source to its velocity relative to an observer. Doppler derived it in a few lines, treating both light and sound as longitudinal waves. Two parts of the paper were wrong. Light is a transverse wave, as Fresnel had already argued, though that error does not change the result. And the application in the title failed: Doppler was right that motion would shift the colours of double stars, but at real stellar speeds the colour change is far too small to see. What survived is the principle, plus a prediction that MacTutor quotes at length: that it might one day give astronomers a way to measure the motions of stars too distant for parallax. That prediction came true in the twentieth century.
The 1845 test with musicians on a train
Light could not test the theory in 1842; sound could. MacTutor records that "as early as 1845" experiments were run with musicians playing instruments on railway trains while other trained musicians on the ground wrote down the note they heard as the train approached and receded. The history traditionally credits these trials to the Dutch meteorologist C. H. D. Buys Ballot, working near Utrecht. MacTutor's Doppler biography describes the experiments without naming who organised them, and we could not fetch a primary record of Buys Ballot's own report, so treat the attribution as the standard account rather than something we verified line by line.
MacTutor also records that in 1846 Doppler published an improved version that treated motion of the source and motion of the observer separately. That distinction is the subject of the next section, and it is not a detail. It is the reason a siren sounds different depending on whether the ambulance moves or you do.
Timeline: from Prague to GPS
| Date | Event | Source |
|---|---|---|
| 25 May 1842 | Doppler presents his paper on the coloured light of double stars to the Royal Bohemian Society in Prague | MacTutor |
| 1845 | Musicians on trains test the effect with sound | MacTutor (attribution to Buys Ballot is the standard account) |
| 1846 | Doppler publishes a version separating source and observer motion | MacTutor |
| 15 March 1929 | Hubble's "A relation between distance and radial velocity among extra-galactic nebulae" appears in PNAS 15(3):168 to 173 | PNAS via PubMed Central |
| 4 October 1957 | Sputnik 1 launches | NASA |
| October 1957 | Guier and Weiffenbach at Johns Hopkins APL record Sputnik's Doppler shifted signal | Guier and Weiffenbach, APL Technical Digest |
| 17 March 1958 | Frank McClure asks them to invert the problem: find the receiver from a known orbit | Guier and Weiffenbach |
| 25 January 1983 | Initial release of the GPS interface specification IS-GPS-200 | IS-GPS-200N revision record |
| Around 2012 | NEXRAD Doppler weather radars upgraded to dual polarization | NOAA JetStream |
| 1 August 2022 | IS-GPS-200 revision N | IS-GPS-200N |
What is the Doppler formula for sound, and why do moving source and moving observer differ?
For sound in still air, with the source and observer moving along the line that joins them, the general formula is:
f = f₀ × (c + v_o) / (c − v_s)
f₀ = frequency the source emits (Hz)
f = frequency the observer hears (Hz)
c = speed of sound in the air (m/s)
v_o = observer speed, positive when moving toward the source
v_s = source speed, positive when moving toward the observer
Set v_o to zero and you get the moving source case, f = f₀ c / (c − v_s). Set v_s to zero and you get the moving observer case, f = f₀ (c + v_o) / c. Flip a sign when the motion is away rather than toward.
Deriving the two cases
Moving source. The source emits one crest every period T₀ = 1/f₀. During one period, the previous crest travels c T₀ forward, while the source itself travels v_s T₀ in the same direction. The distance between consecutive crests in front of the source, which is the wavelength the observer receives, is therefore:
λ' = (c − v_s) T₀
The observer is stationary relative to the air, so crests reach the ear at speed c. The received frequency is c / λ' = f₀ c / (c − v_s). The source has physically changed the wavelength in the air.
Moving observer. The source sits still, so the wavelength in the air is the normal λ = c / f₀. The observer runs toward the source at v_o, so crests pass the observer at relative speed c + v_o. The received frequency is (c + v_o) / λ = f₀ (c + v_o) / c. The wavelength in the air has not changed; the observer simply sweeps through it faster.
Why the asymmetry exists
The two formulas give different answers for the same relative speed. A source approaching at 25 m/s and an observer approaching at 25 m/s are not the same experiment, because sound travels at c relative to the air. The air is a preferred frame of reference. Motion relative to the air matters, not just motion of source and observer relative to each other.
The asymmetry grows with speed. As v_s approaches c, the moving source formula blows up: crests pile up on top of each other in front of the source and the denominator goes to zero. That is the physical root of a shock wave and a sonic boom. A moving observer has no such singularity; an observer running toward a source at the speed of sound simply hears twice the frequency.
Wind is the other thing the simple formula ignores. If the air itself moves, add the wind component along the line of sight to c in the direction the sound is travelling. For everyday street speeds the correction is a few percent at most, but it is real.
The speed of sound you plug in
NASA Glenn Research Center gives the speed of sound in a gas as a = √(γRT), where γ is the ratio of specific heats (1.4 for air), R is the specific gas constant for air and T is the absolute temperature. NASA quotes about 761 mph, or 1,100 feet per second, at sea level on a standard day. At 20 °C (293.15 K) the formula gives about 343 m/s, the value we use below. In cold air sound is slower, so the same siren shifts slightly more.
Worked example 1: the pitch of a passing siren
Take an illustrative siren tone of 700 Hz on an ambulance travelling at 25 m/s (90 km/h) past a pedestrian standing at the kerb. Use c = 343 m/s.
Approaching:
f = 700 × 343 / (343 − 25) = 700 × 343 / 318 = 755.0 Hz
Receding:
f = 700 × 343 / (343 + 25) = 700 × 343 / 368 = 652.4 Hz
The pedestrian hears the tone fall by about 103 Hz as the ambulance passes. In musical terms, the ratio 755.0 / 652.4 = 1.157, and 12 × log₂(1.157) = 2.5 semitones: a drop of a little more than a whole tone. That is why the pitch change is so easy to notice even when the absolute frequency change is small.
Now swap who is moving. Suppose the ambulance is parked with its siren on and a cyclist rides past at the same 25 m/s:
Approaching: f = 700 × (343 + 25) / 343 = 751.0 Hz
Receding: f = 700 × (343 − 25) / 343 = 649.0 Hz
The cyclist hears 751 Hz rising to 649 Hz, a few hertz different from the pedestrian's 755 and 652. That gap is the asymmetry from the previous section, measured.
Both moving. A car drives at 20 m/s toward the ambulance, which approaches at 25 m/s:
f = 700 × (343 + 20) / (343 − 25) = 700 × 363 / 318 = 799.1 Hz
What happens at the moment of passing
The formula above assumes motion directly along the line of sight. A real ambulance passes at some distance from you, so only the component of its velocity along the line joining you and it matters. Far away, that component is nearly the full speed. As the vehicle draws level the component falls to zero and then reverses. The heard pitch therefore glides smoothly from the high value to the low value, with the steepest change when the vehicle is closest. The closer the vehicle passes, the more abrupt the glide, which is why a siren passing a metre away sounds like a sudden drop and one passing on the far side of a wide road sounds like a gentle slide.
There is one more subtlety. Sound takes time to reach you. The tone you hear at the instant the ambulance is level with you was emitted a moment earlier, while it was still approaching, so the exact midpoint of the glide arrives slightly after the vehicle passes. For a vehicle 10 m away the delay is about 30 ms.
What changes for light and radio?
Electromagnetic waves do not travel through a medium. There is no preferred frame, so special relativity requires that only the relative velocity of source and observer matters. The two sound formulas merge into one. For motion directly along the line of sight, with β = v/c and v positive when the two approach:
f = f₀ × √((1 + β) / (1 − β))
NIST lists the speed of light in vacuum as exactly 299 792 458 m/s. NIST's history of the metre explains why it is exact: in 1983 the metre was redefined by international agreement as the distance light travels in vacuum in 1/299,792,458 of a second, which locked the speed of light at that value.
The small velocity approximation
For any speed much less than c, expand the square root and keep the first term:
Δf / f₀ ≈ v / c (one way, source and observer approaching)
Δλ / λ₀ ≈ −v / c
The next term is of order β²/2. For a satellite in low Earth orbit, β is about 2.4 × 10⁻⁵, so β²/2 is about 3 × 10⁻¹⁰. That is negligible for tuning a radio but not for a precise clock, which is why GPS has an explicit relativistic correction (see below).
There is also a purely relativistic piece with no classical counterpart: the transverse Doppler effect. When a source moves at right angles to your line of sight, the first order shift vanishes but time dilation still lowers the received frequency by a factor of √(1 − β²). At orbital speeds it is a parts per ten billion effect.
When β is not small, use the exact formula. At β = 0.1 the approximation gives a ratio of 1.100, while the exact formula gives 1.106. For galaxies at large distances, the cosmological redshift is a stretching of space rather than a velocity in this sense, and astronomers use the redshift parameter z directly.
Worked example 2: a satellite in low Earth orbit
NASA states that the International Space Station orbits at an altitude between 370 and 460 km, travelling at about five miles per second and circling the Earth about every 90 minutes. Take a 420 km circular orbit.
Step 1: orbital speed. For a circular orbit, v = √(GM / r). With Earth's GM = 3.986 × 10¹⁴ m³/s² and r = 6,371 + 420 = 6,791 km:
v = √(3.986e14 / 6.791e6) ≈ 7,661 m/s
That is 4.76 miles per second, consistent with NASA's "five miles per second".
Step 2: the fastest closing speed a ground station sees. The satellite is never heading straight at you. The largest component of its velocity along your line of sight occurs when it rises over the horizon on a pass directly overhead. Geometry gives that component as v × R / (R + h), ignoring the Earth's rotation:
v_r(max) = 7,661 × 6,371 / 6,791 ≈ 7,187 m/s
Step 3: the shift. Take an illustrative downlink at 437 MHz, in the UHF band many small satellites use:
Δf ≈ f₀ × v_r / c = 437e6 × 7,187 / 299,792,458 ≈ 10,477 Hz
The signal arrives about 10.5 kHz high as the satellite rises, slides through the nominal frequency at closest approach and leaves about 10.5 kHz low as it sets. At 145.8 MHz the same pass gives about ±3.5 kHz; at 2.2 GHz, about ±52.7 kHz. The exact relativistic formula changes the 437 MHz result by about 0.13 Hz.
Why it matters in practice. A narrowband receiver with a channel a few kilohertz wide would lose the signal within a minute of a pass if it did not track the shift. Ground station software predicts the curve from the orbit and retunes the radio continuously. The same logic applies in reverse to an uplink: you transmit below the satellite's receive frequency while it approaches and above it while it recedes.
A historical check. Johns Hopkins APL physicists William Guier and George Weiffenbach recalled that Sputnik transmitted on about 20 MHz, set roughly 1 kHz away from an exact 20 MHz, so a receiver tuned to 20 MHz produced an audio tone that varied "from about 1500 Hz to about 500 Hz" during a pass. A swing of about ±500 Hz at 20 MHz corresponds to a line of sight speed of about 500 / 20,000,000 × c ≈ 7.5 km/s, which is our own back calculation and is consistent with a low orbit like the one above.
How does Doppler radar measure speed and wind?
A radar transmits a wave, a target reflects it and the radar listens for the echo. The target acts first as a moving observer, receiving a shifted frequency, and then as a moving source, re-radiating that shifted frequency. The shift is applied twice. To first order:
Δf = 2 × v_r × f₀ / c = 2 × v_r / λ
where v_r is the radial velocity, the component of the target's velocity along the beam. The factor of two is the single most common thing people forget when they work a radar problem.
Police traffic radar
The US Code of Federal Regulations, 47 CFR 90.103, lists the frequency bands available for the Radiolocation Service, which covers stations that "determine distance, direction, speed, or position" by radio for purposes other than navigation. The table includes 10,500 to 10,550 MHz, 24,050 to 24,250 MHz and 33,400 to 36,000 MHz. Engineers commonly call these X, K and Ka band, and they are the bands where traffic speed radars are usually found.
A handheld or dash mounted traffic radar is usually a continuous wave Doppler radar. It transmits a steady tone, mixes the echo with the transmitted signal and measures the beat frequency, which is the Doppler shift. A pulsed or ranging radar is not needed to measure speed.
Worked example 3: a K band radar and a car at 100 km/h
Take a transmit frequency of 24.15 GHz, inside the 24,050 to 24,250 MHz band, and a car approaching head on at 100 km/h (27.78 m/s). Illustrative inputs.
Δf = 2 × 27.78 × 24.15e9 / 299,792,458 ≈ 4,475 Hz
So each km/h of closing speed produces about 44.8 Hz of shift at this frequency. The same arithmetic gives about 19.5 Hz per km/h at 10.525 GHz and about 64.3 Hz per km/h at 34.7 GHz. Higher carrier frequencies give a larger shift for the same speed, which is one reason higher bands allow a shorter measurement time.
The answer is in the audio range, so the measurement is a matter of counting a beat note of a few kilohertz, which is easy for simple electronics.
The cosine effect
Radar measures only the radial component. If the beam meets the car at angle θ to its direction of travel, the radar reads v cos θ:
| Angle between beam and travel | Fraction of true speed measured | A car at 100 km/h reads |
|---|---|---|
| 0° | 1.000 | 100.0 km/h |
| 5° | 0.996 | 99.6 km/h |
| 10° | 0.985 | 98.5 km/h |
| 20° | 0.940 | 94.0 km/h |
| 30° | 0.866 | 86.6 km/h |
| 45° | 0.707 | 70.7 km/h |
Because cos θ never exceeds one, the cosine effect on a single target always makes the reading low, never high. Moving radars, which have to subtract their own speed measured from the ground return, have additional ways to go wrong when the patrol speed is misjudged, and that is a topic for the agencies that certify the devices.
Weather radar
NOAA's JetStream pages say that all modern weather radars are Doppler radars. The NEXRAD network is described as 160 high resolution Doppler radars operated jointly by the National Weather Service, the Federal Aviation Administration and the Department of Defense. NCEI names the third partner as the US Air Force. The individual unit is the WSR-88D (Weather Surveillance Radar, 1988, Doppler).
The WSR-88D is a pulsed Doppler radar. NOAA notes that in its normal short pulse mode each pulse lasts 1.57 millionths of a second and is repeated around 1,300 times per second, so in each hour the radar transmits for a little more than seven seconds and listens for the rest. Range comes from the time between pulse and echo. Velocity comes from the change in the echo's phase from one pulse to the next. NOAA describes that phase change as the radar equivalent of the Doppler shift you hear from a siren.
NOAA's velocity page lays down three rules that apply to every Doppler radar:
- Radial velocity is always less than or equal to the true velocity.
- They are equal only when the target moves directly toward or away from the radar.
- When the target moves at right angles to the beam, the radial velocity is zero.
The line where the radial velocity reads zero is called the zero isodop, and forecasters use it to infer wind direction. By NOAA's convention, green shows motion toward the radar with negative values and red shows motion away with positive values. NOAA adds that at 100 miles from the radar the beam is already nearly 12,000 feet above the ground, so the velocity you see far from the site is wind aloft, not at the surface.
Worked example 4: wind in a weather radar beam
NOAA's National Centers for Environmental Information (NCEI) describes NEXRAD as a network of 160 S band Doppler weather radars. Assume a transmit frequency of 2.8 GHz, a wavelength of about 10.7 cm. The S band is the confirmed part; the exact 2.8 GHz figure is our illustrative choice, since each radar has its own assigned frequency. Rain drops moving away from the radar at 20 m/s produce:
Δf = 2 × 20 / 0.1071 ≈ 374 Hz
A shift of 374 Hz on a 2.8 GHz carrier is about one part in 7.5 million. A pulsed radar does not measure that directly as a frequency; it measures the phase change between successive pulses, which is equivalent.
That method creates a hard limit. Phase wraps around every 360°, so a pulsed Doppler radar can only measure radial velocities up to the Nyquist velocity before the values alias (fold over):
v_max = λ × PRF / 4
r_max = c / (2 × PRF)
With λ = 0.107 m and the roughly 1,300 pulses per second NOAA quotes, v_max ≈ 34.8 m/s and the maximum unambiguous range r_max ≈ 115 km. Multiply them and the PRF cancels: v_max × r_max = c λ / 8. Raise the pulse rate to measure faster winds and you shorten the range; lower it to see further and fast winds fold. Radar engineers call this the Doppler dilemma, and it is why weather radars alternate pulse rates within a scan.
Why does GNSS receiver design depend on Doppler?
A GPS satellite is a radio transmitter in a fast orbit. The current interface specification, IS-GPS-200 revision N, dated 1 August 2022 and published by the US Coast Guard Navigation Center, sets the nominal carrier frequencies at 1575.42 MHz for L1 and 1227.6 MHz for L2. Every receiver on Earth sees those carriers shifted.
Worked example 5: how far GPS signals are shifted
GPS satellites orbit in about half a sidereal day, 43,082 seconds. Kepler's third law gives the orbital radius:
a = (GM T² / 4π²)^(1/3) ≈ 26,560 km
v = √(GM / a) ≈ 3,874 m/s
The maximum line of sight speed a stationary receiver sees, again at the horizon on an overhead pass and ignoring Earth's rotation, is:
v_r(max) = 3,874 × 6,371 / 26,560 ≈ 929 m/s
Δf(L1) = 1575.42e6 × 929 / 299,792,458 ≈ 4,883 Hz
So a receiver sitting still sees L1 carriers anywhere within about ±4.9 kHz of nominal. A car at 30 m/s adds up to about 158 Hz more. The receiver's own crystal oscillator is usually the bigger uncertainty: an inexpensive crystal a couple of parts per million off frequency adds a few kilohertz of apparent shift on top of the true Doppler.
Acquisition: searching a grid of code phase and Doppler
To lock onto a satellite, a receiver correlates the incoming signal with a local copy of that satellite's spreading code. A correlation only produces a peak if two things are right at once: the code is aligned in time (code phase), and the local carrier matches the received carrier closely enough (Doppler). The receiver therefore searches a two dimensional grid.
The width of each Doppler bin depends on how long the receiver integrates. IS-GPS-200 defines the C/A code as a sequence 1 millisecond long at a chipping rate of 1,023 kbps, so 1,023 chips per period. With 1 millisecond of coherent integration, matching one code period, a carrier error of 1 kHz rotates the phase through a full cycle during the integration and the correlation cancels out. A common rule of thumb is a bin spacing of roughly half the inverse integration time, about 500 Hz for 1 ms. To cover ±5 kHz of satellite Doppler plus several kilohertz of clock error, a cold receiver searches roughly 20 to 40 Doppler bins for each of the 1,023 code chips. That search is why a receiver with no idea where it is or what time it is takes much longer to get its first fix than one that already knows roughly where the satellites are and can predict their Doppler.
Doppler also stretches the code itself. The code rate shifts by the same fraction as the carrier, 929 / c ≈ 3.1 parts per million, or about 3.2 chips per second on the 1.023 MHz C/A code. A receiver that tracked the carrier but not the code would slowly slide out of alignment, so tracking loops use the carrier Doppler to steer the code clock as well.
Velocity from Doppler
Once tracking, the receiver measures each satellite's Doppler continuously. Subtract the shift predicted from the satellite's own known velocity, and what remains is the line of sight component of the receiver's velocity plus the receiver clock's frequency error. With four or more satellites in different directions, the receiver solves for three velocity components and the clock drift together, exactly as it solves for three position components and the clock offset from pseudoranges. Velocity from Doppler is typically smoother and more precise than velocity obtained by differencing positions, which is why receivers report speed even when the position is noisy.
The relativistic correction in the GPS specification
IS-GPS-200N specifies that the satellite clock is deliberately offset by Δf/f = −4.4647 × 10⁻¹⁰ before launch, so the nominal 10.23 MHz reference becomes 10.2299999954326 MHz. Seen from the ground, the combination of gravitational blueshift (the satellite clock sits higher in Earth's gravity well and runs fast) and time dilation from its orbital speed (which makes it run slow) would otherwise make the clock drift. On the L1 carrier, the offset corresponds to about 0.7 Hz. It is a tiny number with a large effect. By our own arithmetic, 4.4647 × 10⁻¹⁰ × 86,400 seconds is about 38.6 microseconds per day, which at the speed of light is about 11.6 km of range error accumulating every day if nothing corrected it. The transverse Doppler effect from the previous section is the velocity half of that correction.
How Sputnik's Doppler shift led to Transit
The connection between Doppler and satellite navigation is not an analogy. It is literally how satellite navigation started.
In their account in the Johns Hopkins APL Technical Digest, Guier and Weiffenbach describe meeting in the APL cafeteria on the Monday after Sputnik 1's launch on 4 October 1957 and deciding to listen in. Weiffenbach had a good 20 MHz receiver for his doctoral work, and APL sat about 12 miles from the National Bureau of Standards time and frequency station WWV, which gave them an accurate reference. They recorded the Doppler shifted tone with WWV time stamps.
Over the following weeks they worked out Sputnik's orbit from the Doppler data alone. Every other tracking organisation they knew of was using angle measurements from radio interferometers; Guier and Weiffenbach note they used Doppler simply because it was the only data they had. Their analysis showed that a complete set of orbit parameters could be inferred from a single pass of Doppler data, nearly horizon to horizon, provided they also solved for an ionospheric correction and the satellite oscillator's frequency and drift: nine unknowns in total, six orbital and three system parameters.
On Monday 17 March 1958, APL's Frank McClure asked them whether the problem could be inverted: if the orbit is known, can a receiver find its own position from the Doppler curve? With the orbit known, the unknowns dropped to five, and with a cooperative satellite broadcasting two stable frequencies to remove ionospheric error, to three. Their first simulations showed accuracy far beyond what they had expected. McClure and Richard Kershner sketched the essentials of the Transit system over a weekend: several satellites in polar orbits broadcasting two ultrastable frequencies along with their orbit parameters, a tracking network to keep those orbits current, and an injection station to upload them. The Navy needed Polaris submarines to know their launch position accurately at sea; active sonar or a large tracking dish would have given a submarine away, while a Doppler receiver needed only a simple antenna and could give a fix about once an hour anywhere on Earth. In the authors' words, Transit and a weather satellite system became the first two operational satellite systems in the free world.
GPS replaced Doppler positioning with ranging from many satellites at once, but every GPS receiver still measures and uses Doppler, as the previous sections show.
How did redshift feed Hubble's 1929 velocity and distance relation?
Doppler's 1842 prediction that the principle would measure stellar motion came true with spectroscopy. Atoms absorb and emit light at fixed wavelengths, so a known pattern of spectral lines acts like a siren with a known pitch. If the whole pattern is shifted toward longer wavelengths, the source is receding; toward shorter, it is approaching. Astronomers define the redshift:
z = (λ_observed − λ_emitted) / λ_emitted
v ≈ c z (for z much less than 1)
On 15 March 1929, Edwin Hubble of the Mount Wilson Observatory published "A relation between distance and radial velocity among extra-galactic nebulae" in the Proceedings of the National Academy of Sciences, volume 15, issue 3, pages 168 to 173. The paper combined radial velocities derived from spectral line shifts with Hubble's own distance estimates and found that more distant nebulae (galaxies) recede faster, roughly in proportion to distance: v = H₀ d.
Two notes keep this honest. First, Hubble's original distance scale was badly off, so his proportionality constant was several times larger than modern values; the relation was right and the calibration was not. Second, at cosmological distances the redshift is better described as the expansion of space stretching light in transit than as a Doppler shift from motion through space. For nearby galaxies, the Doppler picture and v ≈ cz work well.
NASA notes that measuring the expansion rate was one of the main goals of the Hubble Space Telescope when it launched in 1990, and that after more than three decades of observations teams have measured it to a precision of just over 1 percent, using Cepheid variable stars and Type Ia supernovae as distance markers.
Worked example 6: from redshift to distance
A galaxy shows its hydrogen alpha line, which is 656.28 nm in the laboratory, at 662.84 nm. Illustrative numbers.
z = (662.84 − 656.28) / 656.28 ≈ 0.0100
v ≈ c z ≈ 299,792 km/s × 0.0100 ≈ 2,998 km/s
If we take an illustrative round value of 70 km/s per megaparsec for H₀:
d = v / H₀ ≈ 2,998 / 70 ≈ 43 megaparsecs, about 140 million light years
The distance is only as good as the H₀ you use, and measurements by different methods still disagree by several percent, so treat the last digit with suspicion. The velocity, by contrast, comes straight from a wavelength measurement.
Where else does the Doppler effect appear?
Medical ultrasound
The National Institute of Biomedical Imaging and Bioengineering (NIBIB) at the US National Institutes of Health explains that ultrasound transducers produce sound above the 20 kHz threshold of human hearing, mostly in the megahertz range, and that Doppler and color Doppler ultrasound measure the speed and direction of blood flow in vessels and in the heart. The physics is the radar equation with sound in tissue instead of radio in air:
Δf = 2 × f₀ × v × cos θ / c_tissue
Worked example 7. Illustrative inputs: a 5 MHz probe, blood moving at 0.5 m/s, a 60° angle between beam and vessel, and the roughly 1,540 m/s average speed of sound in soft tissue that scanners conventionally assume.
Δf = 2 × 5e6 × 0.5 × cos 60° / 1,540 ≈ 1,623 Hz
The shift lands in the audible range again, which is why Doppler units can play blood flow through a speaker. The cos θ term matters more here than in traffic radar, because sonographers often cannot align the beam with the vessel; at 90° the measured shift is zero, exactly as with NOAA's zero isodop.
Astronomy beyond Hubble
Radial velocity measurements of stars track binary orbits and the small reflex wobble a planet induces in its star. The principle is the same as Doppler's original double star idea, only the instruments are millions of times more sensitive.
Wi-Fi, 4G and 5G mobility
For a mobile radio link the Doppler shift is f_d = v f₀ / c, one way. It matters because modern radio links divide the channel into many closely spaced subcarriers, and a frequency shift that is a noticeable fraction of the subcarrier spacing causes the subcarriers to leak into each other. Some illustrative figures:
- A person walking at 1.4 m/s using 5.8 GHz Wi-Fi: about 27 Hz.
- A car at 120 km/h on a 5 GHz link: about 556 Hz.
- A train at 500 km/h on a 3.5 GHz cellular carrier: about 1,620 Hz.
Multipath makes it worse. Reflections arrive from different directions with different Doppler shifts, so a moving receiver sees not one shift but a spread, which shows up as fast fading. Receivers estimate and correct the frequency offset continuously, and system designers pick subcarrier spacings and pilot densities so that the expected Doppler at target speeds is a small fraction of the spacing.
Table: scenarios, speeds, carriers and resulting shifts
All values are our own calculations from the formulas above; inputs marked illustrative are representative choices, not measurements.
| Scenario | Typical radial speed | Carrier or tone | One way or two way | Resulting shift |
|---|---|---|---|---|
| Ambulance siren passing pedestrian | 25 m/s | 700 Hz sound (illustrative) | One way, moving source | +55 Hz approaching, −48 Hz receding |
| Cyclist passing parked siren | 25 m/s | 700 Hz sound (illustrative) | One way, moving observer | +51 Hz, −51 Hz |
| Walking with a phone on Wi-Fi | 1.4 m/s | 5.8 GHz | One way | about 27 Hz |
| Car on a 5 GHz link | 33 m/s (120 km/h) | 5 GHz | One way | about 556 Hz |
| High speed train on cellular | 139 m/s (500 km/h) | 3.5 GHz | One way | about 1.6 kHz |
| Traffic radar, car at 100 km/h | 27.8 m/s | 24.15 GHz | Two way | about 4.5 kHz |
| Weather radar, wind away from radar | 20 m/s | 2.8 GHz (illustrative) | Two way | about 374 Hz |
| Doppler ultrasound, blood flow at 60° | 0.25 m/s along beam | 5 MHz in tissue | Two way | about 1.6 kHz |
| Sputnik 1, 1957 | about 7.5 km/s | about 20 MHz | One way | about ±500 Hz (from APL's account) |
| LEO satellite, 420 km | up to 7.19 km/s | 437 MHz | One way | up to about ±10.5 kHz |
| GPS satellite, stationary user | up to 0.93 km/s | 1575.42 MHz (L1) | One way | up to about ±4.9 kHz |
| Galaxy at z = 0.01 | about 3,000 km/s | Hydrogen alpha, 656.28 nm | Redshift | +6.6 nm in wavelength |
Two patterns stand out. First, for radio the shift scales with carrier frequency, so the same car produces three times the shift on a Ka band radar that it does on X band. Second, for sound the speeds involved are a large fraction of c, so shifts are a large fraction of the tone, while for radio and light they are parts per million or smaller and need careful frequency measurement.
How to choose the right Doppler formula
| Situation | Use | Why |
|---|---|---|
| Sound, source moving, observer still air | f = f₀ c / (c − v_s) | The source changes the wavelength in the medium |
| Sound, observer moving, source still | f = f₀ (c + v_o) / c | The wavelength is unchanged; the observer meets crests faster |
| Sound, both moving, wind present | Full formula, with wind added to c along the path | Motion relative to the air is what counts |
| Radio or light, speed under about 1 percent of c | Δf ≈ f₀ v / c | Relativistic terms are smaller than measurement error |
| Radio or light, high speed or precision timing | Exact relativistic formula, plus gravitational terms if clocks are involved | GPS shows the parts per billion terms matter |
| Reflection (radar, sonar, ultrasound) | Δf ≈ 2 f₀ v / c | The target receives and re-radiates, shifting twice |
| Velocity at an angle | Replace v with v cos θ | Only the radial component shifts the frequency |
| Distant galaxies | Use z directly and a cosmological model | Redshift there is not a simple velocity |
Walkthrough: reproduce every number in Python
You can rerun every figure in this post with standard Python. The script below uses only the standard library, so there is nothing to install for the calculations themselves. If you prefer to pull the speed of light from a library, SciPy's scipy.constants module provides it as c.
Step 1: create a clean, pinned environment
mkdir doppler-check && cd doppler-check
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
# Optional: only if you want scipy.constants instead of the literal value
python -m pip install "scipy==1.14.1"
python -m pip freeze > requirements.txt
Pinning an exact version means the script behaves the same next year. Freezing to requirements.txt records exactly what you installed, which matters for the scan in Step 4.
Step 2: write the calculations
# doppler.py
import math
C_LIGHT = 299_792_458.0 # m/s, exact (NIST CODATA)
GM_EARTH = 3.986004418e14 # m^3/s^2
R_EARTH = 6_371e3 # m, mean radius
def sound_doppler(f0, c=343.0, v_obs=0.0, v_src=0.0):
"""Positive speeds mean moving toward the other party."""
return f0 * (c + v_obs) / (c - v_src)
def em_doppler_exact(f0, v):
b = v / C_LIGHT
return f0 * math.sqrt((1 + b) / (1 - b))
def radar_shift(f0, v_radial):
return 2 * v_radial * f0 / C_LIGHT
def max_range_rate(alt_m=None, a_m=None):
r = a_m if a_m else R_EARTH + alt_m
v = math.sqrt(GM_EARTH / r)
return v, v * R_EARTH / r
# Example 1: siren
for label, kw in [("approach", {"v_src": 25}), ("recede", {"v_src": -25}),
("cyclist toward", {"v_obs": 25}), ("cyclist away", {"v_obs": -25})]:
print(f"siren {label:15s} {sound_doppler(700, **kw):8.1f} Hz")
# Example 2: LEO satellite at 420 km
v, vr = max_range_rate(alt_m=420e3)
for f in (145.8e6, 437e6, 2.2e9):
exact = em_doppler_exact(f, vr) - f
print(f"LEO v={v:.0f} m/s vr={vr:.0f} m/s f={f/1e6:7.1f} MHz shift={exact:9.1f} Hz")
# Example 3: traffic radar
kmh = 100
print(f"K band 24.15 GHz, {kmh} km/h: {radar_shift(24.15e9, kmh/3.6):.0f} Hz")
# Example 4: weather radar Nyquist limits
lam, prf = C_LIGHT / 2.8e9, 1300
print(f"wx radar 20 m/s: {radar_shift(2.8e9, 20):.0f} Hz, "
f"v_max={lam*prf/4:.1f} m/s, r_max={C_LIGHT/(2*prf)/1e3:.0f} km")
# Example 5: GPS L1
T = 43_082.0
a = (GM_EARTH * T**2 / (4 * math.pi**2)) ** (1/3)
v, vr = max_range_rate(a_m=a)
print(f"GPS a={a/1e3:.0f} km v={v:.0f} m/s vr={vr:.0f} m/s "
f"L1 shift={1575.42e6*vr/C_LIGHT:.0f} Hz")
Step 3: run it and compare
python doppler.py
Expected output, matching the worked examples:
siren approach 755.0 Hz
siren recede 652.4 Hz
siren cyclist toward 751.0 Hz
siren cyclist away 649.0 Hz
LEO v=7661 m/s vr=7187 m/s f= 145.8 MHz shift= 3495.6 Hz
LEO v=7661 m/s vr=7187 m/s f= 437.0 MHz shift= 10477.1 Hz
LEO v=7661 m/s vr=7187 m/s f= 2200.0 MHz shift= 52745.2 Hz
K band 24.15 GHz, 100 km/h: 4475 Hz
wx radar 20 m/s: 374 Hz, v_max=34.8 m/s, r_max=115 km
GPS a=26562 km v=3874 m/s vr=929 m/s L1 shift=4883 Hz
If your numbers differ in the last digit, check that you used 343 m/s for sound, not 340, and that you did not drop the factor of two in the radar function.
Step 4: keep the script's dependencies healthy
A calculation script is small, but the moment it grows into a notebook, a plotting tool or a ground station tracker it collects dependencies, and those dependencies collect vulnerabilities over time. Scan the folder with the Safeguard CLI and read the JSON results it writes under ./output:
safeguard scan --dir .
ls output/
Do this again whenever you add a library, and keep requirements.txt committed so a colleague who reruns your numbers installs the same versions.
Step 5 (optional): hear a satellite's Doppler yourself
If you have a software defined radio receiver, open source satellite tracking software can predict passes and correct for Doppler automatically. Turn the correction off for one pass and you will hear a beacon slide across the band exactly as worked example 2 predicts. Install such tools from your distribution's package manager or the project's own signed releases, and check them the same way you checked the Python environment.
Common mistakes
- Dropping the factor of two for reflections. Radar, sonar and ultrasound shift the wave on the way out and again on the way back. One way formulas give half the answer.
- Using the light formula for sound. Sound has a medium, so the moving source and moving observer cases differ. Using Δf ≈ f₀ v / c for a siren gives a symmetric answer that is wrong by a few hertz at street speeds and badly wrong near the speed of sound.
- Mixing up sign conventions. Pick one convention (positive means approaching) and stick to it. Many textbook errors come from flipping one sign but not the other.
- Forgetting the angle. Only the radial component of velocity produces a shift. Weather radar, traffic radar and ultrasound all read low when the beam is not aligned with the motion, and read zero at 90°.
- Ignoring wind and temperature for sound. The speed of sound is about 331 m/s at 0 °C and about 343 m/s at 20 °C. A strong wind along the path changes the effective c.
- Treating cosmological redshift as a velocity. For nearby galaxies v ≈ cz is fine. For distant ones, use z and a cosmological model.
- Confusing Doppler with clock error in receivers. A GPS receiver's oscillator offset looks exactly like a Doppler shift common to every satellite. That is why the velocity solution includes a clock drift term.
- Forgetting aliasing in pulsed radar. A radial wind faster than the Nyquist velocity folds over and can show up as motion in the wrong direction. Check the radar's Nyquist velocity before trusting a strong couplet.
- Assuming the pitch drops exactly when the vehicle passes. Sound travel time delays what you hear, and the glide is spread over the whole approach, steepest at closest approach.
FAQ
What is the Doppler effect in simple terms?
It is the change in frequency of a wave when the source and the observer move relative to each other. Moving closer raises the received frequency; moving apart lowers it. You hear it as the drop in pitch when a siren passes.
What is the Doppler effect formula?
For sound in still air, f = f₀ (c + v_o) / (c − v_s), with speeds positive when moving toward each other. For light and radio at everyday speeds, Δf ≈ f₀ v / c. For a reflected wave, as in radar, Δf ≈ 2 f₀ v / c.
Who discovered the Doppler effect?
Christian Doppler, an Austrian mathematician and physicist, presented the principle in Prague on 25 May 1842 in a paper about the coloured light of double stars. Experiments with musicians on trains tested it with sound in 1845.
Why does a siren sound higher when it approaches and lower when it leaves?
As the vehicle approaches, each new sound crest is emitted closer to you than the last, so the crests arrive more often and you hear a higher pitch. As it leaves, each crest starts further away, so they arrive less often and the pitch drops.
Why are the moving source and moving observer formulas different?
Sound travels at a fixed speed relative to the air. A moving source changes the actual wavelength in the air; a moving observer leaves the wavelength alone and just meets crests faster. Light has no medium, so only relative velocity matters and the cases merge.
How does police radar use the Doppler effect?
The radar transmits a steady microwave signal, the car reflects it, and the radar measures the beat between the transmitted and received frequencies. That beat is the two way Doppler shift, 2 f₀ v / c, which converts directly to the car's speed along the beam.
How does Doppler weather radar measure wind?
A pulsed Doppler radar such as the WSR-88D measures the phase change of echoes from rain, snow or debris between successive pulses. That gives the radial velocity, the component of motion toward or away from the radar. Forecasters infer wind direction from patterns such as the zero isodop.
Does GPS use the Doppler effect?
Yes. Receivers must search over the expected Doppler range, up to about ±4.9 kHz on L1 for a stationary user, to acquire satellites. Once tracking, they use measured Doppler shifts to compute velocity. The first satellite navigation system, Transit, computed position from Doppler alone.
What is the difference between redshift and the Doppler effect?
For nearby objects, redshift is the Doppler effect applied to light: a receding source shifts spectral lines to longer wavelengths. For distant galaxies, most of the redshift comes from the expansion of space while light travels, which astronomers describe with z rather than a simple velocity.
Does the Doppler effect work for light?
Yes. The exact formula comes from special relativity: f = f₀ √((1 + β)/(1 − β)) for approaching motion, with β = v/c. At ordinary speeds it reduces to Δf/f ≈ v/c. Relativity also adds a small transverse Doppler shift that has no counterpart for sound.
The software that runs the receivers: an honest bridge
Safeguard does not do physics. Our models are single purpose security models, and nothing in this post was calculated by them; the arithmetic comes from the published formulas and the Python script above. The link to Safeguard is narrower and practical. The things that measure Doppler today are software: radar signal processing code, GNSS receiver firmware and host libraries, satellite tracking tools, software defined radio stacks and the Python notebooks engineers use to check results. Those programs pull open source components, and the components need the same dependency hygiene as any other application. That is the part Safeguard covers. It does not analyse radar hardware, scan firmware images or test a receiver's accuracy.
A ground station tracker, a radar analysis notebook or a GNSS logging service is usually a thin layer of your own code on top of open source libraries for numerics, plotting, networking and device access. When one of those libraries ships a vulnerability, the questions are the same as for any other application: is a fixed version available, and how quickly can you move to it.
Fix it without waiting for upstream
Whatever the vulnerability, most of the risk sits in two gaps. The first is the time between a fix being published and that fix actually running in your production builds. The second, and worse, is the time before any fix exists at all, while a maintainer works out a patch and a release schedule. Waiting through both gaps is a habit, not a requirement. Safeguard gives teams three ways to close them.
1. Autonomous remediation: pull requests, not tickets
When a fixed version exists, Safeguard's Griffin models open a tested, policy gated pull request that moves the affected dependency to the safe version. You can run it on one repository or in bulk across every project that carries the vulnerable version. Remediation covers eight categories, including dependencies, licenses, security posture and findings. Reachability analysis ranks the vulnerable code paths your application actually calls first, so the first pull requests you merge are the ones that matter most. Autonomous remediation ships switched off, with every category set to Manual, so your team decides how much runs on its own and what still needs a human approval.
2. Gold Open Source: the safe version in seconds, free
gold.safeguard.sh is free and needs no login. Search any CVE or package to see affected and fixed versions, CVSS, EPSS, CISA KEV status and a recommended safe version, or use the "Am I affected?" checker. The same data is available through a free read API, README status badges and RSS threat feeds. The safeguard-sh/gold-scan-action GitHub Action can fail a build on a known exploited vulnerability, on any known vulnerability, or never, so a version you have just removed cannot quietly come back in next week's merge.
3. Gold Registry: start from components that are already fixed
registry.safeguard.sh provides hardened, drop in replacements for upstream packages and container images. Every Gold artifact is held continuously to zero exploitable critical or high CVEs, zero malware and a completed license check, with SLSA L3 or higher provenance, a Sigstore signature and a public evidence page you can hand to an auditor. An artifact loses its Gold badge if it regresses. Teams can point their own package directory at the registry so hardened equivalents resolve without changing how developers install anything.
When upstream has no fix yet, or will not ship one, Safeguard first works to get the fix accepted upstream. If the issue is severe or upstream will not move, Safeguard builds a fork, fixes the vulnerability there and publishes a hardened Gold build, so you are not stuck on a maintainer's release schedule. You can also request a hardened, compatibility tested build of a specific package. This fork and patch flow is in early access today, so ask which packages it covers before you plan around it.
| Your situation | What to use |
|---|---|
| A fixed version exists | Autonomous remediation opens the upgrade pull request; Gold Open Source confirms the safe version |
| You need to know today whether you are affected | Gold Open Source lookup and "Am I affected?" checker, free and without login |
| You want vulnerable versions to stop shipping | The Gold scan GitHub Action in CI, plus Safeguard policies and gates |
| Upstream has no fix yet, or will not ship one | A custom Gold request; fork and patch (early access) |
| You want to start clean on new projects | Pull hardened components and images from Gold Registry |
One honest limit: when the vulnerable code lives in a vendor appliance, a hosted service or an operating system runtime you do not build yourself, the fix still has to come from that vendor or distribution. The steps above apply to the open source dependencies and container images you build and ship, which is where most teams carry the largest and least tracked share of their exposure.
See how Safeguard would help
None of these demos involve Doppler calculations; they show the software side described in the bridge above.
The first demo is a real Safeguard CLI session: it installs the CLI, opens the interactive terminal and asks it to fix a lodash CVE in a repository. It reads the finding and advisory, asks before each command, edits package.json to lodash 4.17.21, runs npm install and npm test with approval, prints a summary and pushes nothing. The same flow applies to a satellite pass prediction web app or a radar data dashboard your team maintains: scan the repository, then let the assistant propose the dependency upgrade under your approval.
Click through it at your own pace, or open it full screen.
The second demo sets up the Safeguard runner on your own machine, approves it with its device code and then scans from the terminal. That suits teams who keep signal processing scripts, receiver logging tools or ground station code on their own hardware and want the scan to run where that code lives.
Click through it at your own pace, or open it full screen.
The third demo connects Claude to the Safeguard MCP server with OAuth and lets you choose which tools Claude can use. For an engineer who already works with Claude while writing tracking or analysis code, it brings dependency findings into the same conversation, limited to the tools you allow.
Click through it at your own pace, or open it full screen.
To try it on your own repositories, download Safeguard and follow the CLI documentation.
Quick check
A train horn sounds at 400 Hz and the train approaches a stationary listener at 30 m/s. What does the listener hear, with c = 343 m/s?
f = 400 × 343 / (343 − 30) = 400 × 343 / 313 ≈ 438.3 Hz. After the train passes, f = 400 × 343 / 373 ≈ 367.8 Hz.
A Ka band traffic radar at 34.7 GHz measures a Doppler shift of 3,000 Hz from a car driving straight at it. How fast is the car going?
v = Δf × c / (2 f₀) = 3,000 × 299,792,458 / (2 × 34.7e9) ≈ 12.96 m/s, about 46.7 km/h.
Why does a GPS receiver have to search over Doppler frequency before it can lock onto a satellite?
The satellite's motion shifts the L1 carrier by up to about ±4.9 kHz for a stationary user, and the receiver's own clock adds more. The correlation with the satellite's code only peaks when the local carrier is within a few hundred hertz of the received one, so the receiver must try a series of Doppler bins as well as code phases.
Sources
- NIST CODATA, speed of light in vacuum
- NIST, SI redefinition: the meter
- MacTutor History of Mathematics, Christian Andreas Doppler
- NASA Imagine the Universe, Doppler Shift
- NASA Glenn Research Center, Speed of Sound (Beginner's Guide to Aeronautics)
- NOAA JetStream, Introduction to Doppler Radar
- NOAA JetStream, How Radar Works
- NOAA JetStream, Radar Images: Velocity
- NOAA NCEI, Next Generation Weather Radar (NEXRAD)
- eCFR, 47 CFR 90.103, Radiolocation Service
- US Coast Guard Navigation Center, GPS technical references
- IS-GPS-200N, NAVSTAR GPS Space Segment/Navigation User Segment Interfaces (1 August 2022), PDF
- Guier and Weiffenbach, "Genesis of Satellite Navigation", Johns Hopkins APL Technical Digest 19(1), 1998, PDF
- NASA, Sputnik 1
- NASA, International Space Station reference
- NASA, Space Station Facts and Figures
- Hubble, "A Relation Between Distance and Radial Velocity Among Extra-Galactic Nebulae", PNAS 15(3):168 to 173, 1929, via PubMed Central
- NASA Science, Hubble: Discovering a Runaway Universe
- NIH NIBIB, Ultrasound
- SciPy documentation, Constants (scipy.constants)
- PyPI, scipy 1.14.1 release metadata
Last reviewed: 24 October 2026.