Geolocation by aeroplane sound Doppler shift

GM4AJK

Senior Member.
For those MBers that like the geolocation exercises here's a rather fancy technique I just saw on a YouTube video:

External Quote:
This video examines the amount of location information carried by inaudible background sounds, using the Doppler effect to locate a reference recording within ~100m, and only needing (in some cases) less 1-min of audio. This video raises awareness of these capabilities and closes by discussing preventative measures one could take.

Methodology: Aircraft position, altitude, and velocity data were sourced from ADS-B data and filtered in Python using ICAO type-code classification for propeller vs jet types. For each candidate location on a 200m grid, the closest point of approach (CPA) and sound propagation delay were computed from 3D slant distance, using a digital elevation model (DEM).

Doppler curve spectrogram measurements constrained each event's velocity and CPA slant distance. Candidates were then filtered by the 920-second offset between two flyovers, plus a silence constraint. The exact Doppler curve each candidate would hear was modelled, using emission-time radial velocity from interpolated ADS-B data.

Modelled doppler curves were scored against the observed spectrogram using a locked two-event scoring method. This corrected for measurement error on CPA time & fundamental frequency, while preserving the purely physics-derived temporal offset between the two events.

The pipeline was repeated again for a single 1-min clip of known time, US-wide search, and again, successfully scored the true location 1st.

Lastly, preventative measures were assessed, including rationale behind why common signal processing fixes fail (high-pass filtering, drowning out, and phone call compression/noise reduction).

This video is an educational demonstration of acoustics, signal processing, and data analysis using publicly available data. No code or tools are being released.

That last comment, "No code or tools are being released"... sounds very much like a challenge ;)


 
It's a cool "I wish I had thought of that" idea. And I think it would be pretty easy for an AI agent to implement once the idea is described. I'll let it have a bash at putting it in Sitrec.
That would be interesting and useful.

Additionally, remember all those "New Jersey Drone" videos? Well, using this technique would probably allow for much better evidence, when matched with the flight, that it's actually a plane, as it's said to be.
 
It's already done the basic spectral analysis (sitrec already had one), and identified flyover curves.

1793664700679.png
 
Attached is the AI's discussion of how the Sitrec implementation of colsto's idea works.

Codex GPT-6-Astra Ultra, used about 20% of a week's tokens, so it nominally cost $10.

Its time breakdown

Session time breakdown

Recorded work spans approximately 8 hours 2 minutes, from 15:40 to 23:42 PST on November 2, through completion of the illustrated guide. This includes pauses and overlapping work; it is not continuous computation.

Approximate elapsed time by phase
  • 15:40–16:45 — 1h 05m: Studying the source material, obtaining data, and developing the initial addon and spectrogram.
  • 16:45–18:12 — 1h 27m: Archive searches, audio measurements, and initial location attempts.
  • 18:12–22:34 — 4h 22m: Multiple-agent review, accuracy investigation, browser delays, and testing.
  • 22:34–23:22 — 48m: Correcting the brightness scoring, optimizing performance, completing the successful countrywide search, and producing output images and the infographic.
  • 23:22–23:42 — 20m: Committing the implementation and private records, creating the illustrated guide, and interaction gaps.

Measured long-running jobs
  • Original coarse search: 15m 15s
  • Corrected coarse search and terrain refinement: 18m 24s
  • Browser single-flyover search: 9m 36s
  • Countrywide run before a cache-related crash: about 5m
  • Final successful countrywide search: 10m 07s
  • Full test suite: 31m 01s

These main jobs total approximately 89 minutes. Additional recorded preparation, validation, and a stopped baseline run account for roughly another 11 minutes. This is an incomplete inventory, and some jobs overlapped other work.

Main avoidable detours
  • Initially optimizing trace error instead of spectrogram brightness.
  • A manually measured trace following interference.
  • Measurement bounds that were too restrictive.
  • A cache-key collision that forced a search restart.

Builds generally took only 3–4 seconds. I cannot reliably divide the remaining elapsed time into coding, reasoning, user interaction, and idle time.
 

Attachments

So what are the practical requirements for this?

The audio has to be fairly clean and obviously the original audio track (although it not matching given details would be a tell that the audio was replaced.)

You have to know the date and a fairly broad approx location, I guess the more data you have to narrow the parameters the quicker it is to run? In his example he has the whole of the USA, but if you knew it was say New Jersey it might be a quicker process.

Also is the reverse possible, knowing the location and the approximate date (say within 30 days) but using the flight data over a longer period to narrow down a day and time?

A lot of cases will have approx location and approx date.
 
This discussion reminds me of something I remember reading about it being possible to find the time of recordings by matching fluctuations in the mains electricity "hum". I'm sure it's been used in court to prove the date and time of video or audio recordings. Let me search...

