A moving source.
A changing pitch.

A passing aircraft’s pitch changes with its motion relative to the microphone. DOPPLERGEIST matches that change to recorded flight paths.

Why the pitch falls.

On approach, each wave has less distance to travel than the one before it. Waves arrive closer together: a higher pitch. As the aircraft recedes, they arrive farther apart: a lower pitch.

How motion changes the pitch at a microphone An aircraft moves from left to right, emitting evenly timed sound waves. Waves are closer together ahead and farther apart behind. The received pitch drops as the aircraft passes. The diagram includes sound travel time and illustrates a constant tone and speed; it is not recorded data. Microphone AIRCRAFT MOTION → RECEIVED PITCHSource pitch ApproachRecession · time →
The physics behind the curve

For a steady source tone and a stationary microphone, the received frequency is f = f₀ c / (c + vᵣ). Here f₀ is the source frequency, c is sound speed, and vᵣ is radial velocity at emission, positive when moving away.

Sound emitted at time τ arrives at t = τ + r(τ) / c. The model solves for that emission time before calculating the pitch. The sound of closest approach arrives after the aircraft has passed.

Read the physical model ↗

Find the aircraft in the audio.

The detector scans the full recording for moving frequency ridges and groups harmonics from the same passage.

Across the recording
Automatic acoustic discovery plot showing Doppler ridges at multiple times in a real recording
Moving-frequency proposals found by the detector; proposals are not confirmed aircraft.

Match the flight path.

Historical ADS-B data supplies aircraft positions and velocities. The model predicts the sound received at each possible microphone position, including its travel time.

The flight-path model
Cyan sound-propagation model aligned with a measured aircraft Doppler curve
A trajectory-based prediction over the recorded spectrogram.

The search fits independent flyovers to one location and recording clock. Terrain and aircraft altitude enter the sound-propagation calculation.

The result includes ranked locations and a decision. Ambiguous matches or incomplete coverage produce an inconclusive result.

Decision rules
The candidate map
Scored microphone positions on a geographic grid, with the highest score marked by a star
Color encodes fit score, not location probability.

Run it locally.

Install Python 3.11 or later and FFmpeg, then start the local upload interface.

git clone https://github.com/1337isnot1337/DOPPLERGEIST.git
cd DOPPLERGEIST
python -m venv .venv
.venv/bin/python -m pip install .
.venv/bin/dopplergeist serve --jobs jobs --online --port 8765

Open http://127.0.0.1:8765 and provide your audio and recording-time window. File upload time does not establish when the audio was recorded.

Full setup instructions
See the method in recorded dataExplore the examples