Skip to main content

dopplerprint

CI PyPI License: MIT

Work out where an audio recording was made from the aircraft you can hear in it.

Left: spectrogram of a light aircraft flyover with its Doppler-shifted engine tone and the fitted curve. Right: relative-likelihood heatmap over aerial imagery, peaking next to the true recording location, with a faint mirror patch across the flight track.

A real flyover at Livermore, CA. The heatmap peaks next to the true microphone position (white dot); the faint patch across the flight track is the mirror solution that a single pass cannot rule out.

A passing propeller aircraft or helicopter leaves a tone in the recording whose pitch falls as it goes by. The shape of that curve fixes the aircraft's speed, its closest distance and the moment it was closest. dopplerprint fits those curves, looks up which aircraft were flying at that time in public ADS-B archives, and searches the ground for the point that would have heard every one of them at the right time and pitch.

Status: early research software. It works on real recordings when the start time is known to within a few minutes and the area to within a few kilometres. Contiguous US only. See Accuracy for what has been measured.

Quick start

pip install dopplerprint
dopplerprint locate recording.mp3 --start "2026-05-14 10:02 -07:00" --near "Livermore, CA"

Give it the local time the recording started, with its UTC offset (add "±10m" if unsure), and roughly where: a place name, lat,lon or a bounding box. dopplerprint finds the aircraft passes in the audio, downloads that day's ADS-B once (about 3.5 GB, after asking; cached in ~/.cache/dopplerprint), and prints the best location with a confidence level and the aircraft it matched. It writes result.html (map, tracks and spectrogram), result.geojson, result.gpkg for QGIS, and result.json.

From Python: dopplerprint.locate("recording.mp3", start=..., near=...) returns the same report as a dict. Every flag, the cache and exit codes: docs/USAGE.md.

Prebuilt wheels cover Linux, macOS and Windows. Audio is decoded natively (WAV, FLAC, MP3, AAC/M4A, Ogg); no ffmpeg needed. To build from source, see CONTRIBUTING.md.

Accuracy

Distance from the best-scoring point to the known microphone position, on real recordings and real ADS-B data.

Benchmark Setup Result
Livermore, CA: 40 recordings, one light-aircraft flyover each (Pathak 2026) Start time known to ±2 s; 4 km search radius, not centred on the microphone Right aircraft in 34/40. Median error 207 m; 5 within 100 m, 27 within 500 m.
Oyster Bay, NY: colsto's recording, two flyovers Same setup as DOPPLERGEIST's published replay (±5 s, 5.6 km radius) 79 m (DOPPLERGEIST: 52 m on the same inputs)

What these numbers do and don't show:

  • The flyover's position in the recording is supplied, not discovered: these runs test the location search, not automatic detection. locate detects passes automatically; that path is not yet benchmarked.
  • One flyover leaves two mirror solutions, one on each side of the flight track, and trades position along the track against the clock. Most errors over 1 km are one of these. A second aircraft usually resolves them.
  • The 6 misses picked a different aircraft and land 2–5 km away.
  • The Oyster Bay reference is a public approximate coordinate, not a surveyed position.

How it works

  1. Audio. Decode, whiten and build a log-frequency spectrogram. Find tonal ridges and fit a constant-velocity Doppler curve to each: rest frequency, speed, closest-approach distance and time.
  2. ADS-B. Stream adsb.lol daily archives into a compact Parquet store. Jets are kept but flagged, since their tones are rarely visible.
  3. Search. Score candidate locations coarse to fine (200 m down to 25 m). Each candidate must explain every flyover under one shared clock offset, and loses score for loud aircraft it should have heard but didn't.
  4. Output. Ranked locations with a relative-likelihood map, as HTML, GeoJSON and GeoPackage.

Details: architecture, physics, audio, ADS-B store, geodesy and terrain. The research behind each choice is in docs/research/.

Responsible use

This tool can place a recording, and so the person who made it, on a map. Use it on your own recordings, on material published for this purpose, or with the recordist's consent. Don't use it to find, track or expose people.