This article is from 2012, so it's not a new thing:

https://www.bbc.co.uk/news/science-environment-20629671

External Quote:

Comparing the unique pattern of the frequencies on an audio recording with a database that has been logging these changes for 24 hours a day, 365 days a year provides a digital watermark: a date and time stamp on the recording.

Philip Harrison, from JP French Associates, another forensic audio laboratory that has been logging the hum for several years, says: "Even if [the hum] is picked up at a very low level that you cannot hear, we can extract this information."

It is a technique known as Electric Network Frequency (ENF) analysis, and it is helping forensic scientists to separate genuine, unedited recordings from those that have been tampered with.

Dr Harrison said: "We can extract [the hum] and compare it with the database - if it is a continuous recording, it will all match up nicely.
Looks like there is an open source tool that uses ENF, but I haven't got time now to dig into it.

Combining the two could be quite a powerful geolocation tool.
 
You have to know the date

Four years ago, Tom Scott did a video about extracting the date and time of an audio recording based on variations in the mains "hum" in the background.

External Quote:
Electrical Network Frequency analysis, ENF analysis, matches background hum against power grid logs. I talked to one of the researchers who works on it, and also set them a challenge.
 
Also is the reverse possible, knowing the location and the approximate date (say within 30 days) but using the flight data over a longer period to narrow down a day and time?

A lot of cases will have approx location and approx date.
Yeah, it would just take more processing time to search a wider data set. You probably get more false positives.
 
IIrc I read about a similar technique years ago, in Science or Nature. I can't remember exactly but it was called something like "acoustic light vision", background sounds being paralled to background illumination in normal sight. But I can find no pertinent references searching for 'acoustic light'.

Impressive job @Mick West !
 
Does anyone have a video or audio file that they think would be a good test case.

I'll record one here and see if it works with that.
 
Does anyone have a video or audio file that they think would be a good test case.
Surely we have already identified New Jersey drones right here on MB as test cases?

It's not that difficult to copy it, but any hurdle added lessen the amount of time it'll get abused. And you don't want Sitrec being cited in the news as the tool used by a killer to locate his victim.
Security by obscurity. There will likely be a ton of tools to do this by the end of next week. The best @Mick West can do is hold off on releasing it in Sitrec for a while.
 
IIrc I read about a similar technique years ago, in Science or Nature.
There are similar techniques out there. Some fields more esoteric than others I guess.

https://arxiv.org/html/2505.18726v1

External Quote:

Abstract

Can we determine someone's geographic location purely from the sounds they hear? Are acoustic signals enough to localize within a country, state, or even city? We tackle the challenge of global-scale audio geolocation, formalize the problem, and conduct an in-depth analysis with wildlife audio from the iNatSounds dataset. Adopting a vision-inspired approach, we convert audio recordings to spectrograms and benchmark existing image geolocation techniques. We hypothesize that species vocalizations offer strong geolocation cues due to their defined geographic ranges and propose an approach that integrates species range prediction with retrieval-based geolocation. We further evaluate whether geolocation improves when analyzing species-rich recordings or when aggregating across spatiotemporal neighborhoods. Finally, we introduce case studies from movies to explore multimodal geolocation using both audio and visual content. Our work highlights the advantages of integrating audio and visual cues, and sets the stage for future research in audio geolocation.
The aircraft doppler work is very interesting. I use a spectrograph based app 'Merlin' which captures real-time audio and pattern matches bird song for species ID. I've observed airborne doppler signals but nothing that I couldn't hear myself. Will have to look closer!

I'm wondering what the compute requirements would be to 'pre-compile', for each day, what all of the predicted flight line doppler signals would be for all points on, say, a country wide 100m grid from all of the ADBS data.
 
I'm wondering what the compute requirements would be to 'pre-compile', for each day, what all of the predicted flight line doppler signals would be for all points on, say, a country wide 100m grid from all of the ADBS data.
According to Astra, too much. Tens of terabytes per day. But you could cut it down by not precomputing everything.
The arithmetic is feasible; storing a separate predicted curve at every 100 m point is the expensive part. A useful daily index could run on a workstation or server. A literal nationwide library of sampled curves would produce hundreds of terabytes per day, even after excluding distant aircraft.


Assuming the contiguous US, one listener height at each location, and one sample per second:


  • Roughly 765 million grid points, calculated from about 7.65 million km² of land. Census area measurements
  • Our downloaded day's retained tracks contain approximately 95,000 aircraft-hours and 52 million kilometres of movement. I calculated these from intervals no longer than 30 seconds, excluding very slow movement. This is a workload estimate from our archive, not a complete national traffic census.

