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.
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.
Find the aircraft in the audio.
The detector scans the full recording for moving frequency ridges and groups harmonics from the same passage.

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.

Find the shared position.
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
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.