Credits and data

  • Method: colsto's video "This background sound leaks your exact location". DOPPLERGEIST (MIT) is an independent implementation and our comparison baseline. Project structure and GeoPackage output follow thunderprint.
  • ADS-B: adsb.lol, © adsb.lol contributors, ODbL 1.0. Track stores built from it, and the test fixtures in crates/dp-core/tests/fixtures/adsb/, stay under ODbL.
  • Aircraft types: tar1090-db.
  • Place names: OpenStreetMap Nominatim, data © OpenStreetMap contributors (ODbL); one request per name, cached.
  • Terrain: USGS 3DEP (public domain); fallback Copernicus GLO-30, © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018, provided under COPERNICUS by the European Union and ESA.
  • Geoid: NGA EGM2008 (public domain) via PROJ-data; assets/geoid/ is a CONUS crop.
  • Livermore recordings: Praveen Pathak, Zenodo 23424278, CC BY 4.0. Header image imagery: USGS The National Map / NAIP, public domain.

Licence

MIT, see LICENSE. Data keeps its own licence (above). Contributions welcome: CONTRIBUTING.md.

Metadata

Release files for dopplerprint 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dopplerprint 0.1.0
File Size Uploaded Provenance Actions
dopplerprint-0.1.0.tar.gz 2.0 MB With provenance Details for dopplerprint-0.1.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for dopplerprint 0.1.0
File Actions
dopplerprint-0.1.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for dopplerprint-0.1.0-cp311-abi3-win_amd64.whl
dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details for dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl
dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.11 abi3 Linux glibc 2.17+ x86-64 Details for dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details for dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl

Total release size: 78.2 MB

Release files / dopplerprint-0.1.0.tar.gz

Download URL dopplerprint-0.1.0.tar.gz
Size 2.0 MB
Tags Source
SHA-256 checksum
How to use checksums
b05a4bdce8bb8f11672688fb8440ed4ef6d0d93c7937e580ac75a84488d0d01c
BLAKE2b-256 checksum
How to use checksums
f5ccf1ff7807948016eb2e068de1ddcef9bcb7e7331295c3ece2dcccce438dde
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / dopplerprint-0.1.0-cp311-abi3-win_amd64.whl

Download URL dopplerprint-0.1.0-cp311-abi3-win_amd64.whl
Size 8.9 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
02bcde56870d521bca7dcc0467971873ca2ed1cefe3aa623d5bc39247c641a51
BLAKE2b-256 checksum
How to use checksums
5db176cd0bd35fcbbd0b9c62d3a0a2e58bc3dc40847ad676495097ea260b360c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl
Size 22.7 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
a197d85b641eba632ba18c4564bdc0686029d0cea4fe81861119f8ba4d807cab
BLAKE2b-256 checksum
How to use checksums
aef8622c4bdf5bd05468e319c29a646ae9aa49ebf8fd5bd55ec898ad2fdd8e34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 27.1 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
9d5314c766517c7fdbfeda725b6f7c2ea6cb5fb4d359b4f903d67a7349220eb2
BLAKE2b-256 checksum
How to use checksums
bc3901435cc6e62bd707815561eb9b898836cb8785d0c4f526d84f1ac249f27b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
Size 8.5 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
12433b8c15b87bd2c12ccfe739434491500168665565fc1da6eb4a0f033dfad9
BLAKE2b-256 checksum
How to use checksums
e4d6f1d855d58568e5bc5cbdefd1d95abc1cfa53e503f5fb8cfa2d4484dc4ecd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl

Download URL dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl
Size 9.0 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
1bdcd974c3f45a3afffb21951c5a6aeb3c9c0646ce9d23f9df094f8e9da965d5
BLAKE2b-256 checksum
How to use checksums
85c32c5de42525c4b16e85cfef0f202e40da197c66a49cc27e9eb8d5dc730268
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Security for dopplerprint 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for dopplerprint-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

6 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page