ADS-B lets us predict a Doppler multiplier and sound-arrival delay. It does not supply the aircraft's actual emitted frequencies, changing engine RPM, or loudness. We could store range and radial velocity instead, allowing sound speed to be adjusted later.


At eight bytes per sample—two 32-bit values—the approximate requirements are:


Aircraft included at each locationPredictions per recorded dayUncompressed storage/daySustained computation to keep up daily
Within 10 km horizontally10.7 trillion86 TB124 million predictions/s
Within 20 km43 trillion344 TB497 million/s
Within 50 km268 trillion2.15 PB3.1 billion/s

These exclude indexes and metadata, and assume full circular footprints; clipping at coastlines and borders reduces them. The radius is a coverage choice, not a guaranteed audibility limit.


Taking "all aircraft at all locations" literally gives approximately 2 exabytes per day.


For the 20 km version, storage throughput becomes a major constraint: writing 344 TB every day requires about 4 GB/s continuously, and retaining a year takes 125 PB, before replication.


I ran a small geometry benchmark here: calculating Doppler factors and delays, including writing results into RAM, reached approximately 476 million predictions/s. That suggests roughly 25 single-core hours of bare arithmetic per recorded day for the 20 km case. This excludes track interpolation, terrain access, indexing, compression, and disk writes. Parallel processing could accelerate calculation substantially, but those hundreds of terabytes still need somewhere to go.


Compression helps most when we avoid repeating the same flight geometry.


For illustration, replacing every sampled curve with a 32-byte passage summary would bring the 20 km case to approximately 6.7 TB/day on the 100 m grid. However, such a summary cannot represent arbitrary turns and speed changes exactly; it must reference the original track.


Using those summaries on a 2 km initial grid reduces that estimate to approximately 17 GB/day, followed by precise calculation around promising locations. That is much more practical.


For Sitrec, I would build this:


  1. Store each flight once, as compact position/velocity segments. Our day's roughly 54 million fixes imply about 2–4 GB of basic arrays, plus indexes and metadata.
  2. Precompute geographic/time indexes and coarse curve descriptors, so an observed Doppler shape retrieves plausible flights and regions quickly.
  3. Generate the detailed curves at query time, refining to 100 m or finer only where the audio supports a match.
  4. Send the shortlist to the lazy-loaded browser addon for fitting, labelled spectrograms, and inspection.

A 16–32-core machine, 64–128 GB RAM, and fast NVMe storage would be a reasonable prototype configuration for that indexed approach—not a measured production requirement. Processing can be tiled, so RAM need not hold the nationwide output.


The precomputation worth investing in is a searchable index of possible curve shapes, with shared flight tracks underneath it. Merely saving every curve would leave us with an enormous database that still needs to be searched.
 
I recorded 40 minutes of audio at around 6:30AM. My implementation failed to find my location. Possible too early for much air traffic. I'll record another now.
 
Aha, it actually seems like it might have somewhat worked, but there was a bug:
External Quote:

I found a concrete exclusion error. At the recorded position and time, the two nearest flight passes align with the two broad audio events. Their reported speeds are about 166 and 170 m/s, but I had capped the search at 135 and 120 m/s based on the broad-spectrum fits.

Those limits ruled out the correct-position explanations before ranking. I'm now checking why the audio fits underestimated speed and how much the replay data distorted the curves.
 
Last edited:
I recorded 40 minutes of audio at around 6:30AM. My implementation failed to find my location. Possible too early for much air traffic. I'll record another now.
While I understand the idea here is to test the code, I think the test use case is off. For Sitrec, I would expect it to be a video of "something in the sky". If it's a plane, audio would likely be picked up even if the observer didn't hear it. If it's claimed to be a drone, then again, I'd expect audio.
 
I recorded 40 minutes of audio at around 6:30AM. My implementation failed to find my location. Possible too early for much air traffic. I'll record another now.

That's the trick right? If there is no aircraft sound,it doesn't work. What about just 1 aircraft, or a helicopter? I'll try some today. If they're test cases, should it include the actual aircraft being recorded on ADSB?
 
That's the trick right? If there is no aircraft sound,it doesn't work. What about just 1 aircraft, or a helicopter? I'll try some today. If they're test cases, should it include the actual aircraft being recorded on ADSB?
There were planes flying over, and it did record the audio of at least two.

It seems like there's still some work to do with the Sitrec implementation.
 
While I understand the idea here is to test the code, I think the test use case is off. For Sitrec, I would expect it to be a video of "something in the sky". If it's a plane, audio would likely be picked up even if the observer didn't hear it. If it's claimed to be a drone, then again, I'd expect audio.
I'll get it working better with known time and location data first. Then try some unknown cases. Right now it's failing where it should succeed, so that needs fixing.
 
