What my roof antenna actually hears: three months of ADS-B on the Portuguese coast

Station T-LPAR4 · online since 2026-05-04 · Raspberry Pi + FlightAware Pro Stick Plus + FlightAware 5.5 dBi (DPD 9 dBi pending) · dump1090-fa / tar1090 / graphs1090 · feeding Flightradar24, FlightAware, ADS-B Exchange.

· · 8 min read
What my roof antenna actually hears: three months of ADS-B on the Portuguese coast

Every airliner overhead is shouting its position into the void, unencrypted, about twice a second, and anyone with €30 of radio hardware can listen. I've been running a receiver on the coast near Torres Vedras since May. This post is about what those signals actually are, what the receive chain does to them, why my station's maximum range is a weather report rather than an antenna spec, and what the Flightradar24 numbers genuinely measure — because most feeder write-ups, including the first draft of this one, get that part wrong.

What is actually in the air

Transport aircraft carry a Mode S transponder. On top of the interrogation-reply traffic it exchanges with radar, the transponder spontaneously broadcasts 1090 MHz Extended Squitter messages — this is ADS-B: Automatic (nobody asks), Dependent (position comes from the aircraft's own GNSS, not from radar), Surveillance, Broadcast.

Each message is 112 bits, pulse-position modulated at 1 Mbps, so a complete transmission lasts 120 microseconds including the preamble. Inside: a 24-bit ICAO address unique to the airframe, a type code, and the payload — airborne position, velocity, callsign, altitude — protected by a 24-bit CRC. An aircraft in cruise emits position messages roughly twice a second, velocity about as often, identity every five seconds or so.

Nothing is encrypted and nothing is authenticated. That's not an oversight; the system is designed so that any aircraft or ground station can use any other aircraft's broadcasts for situational awareness. It's also why a hobbyist receiver is a first-class citizen: I'm decoding exactly the same bits an ATC ground station decodes.

Two consequences matter for everything below. First, one message is not one aircraft and not one position — the message stream is a mix of types, and the ratios between them show up directly in feeder statistics. Second, position isn't sent as raw latitude/longitude. It's Compact Position Reporting: coordinates compressed into 17 bits each by dividing the earth into zones, with alternating "even" and "odd" frame formats. A decoder needs one of each within about ten seconds to fix a position unambiguously. A single frame narrows the aircraft to one spot per zone — ambiguous globally, resolvable locally only once the decoder already has a reference. This is why a station can hear an aircraft long before it plots it, and why weak, fragmentary reception at the edge of range produces hits but few positions.

The receive chain, and why each part is there

My chain is deliberately short: antenna on the balcony, ~3m of coax, a FlightAware Pro Stick Plus, a Raspberry Pi on the porch.

The Pro Stick Plus is an RTL-SDR — a DVB-T tuner chip repurposed as a general receiver — with two additions that matter at 1090 MHz. An LNA in front of the tuner, and a SAW filter passing only a narrow band around 1090. The filter is the important one. The RTL chip digitizes with an 8-bit ADC, which gives you about 48 dB of usable dynamic range to fit the entire RF environment into. A broadcast FM transmitter or a GSM base station in the neighbourhood doesn't need to be on 1090 MHz to ruin reception — it just needs to be strong enough that the ADC spends its 8 bits representing the interferer, quantizing your microvolt aircraft signals into the noise. The filter throws the interferers away before the ADC ever sees them.

The same 8-bit budget is why gain tuning is a real step, not a formality. Max gain lets you decode weak frames from 300 nm out — and clips the message from the A320 passing overhead at FL100, whose signal is a million times stronger. Every clipped frame fails CRC and is discarded. The right setting is the one that maximizes decoded messages, not signal strength, and dump1090-fa will happily show you the percentage of strong messages so you can back the gain off until overhead traffic stops saturating.

Why no external LNA in front of all this: amplification helps only when cable loss between antenna and receiver is eating your signal-to-noise. Over 3 metres of decent coax it isn't, the dongle already has an LNA behind its filter, and a second unfiltered gain stage in front would amplify exactly the out-of-band garbage the SAW filter exists to remove — spending ADC range on it in the process. On a 30-metre mast run, different answer. Here, it's a downgrade sold as an upgrade.

Software: dump1090-fa does the actual work — detecting preambles in the sample stream, demodulating, CRC-checking (and single-bit error correction using the CRC), pairing CPR frames into positions. tar1090 is the map, graphs1090 the history, and the FR24 feeder ships the decoded stream out. The FR24 stats page lists my station's local IP as 172.19.0.4 with no MAC address — a Docker bridge subnet, because the feeder runs containerized and the stats page is telling you about the container, not the Pi.

Range is geometry first, weather second

1090 MHz is line-of-sight. The governing equation is the radio horizon: distance in nautical miles ≈ 1.23 × √height-in-feet, the 1.23 already accounting for standard atmospheric refraction bending the path slightly around the curve of the earth.

My antenna sits maybe 8 metres up — call it 26 feet — worth about 6 nm. The aircraft contributes the rest: at FL350, 1.23 × √35,000 ≈ 230 nm; at FL400, about 246. Add my 6 and the physics says this station should top out around 236–252 nm for aircraft at cruise, and far less for anything low.

Now look at the FR24 stats: maximum range 349 nm.

That's not the antenna being heroic. Reception meaningfully beyond the standard radio horizon happens through tropospheric ducting — temperature inversion layers, common over ocean and coast, that trap the signal and bend it along the surface far past the geometric limit. A coastal Atlantic site gets these conditions regularly. The 349 came from a handful of frames on the right evening. Maximum range is a weather statistic. It tells you what the atmosphere did once, not what the station does daily.

And there's a second, giveaway detail. The global ranking around my position reads: 349, 349, 349, 347, 349. My Portuguese neighbours: 349, 349, 349, 349, 349. Hundreds of stations do not independently converge on the same number. FR24 discards position reports beyond ~350 nm as implausible — a sanity filter against bad decodes and CPR ambiguity errors, which genuinely do produce aircraft teleporting across hemispheres. So every reasonably good station's "max range" pins at the cap, and the column is a checkbox, not a differentiator. Any comparison of feeders by maximum range is comparing who has hit the filter.

The number that describes the station is average range: 231 nm — sitting almost exactly on the ~236 nm ceiling the horizon math predicts for cruise traffic from this elevation. That's the satisfying result of the whole project: the station sees essentially to the physical horizon, and the remaining gap is geometry no hardware purchase can move.

The range histogram tells the same story from the other side. On a representative day: 2,030 position reports under 50 nm, 3,205 at 50–100, 2,016 at 100–150, 1,658 at 150–200, 626 beyond 200. The peak at 50–100 nm is where two curves cross — the area of each range ring grows with distance (more sky, more aircraft), while the minimum altitude an aircraft needs to clear my horizon also grows with distance (at 200 nm, only cruise traffic is visible at all; at 30 nm I can see an ATR climbing out). Beyond 200 the report count collapses not because aircraft thin out but because the geometry only admits the top of the altitude band — and each of those distant aircraft yields fewer decodable frames per minute anyway, weak fragmentary reception being exactly the CPR-pairing problem from earlier.

The polar plot: clean past 200 nm to the west, over open Atlantic, and sharply truncated to the east, where the terrain rises inland. A hill in the first Fresnel zone is a wall at this frequency. Gain does not fix it, height barely fixes it, and any purchase justified by "improving eastern coverage" is decoration.

On gain, one more piece of physics the antenna market obscures: a passive antenna creates gain only by reshaping the pattern. A 9 dBi collinear takes energy from high elevation angles and flattens the donut toward the horizon. That's the right trade for a low station chasing distant cruise traffic — but it means worse reception of aircraft overhead, and on a rolling deck or a windy mast a very flat pattern can literally wobble off the horizon. The DPD Productions 9 dBi I've specced (€157.95, with 16ft of RG8X at ~€40) is a considered pattern trade against my current 5.5 dBi, not "a better antenna." I expect it to move the position count in the 150–200+ bands and to move average range a little; it cannot move the horizon, and I've written this paragraph before installing it precisely so the before/after is on record.

What the FR24 numbers actually count

Feeder stats use three words that get conflated constantly, including by me in an earlier draft:

  • Hits — messages received and forwarded. All types: position, velocity, ident.
  • Positions — decoded position fixes, i.e. successfully paired CPR frames.
  • Aircraft seen — unique ICAO 24-bit addresses.

My stats snapshot, taken at 04:30 UTC — worth stating, because these counters are today so far, four and a half quiet overnight hours, not daily totals: 21,910 hits, 8,656 positions, 76 aircraft. The hits-to-positions ratio (~2.5:1) is roughly what the message mix predicts — position frames are only a fraction of the squitter stream, and edge-of-range aircraft contribute hits without positions.

The full-day aircraft counts over the last week: 940, 967, 887, 1,053, 967, 973 — a steady ~950 with the Saturday peak. Uptime since first coming online on 4 May: 100%, which says less about my engineering than about how little a Pi decoding a 1 Mbps bitstream is actually being asked to do.

Beyond raw ADS-B, a networked feeder does one more job: multilateration. Older aircraft and most military traffic carry Mode S without ADS-B Out — they transmit identity and altitude but never position. FR24 solves for their position by comparing the arrival timestamps of the same frame at four or more receivers, which means every feeder is also a node in a distributed passive radar. Your station contributes to tracks it could never produce alone.

Which is also the honest answer to "why does a network with tens of thousands of receivers want mine." Feeder coverage maps onto population; over the Atlantic it thins to nothing, and satellite ADS-B fills that gap at much lower update rates. A station on the Portuguese coast with an unobstructed western horizon is watching the approaches to the continent — traffic funnelling to and from the North Atlantic tracks, Madeira, the Azores, the Canaries — from one of the last patches of ground that can. The ranking (20th in Portugal, 732nd globally, score 10,797) rewards exactly that: FR24's score weighs coverage contribution, which is why a modest station in the right place outranks a better one in a saturated city. In exchange, all three networks I feed — FlightAware, FR24, ADS-B Exchange — comp their premium tiers, which on the first two is a genuinely good trade for a €250 build.

Three corrections to the standard advice

"More gain" is a pattern decision, not a volume knob — both at the antenna (elevation trade) and at the SDR (dynamic-range trade). The metric to optimize is decoded messages per second, visible right in graphs1090, and it is routinely maximized by reducing gain.

Judge a station by average range and message rate, never maximum range. The max is capped by the network, reached via ducting, and identical for everyone on your ranking page. Average range against your computed horizon tells you whether the install is done or whether there's SNR still on the table.

Height beats everything else you can buy, and terrain beats height. The 1.23√h relation is brutally sublinear — doubling antenna height on a low install buys a couple of nautical miles of horizon. The site is the decision; the hardware is details.