We live on Capitol Hill in Seattle, which means we live under airplanes. Sea-Tac arrivals come down over the neighborhood all day when the wind is from the south. Boeing Field traffic crosses low. On summer evenings the Kenmore Air floatplanes buzz home to Lake Union. Mostly you stop noticing. But every so often one goes over that rattles the windows, and I would look up and think: which one was that?
I wanted an actual answer. Not "the big ones," but which types, which airlines, how loud, and how often. So in August I pointed a microphone at the sky, pulled live flight positions off the internet, and started matching sounds to planes. Nine weeks later there is a listening station running on a small computer, three antennas, a calibrated microphone, and a log of 52,255 flyovers the mic heard and matched to a flight.
Here is the answer, and then the story of how the question kept dragging the project along behind it.
The loudest planes over the neighborhood. One dot per aircraft type at its typical flyover. The line runs out to the level that only one pass in ten exceeds. The dashed line is the median of all 14,130 measured passes. Every type in the top twelve but one is a long-haul widebody.
The loudest plane over Capitol Hill is the Airbus A340-300, Lufthansa's daily flight to and from Frankfurt, at a median of 64.7 dBA across fourteen passes, coming and going. Its climb-outs are the loudest of all: four engines at full power read 67 to 70 dBA on most of them. Behind it is the rest of the long-haul fleet, the A330neo, the 777-300ER, the A330-200 and the 747-8 freighters, all around 58 dBA. The everyday traffic, the 737s and the Embraer 175s that make up half of everything, comes in around 51. Landings are 6 dB louder than takeoffs. And the plane that stands out the most is not the loudest one at all. It is a Korean Air 747 freighter landing at 4:01 AM, 71 dBA over a background that was sitting at 27.
Version one: a microphone and a free API
The first version took an afternoon. Listen to the laptop microphone, wait for the level to jump, and when it does, ask a free ADS-B site which aircraft are within a few miles. Nearest one gets the blame. Write it down.
ADS-B is the gift that makes this possible. Every airliner and most small planes broadcast their position, altitude, speed and identity once a second, and sites like adsb.lol serve it all as JSON for free. So the "which plane" half of the question is nearly solved before you start. The "how loud" half is where everything went sideways.
The first surprise was that a good microphone barely notices a jet. On the laptop mic a flyover was an obvious bump. On a proper full-range USB mic the very same flyover moved the overall level by less than a decibel, because now the mic also heard the fridge, the traffic rumble, and its own hiss. A jet a few thousand feet up is a small addition to all of that. A simple threshold was hopeless.
The fix was to stop looking at how loud it was and start looking at where the energy sat. Jets are a broadband roar between about 80 and 1,000 Hz. Props and helicopters are a comb of harmonics from the blades. The detector now subtracts the mic's own noise spectrum, scores three frequency bands against how much they normally wobble when the sky is empty, and fires when a plane-shaped spectrum holds for two seconds. On flyovers that moved the total level by one decibel, those band scores went twenty to a hundred times above quiet.
The second thing I learned was to let the flight data lead. Instead of listening for noise and then asking who made it, the recorder now opens a record for every aircraft that passes within five miles and writes down what the mic heard during it, including nothing at all. Detection stops being a gate that can silently miss planes and becomes a measurement. It also hands the noise floor something it normally never gets: seconds where the sky is guaranteed empty, to calibrate against.
Nine weeks, day by day. Blue is a pass the mic heard and matched to a flight, amber is a sound no aircraft explained. The labels along the top are the upgrades. The first week is the laptop mic. The recorder took a few days off in October.
Which plane was that, really?
With one plane in the sky, attribution is easy. Over Capitol Hill there is rarely one plane in the sky. At the afternoon peak the neighborhood gets more than sixty flyovers an hour, and the departure climbing out to the west overlaps the arrival coming down overhead.
Nearest-plane-wins failed in a way that was obvious the moment I saw it in the log: an Airbus A350 passing about a mile away was recorded as unheard, because a Cessna 172 was always slightly closer. So the recorder now splits the sound across every plane in range. The measured power is modeled as each aircraft's loudness divided by its distance squared, added up, and a small least-squares fit works out the loudness of each. Because the planes are on different paths, their distance profiles differ, and that is what makes the split solvable. The A350 got its noise back.
Two more checks ride along with every pass. One is Doppler. The recorder takes the plane's motion from ADS-B, un-warps the audio by the pitch shift that motion predicts, and asks whether the tonal lines snap into focus. The real plane's tones do. A wrong candidate's, or the dryer's, stay smeared. The other is a clip: every heard pass saves 24 seconds of audio around closest approach, labeled with what ADS-B says it was. There are now 46,281 of those clips, 46 GB of them, and they are what the sound classifier learns from.
One flyover, as the mic heard it. A Southwest 737 MAX 8 landing at 1 AM on October 10. The level climbs from the 45 dB ambient floor to 72 and takes a minute to fade. Notice where the peak lands: seven seconds before the plane was closest. That turned out to matter.
Microphones
The laptop mic was fine for noticing planes and useless for measuring them. It reports a level relative to its own full scale, with the laptop's voice processing in the way. I went through an inexpensive USB condenser before landing on a miniDSP UMIK-2, a measurement mic that ships with its own calibration file. Apply the file's response curve, use its sensitivity figure, and the recorder reads real sound pressure in dB SPL. On the same 24 flyovers, recorded side by side, the condenser saw a median rise of 4 dB over ambient and the UMIK-2 saw 13.7.
Once the levels were real I could add the number airport noise monitors actually report, which is called LAmax: the A-weighted maximum level, with a slow time constant. A-weighting discounts the low frequencies our ears discount. It takes about 7 dB off an overhead jet and 15 to 20 off a distant departure, whose rumble is mostly below 200 Hz. Every flyover since September 26 carries an LAmax and the A-weighted background at that moment, and the charts in this post are built on those.
One caveat applies to every number here. The microphone is outdoors, but it sits under an eave, which shields it from straight overhead and colors what it hears. These are the levels at that one spot, not what an airport monitor standing in the open would read, and comparing the two would take a correction I have not measured.
How loud is a flyover? Landings are 6 dB louder than takeoffs at the median, because arrivals pass lower over the neighborhood and point their fans at it. Both tails reach the low 70s.
Seeing the sky properly
The public aggregators were good enough to start with and not good enough to finish with. Positions arrive a few seconds late, the sites rate-limit you, and now and then they go dark. When you are trying to say whether a noise peak landed before or after the moment a plane was closest, a few seconds of lag is the entire signal.
So the project grew a receiver. First an RTL-SDR dongle plugged into the computer, with a little antenna in the window, wrapped in a relay program that looks up each aircraft in the open aircraft database and serves the same JSON the aggregators do. The recorder cannot tell the difference except that the local one answers faster. Then two FlightAware PiAware boxes with proper antennas outside: one on 1090 MHz for everything, and one on 978 MHz for the light aircraft that only broadcast there.
The outdoor antenna taught me something about radio. On its first morning it saw fewer planes than the indoor dongle, and nothing beyond 18 miles. The receiver's amplifier sits before its filter, and strong signals on other frequencies were overloading it. Moving a bandpass filter in front of the amplifier changed everything.
| One hour, side by side | Indoor dongle | Outdoor antenna, no filter | Outdoor antenna, filtered |
|---|---|---|---|
| Aircraft with a position | 120 | 47 | 225 |
| Messages per second | 77 | 11 | 317 |
| Range, 90th percentile | 44 nm | 7 nm | 137 nm |
| First to see a shared aircraft | - | 1 of 42 | 97 of 98 |
The three local receivers and one aggregator form a chain. Each aircraft comes from the first source with a fresh position for it, and sources are never blended. If the outdoor box drops off the network, its planes move to the next receiver within seconds, and every record says which source reported which aircraft. The aggregator only fills in what no antenna heard.
How the pieces fit together. The rule that holds it up: only the recorder writes the event log. Everything else reads, so the viewer, the reports and the trainer can be restarted, crashed, or rebuilt without touching the record.
The physics showed up
Once the positions were good to the second, something I had been ignoring became impossible to ignore. The noise peak does not happen when the plane is closest. For jets on approach it comes a median of 8.9 seconds early, even after allowing for the time the sound takes to get down to the house. The spread is tight, which means it is not noise in the data. It is the airplane.
A jet on approach throws most of its noise forward, out of the fans. A jet climbing out throws it backward, out of the exhaust. There is a standard textbook model for a moving source whose power depends on the angle between its direction of travel and the line to the listener, with one exponent that says how strongly it beams. Fit that exponent to the data and arrivals come out around 6 or 7, departures around 1 or 2, and the model predicts when the peak will arrive to within a couple of seconds.
Before and after. Amber is the raw gap between the loudest moment and the closest moment; blue is what is left after subtracting the model's predicted shift. Landings collapse onto zero. Departures are messier, because they are farther away, climbing, and usually turning.
This is more than a tidy result. The sound split now weights each plane by which way it is pointing as well as how far away it is, so an approaching jet keeps its forward-lobe noise instead of the plane behind it taking the credit. And every record keeps the leftover, which doubles as a check. When the noise really was that plane, the leftover sits near zero.
Teaching it to be honest
A log that pins every sound on some plane is a log that lies with confidence. Most of the second month went into making the record admit what it does not know.
Every heard flyover now gets a verdict. The recorder looks at how much the geometry gave the fit to work with, how much of the peak the model explains, whether a near-identical track could have made the same sound, and whether the level moved faster than an airliner physically can. A door slamming moves 6 dB in a second. A 737 two miles away cannot.
Then I checked the verdicts by ear. I pulled 230 clips, with the hard cases over-sampled, and labeled each one blind: jet, prop, helicopter, nothing, or not sure. That afternoon of listening is the most useful thing in the project. It measures the labels the classifier trains on, the classifier itself, and the verdicts, and some of what it found was uncomfortable.
| Verdict | Share of passes | No aircraft audible in the clip |
|---|---|---|
| likely | 40% | 4% |
| far (the geometry gave the check nothing) | 47% | 44% |
| shared (a near-identical track took the peak) | 9% | 23% |
| unconfirmed (the level moved too fast) | 4% | 22% |
A "likely" verdict is right. A "far" verdict is a coin flip, and the reports treat it that way. The ADS-B labels themselves were revealing too: clips the feed called a jet had an audible jet in them 74% of the time, but clips it called a helicopter had an audible helicopter 4% of the time. Helicopters hover, sit on pads, and are two miles away more often than not. The trainer now leaves that class out.
The classifier itself is a small convolutional network, EfficientAT, fine-tuned on the clips with the recorder's own ambient recordings mixed in as noise. Against my ears it gets the four-way call right 70% of the time and plane-versus-nothing 77%. Against the ADS-B label it scores 64%, which is the number a normal evaluation would have reported. The gap is label noise, and only a person listening can see it.
Loud backgrounds get thrown out too. A chainsaw two doors down during a flyover gives that flyover a 72 dBA reading, and in the first week the top twenty readings included nine of those. The report now flags passes where the background was above 55 dBA, or where a plane read 15 dB over the usual for its type and distance while the classifier heard no such engine, and leaves them out of every loudness figure.
What else the mic hears
Every clip also runs through a general sound-recognition model, PANNs, which was trained on YouTube and knows 527 kinds of everyday sound. This started as a diagnostic and became my favorite part.
What the detector fires on when no plane is overhead. Street traffic, mostly. The low rumble is a 20 to 30 Hz hum that peaks between 1 and 4 AM. My working theory is a boiler flue somewhere nearby. The crows are real.
Two of the loudest things the mic hears turned out to be the house itself. The dryer is a comb of tones at 29, 33, 37 and 40 Hz, with the 37 Hz line wobbling at the speed of the drum. The water heater is a 325 Hz blower with a hiss on top, and it fires for a few minutes every half hour, all day. I fingerprinted both by switching them on and off while the recorder was running, and it now watches for them, stamps every record with what was running, and resets its idea of quiet when one of them kicks in so the change is not mistaken for a plane.
What the neighborhood sounds like
With all of that in place, the last three weeks are the data I trust. Here is a day.
A typical day. Landings level off at about thirty an hour from 9 AM to 5 PM and taper after six. Departures build later and keep going until midnight. The 11 PM column is almost all takeoffs.
The loudness story has two halves, and they do not point at the same planes. Sheer volume belongs to the daytime: the ten highest readings all fall between 10 AM and 3 PM, when the background is already at 41 dBA and a 737 at 58 is one more thing. Standing out belongs to the early morning. Between 2 and 4 AM the background sits at 34 dBA, and the first arrivals of the day come in over that.
Loud, and loud over the background. The gap between the typical flyover and the background is widest at 6 AM. That is the one you notice.
The ten passes that rose furthest over the background are all Sea-Tac arrivals between 12:49 and 6:37 AM, nine of them on just two nights. The biggest was that Korean Air 747-8, 44 dB over the background, which is the difference between a library and a vacuum cleaner. At night the typical flyover is 46.6 dBA against 51.2 by day, so the night ones are quieter in absolute terms. They just land on a quieter night.
By type, the ranking at the top of the post holds up in every slice I tried. Widebodies are the loud ones, in both directions, and four engines beat two: the A340 and the 747 each lead their class. Among the everyday fleet there is nothing to choose. The 737-900, 737-800, 737 MAX 9, A321neo and E175 all sit between 51.0 and 51.7 dBA at the median. By airline the same pattern shows through. Aer Lingus, Lufthansa, British Airways, Turkish and Korean sit 5 to 12 dB above Alaska, Delta and United, because of what they fly, not how they fly it.
A few things I don't trust yet
The single loudest readings, for one. The top five all fall on one Friday between 10:44 AM and 2:46 PM, at 73 to 75 dBA, and three of them carry a "far" or "unconfirmed" verdict. The backgrounds were 46 to 54 dBA, just under the cutoff. My guess is yard work nearby that the filter did not catch. I would not quote any of them.
The A340's margin is another. It leads by nearly 6 dB on fourteen passes, all of them one airline's one daily flight. Fourteen is enough to be real and not enough to be precise.
And three weeks is three weeks. The calibrated data starts on September 26. Winter weather, the days the airport flips to a north flow, and the holiday schedule will all move these numbers around. The ranking should hold. The decimals will not.
What I learned
Let the ground truth lead. The best decision in the project was flipping it around so that the flight data opens every record and the audio is just a measurement inside it. Everything honest about the system comes from that: the noise floor calibrated against an empty sky, the "unheard" passes that are data rather than misses, the clips labeled without anyone listening.
Your own sensors beat someone else's API. The dongle and the two FlightAware boxes are ordinary hobbyist kit. The difference between a position that is six seconds old and one that is one second old was the difference between seeing the physics and not.
Listen to your own data. An afternoon labeling 230 clips by ear found things no amount of modeling would have: that the helicopter labels were nearly worthless, that the classifier was better than its test score, and that the triage I was proud of was wrong every time it said "plane." Benchmarks you make yourself are cheap. Make one early.
The house is part of the data. I spent a week chasing a 37 Hz tone that turned out to be the dryer. Then another on a 325 Hz one that was the water heater. Whatever you are measuring, the first thing you will measure is your own house.
So: the loudest plane over Capitol Hill is Lufthansa's A340 from Frankfurt, the one you notice most is a 747 freighter at four in the morning, and the rest is 737s. I still look up when one goes over. Now I also check the log.
