Build a NOAA Weather Satellite Receiver with Raspberry Pi and RTL-SDR: APT Decoding and Image Generation
NOAA's polar-orbiting weather satellites — NOAA 15, 18, and 19 — have been transmitting analog APT (Automatic Picture Transmission) images on the 137 MHz band continuously for decades, and receiving them requires nothing more exotic than an RTL-SDR dongle, a purpose-built antenna, and a Raspberry Pi. This is a genuinely different signal and workflow from the ADS-B flight tracking and APRS projects already covered on this site — instead of decoding packetized digital data, you're demodulating an analog frequency-modulated signal into a scrolling image, line by line, as the satellite passes overhead.
How APT Reception Actually Works
Each NOAA satellite transmits two image channels simultaneously — a visible-light channel and an infrared channel — multiplexed into one 2400 Hz subcarrier, FM-modulated onto the 137 MHz carrier. The satellite scans one line of the image every 0.5 seconds as it orbits, so a full pass — roughly 10-15 minutes of visibility as the satellite crosses your horizon — builds up a complete strip image covering hundreds of miles of the Earth's surface below its ground track. The image resolution is modest by modern satellite standards (about 4km per pixel) but the entire pipeline, from raw RF to finished weather image, runs on hardware costing well under $100.
Why the Antenna Matters More Than the SDR
Unlike ADS-B (where a simple 1090 MHz vertical antenna is often good enough) or general SDR listening covered elsewhere on this site, APT reception is genuinely antenna-limited. NOAA satellites transmit with circular polarization, and their orientation relative to your ground station rotates continuously as they pass overhead. A simple dipole or vertical antenna — linearly polarized — will fade in and out badly as that polarization mismatch changes through the pass. The standard solution is a QFH (Quadrifilar Helix) antenna, purpose-built for circular polarization and tuned specifically to 137 MHz, and it makes a night-and-day difference in pass quality compared to any general-purpose antenna.
Build Steps
- Assemble and tune the QFH antenna. Most kits arrive as bent tubing or wire elements with published dimensions tuned to 137.5 MHz (the center of the NOAA APT band). Follow the kit's exact dimensions — this antenna's performance is sensitive to element length in a way that general-purpose antennas aren't.
- Mount the antenna with clear sky view. Since satellites pass overhead in all directions across multiple orbits per day, the QFH needs a genuinely unobstructed view of the sky, ideally on a mast above roofline, not just pointed at one part of the horizon. Attics and indoor placement will work for close, high-elevation passes but will miss weaker low-elevation passes entirely.
- Run low-loss coax to the Raspberry Pi. At 137 MHz, cheap RG-58 over a long run introduces real signal loss — RG-6 or better is worth the difference, especially on runs over 25 feet.
- Flash Raspberry Pi OS Lite (headless is fine — this station runs unattended) and update the system.
- Install the RTL-SDR drivers and blacklist the kernel's default DVB-T driver, which will otherwise claim the dongle before your SDR software can use it — this is the single most common first-boot failure with any RTL-SDR project.
- Install a scheduling and decoding pipeline. satdump (actively maintained, cross-platform) or the classic wxtoimg + predict combination both work; satdump is the more current recommendation since wxtoimg's original distribution has become harder to source reliably. Either way, you need two pieces working together: a pass predictor (using your station's lat/lon and current two-line element/TLE orbital data for NOAA 15/18/19) and the actual APT demodulator.
- Set up automatic pass scheduling with cron. Once TLE data is loaded, the predictor calculates exact rise/set times and maximum elevation for each upcoming pass; a cron job or satdump's built-in scheduler starts recording automatically a minute or two before each pass begins.
- Decode and generate imagery. After each pass, the raw IQ recording (or in satdump's case, the pipeline runs live) gets demodulated into the two image channels, which can then be combined into false-color composites — a common and satisfying post-processing step that maps the visible and infrared channels into a more intuitive color image showing clouds, land, and sea distinctly.
Realistic Expectations for Pass Quality
Max ElevationExpected Result Below 20°Often noisy or partial — low passes are more affected by horizon obstructions and ground-level RF noise 20°-45°Usable image, some noise near the edges of the pass Above 45°Clean, high-quality image with good signal-to-noise ratio throughoutYour first few passes are the best diagnostic tool you have — a consistently noisy image across all elevations points to antenna orientation or feedline loss, while noise that's only bad at low elevations is normal and expected.
TLE Data and Keeping Predictions Accurate
Two-line element sets describing each satellite's orbit are updated regularly (orbital decay and station-keeping maneuvers shift them slightly over time) and are freely available from Celestrak. Stale TLE data is the second most common cause of "the satellite never showed up" after antenna problems — build a weekly TLE refresh into your cron schedule so pass predictions don't slowly drift out of accuracy over months of otherwise-unattended operation.
Extending the Station
Once basic APT reception is reliable, the same RTL-SDR and Pi can be time-shared or dedicated to related work already covered elsewhere on this site — an ADS-B flight tracker on a separate dongle, or general SDR band scanning between satellite passes, since NOAA passes only occupy roughly 10-15 minutes several times a day rather than continuous airtime. Some builders add a second, smaller SDR specifically so weather satellite reception never gets interrupted by other listening. A completed station running unattended for weeks, quietly building an archive of daily weather imagery over your own region, is one of the more visually rewarding payoffs in amateur radio and SDR work — and unlike much of the RF content on this site, none of it requires a transmitting license, since APT reception is entirely passive.
Related Guides
- Build an ADS-B Flight Tracker with Raspberry Pi and RTL-SDR
- RF and Antenna Fundamentals for Makers: Dipoles, Ground Planes, SWR, and Feedline Loss
- Build an APRS iGate and Digipeater with Raspberry Pi and RTL-SDR
- How to Install Klipper on Any 3D Printer: Complete Setup Guide
- How to Set Up OpenCV Machine Vision on a Raspberry Pi
- Raspberry Pi: Complete Headless Setup Guide (No Monitor Needed)
- Raspberry Pi: Headless OS Setup
- How to Set Up a Raspberry Pi Headless with SSH and WiFi