Tens of terabytes per day
Well not too bad, relatively. For a local disk array anyway. I suppose the limit would be N previous days that needed to be stored and maybe of a FIFO basis perhaps.

The precomputation worth investing in is a searchable index of possible curve shapes, with shared flight tracks underneath it.
Merely saving every curve would leave us with an enormous database that still needs to be searched.
ooh yeah, this sounds good. Or could the curves be generated as spatial layers in a GIS? Pretty sure a normal desktop GIS would fall over at the amount of data, but PostGIS might work at this scale.

I'm sure there is a comp.sci. PhD here for someone :)
 
I've been working on the same idea (with Claude Code/Opus 5.5), and tested it on two public live webcams with published camera locations (so I'm not doxxing anyone): the Ashland, VA train station cam and the Cornell Lab of Ornithology feeder cam. Here are the results: https://hexbird.io/a/9DGx3f-UzDY8CblJ5r_lbRKWZakK4F0y

Those tests were more constrained than a full CONUS search over 24 hours. I started with a 40 km radius around the nearest city to each livestream (Richmond for Ashland, Ithaca for Cornell), and used the streams' own timestamps. For each one I searched 3 hours of stream audio. The Ashland estimate is 43 m from the published camera location, Cornell's is 215 m.

Mick's guide and our pipeline share most of the core: the emission-time Doppler model, Earth-centered geometry with terrain and the geoid offset, one shared clock across all flyovers, pair matching when the time is unknown, a coarse grid with refinement, and a silence check.

The main differences:
  • I eventually implemented automatic detection and measurement of doppler curves. A matched-filter bank of modelled Doppler curves scans the whole recording for candidate flyovers. Each frequency row is normalized against its own background, which turned out to be the key step for faint curves. Curve tracing and acceptance are automatic too. Currently the accuracy is a bit worse than doing the measurements by hand: With no hand steps at all, the current pipeline gets 146 m at Ashland and 267 m at Cornell, in about 7 minutes for 3 hours of audio.
  • Atmosphere. I don't assume a constant sound speed. The sound-speed and wind profile comes from the aircraft's own airspeed, Mach and wind reports, anchored to the nearest METAR surface temperature. This made the largest difference at Cornell, where the matched aircraft were 10–13 km away.
  • Silence. It's checked automatically against every logged pass near a candidate location, not just a chosen quiet interval.
  • Refinement. Sitrec's continuous optimizer that moves position and clock together is better; I refine on a fixed grid and sweep the clock separately.
  • Scoring. I score against the traced curve. My brightness-along-the-curve variant did worse, but it used shorter FFT windows and different normalization from Sitrec's hybrid approach (traces to seed, brightness to rank), so we'll retest with that recipe.
Mick's speed-cap failure matches what we found: speed and distance fitted from a faint or partial curve are too loose to use as hard gates, and tight gates reject matching fly-bys.

Like Mick's reference run, mine weren't clean held-out tests, since settings were tuned on these recordings. A nationwide, date-only search on the same streams, with no clock, is in progress.

I am curious about what accepted ethical guidelines say about making tools like this available. The bar is low (anyone with a coding agent can build it in less than a day) but it is still a bar.
 
Reminder to self: Add "wow" by recording podcasts only whilst on a moving carousel from now on.
Someone needs to create a phone app that adds small amounts of random and rapidly changing pitch-shifts to the audio - either a video recording app or a post-processing one you can run videos through before sharing online.
 
Here's the video that @GM4AJK is referring to:


AI summary:
External Quote:

This video explores how inaudible background sounds, specifically from aircraft flyovers, can be used to geolocate a recording with high precision (often within 100 meters). The creator demonstrates a methodology using the Doppler effect and publicly available ADS-B flight data to turn ambient noise into a powerful location clue (1:26-1:56).

Key Steps in the Location Pipeline:

Data Sourcing: The process begins by collecting flight position, altitude, and velocity data for the entire continental United States on the day of the recording (3:02-3:29).
Modeling & Filtering: For every potential candidate location on a grid, the creator models the exact Doppler curve an observer would hear based on the aircraft's 3D flight geometry and local topography via a Digital Elevation Model (4:16-6:21, 14:10-15:35).
Scoring Methodology: A two-event "locked" scoring method is used to match observed spectrogram patterns against modeled curves, accounting for measurement errors while preserving the temporal physics of the flyovers (19:28-20:56).

Preventative Measures:
Toward the end of the video, the creator assesses why common methods to hide this information—such as high-pass filtering, drowning it out with other audio, or phone call compression—frequently fail because these low-frequency signals are highly persistent (26:09-28:03). The video concludes that making discrete cuts in recordings remains one of the few effective ways to disrupt the ability to calculate time-offset-based locations (27:06-27:11).
 
Back
Top