πŸ“» Software Defined Radio

Een hands-on cursus β€” van radiogolven naar bits

Radio basics Β· SDR Β· Tools Β· Data-analyse Β· Demo's

Rein Velt Β· Hackerspace Drenthe

πŸ“– Liever lezen? Het volledige cursusboek β€” alle lessen met uitleg en verhaal

Gebruik β†’ voor de volgende slide, ↓ voor verdieping, Esc voor overzicht, S voor sprekersnotities

Cursusoverzicht πŸŽ“

  1. Radio basics β€” golven, spectrum, modulatie, dB ⏱ 25 min beginner
  2. Wat is SDR? β€” architectuur, IQ, Nyquist ⏱ 25 min beginnergevorderd
  3. Hardware β€” RTL-SDR, HackRF, antennes ⏱ 20 min
  4. Software & tools β€” FFT, waterfall, GNU Radio ⏱ 30 min
  5. Signalen decoderen β€” ADS-B, POCSAG, satellieten ⏱ 40 min
  6. Data-analyse β€” van IQ tot inzicht ⏱ 30 min gevorderd
  7. Wetgeving β€” wat mag (niet) in NL ⏱ 15 min
  8. Demo's & eindopdracht ⏱ 25 min

πŸ”¬ Elke les sluit af met een lab-opdracht Β· βœ‹-slides zijn zelftoetsen Β· lesnummers hierboven zijn klikbaar

Wat kun je na deze cursus? 🎯

  • 🧠 Begrijpen hoe radio werkt: golven, modulatie, spectrum, decibel
  • πŸ‘€ Herkennen van signalen in een waterfall β€” en op het gehoor
  • πŸ› οΈ Zelf ontvangen: van €35-dongle naar vliegtuigen, satellieten en sensoren
  • πŸ“Š Analyseren van radiodata met Python en dashboards
  • βš–οΈ Weten wat mag β€” en waar de grens ligt

Beginner? Focus op de groene onderwerpen. Gevorderd? De rode geven verdieping. Elke les eindigt met een πŸ”¬ lab en onderweg zijn er βœ‹ zelftoetsen.

Les 1

Radio Basics

⏱ 25 minπŸŽ’ alleen een browser

🎯 Na deze les: je begrijpt golven, spectrum, modulatie en dB β€” en je hebt je eerste signalen beluisterd via een WebSDR.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

Elektromagnetische golven

  • Radio = elektromagnetische straling, net als licht β€” alleen een veel lagere frequentie
  • Een golf heeft drie eigenschappen die je kunt variΓ«ren:
    • Amplitude β€” hoe sterk
    • Frequentie β€” hoe snel hij trilt (Hz)
    • Fase β€” waar in de cyclus hij zit
  • Golflengte Ξ» = c / f  β†’  100 MHz β‰ˆ 3 meter

Radio β‰ˆ geluid, maar dan sneller πŸ”Šβ†’πŸ“‘

Vrijwel alles wat je intuΓ―tief van geluid weet, vertaalt 1-op-1 naar radio:

Geluid πŸ”ŠRadio πŸ“‘
ToonhoogteFrequentie (Hz β†’ MHz/GHz)
VolumeAmplitude / signaalsterkte (dB)
Een orkest: alle instrumenten tegelijkHet spectrum: alle zenders tegelijk in de lucht
Je oor pikt één stem eruitJe ontvanger filtert één zender eruit
Equalizer-balkjesSpectrum- / waterfall-weergave
πŸ”‘ Onthoud: een SDR is een "microfoon voor radiogolven" + software die je oor nadoet. Dit beeld komt de hele presentatie terug.

Het radiospectrum

BandFrequentieVoorbeelden
LF/MF30 kHz – 3 MHzAM-omroep, tijdseinzenders (DCF77)
HF3 – 30 MHzKortegolf, zendamateurs, wereldwijd DX
VHF30 – 300 MHzFM-omroep, luchtvaart, DAB+, marifoon
UHF300 MHz – 3 GHzPMR, ADS-B (1090 MHz), GSM, WiFi, GPS
SHF3 – 30 GHzSatelliet, radar, 5G mmWave

πŸ’‘ Lagere frequentie = verder bereik & buigt om obstakels; hogere frequentie = meer bandbreedte, maar zichtlijn nodig.

Modulatie: informatie op een golf zetten

  • AM β€” amplitude varieert (omroep, luchtvaart)
  • FM β€” frequentie varieert (omroep, marifoon, PMR)
  • Digitaal β€” FSK/PSK/QAM: bits als frequentie-, fase- of amplitudesprongen

Decibel: de taal van radio

  • Signaalsterktes variΓ«ren enorm β†’ logaritmische schaal
  • +3 dB = Γ—2 vermogen, +10 dB = Γ—10 vermogen
  • dBm = dB t.o.v. 1 milliwatt
    • WiFi-router: ~+20 dBm (100 mW)
    • Ontvangen GPS-signaal: ~βˆ’130 dBm (0.0000000000001 mW!)
  • SNR (signaal-ruisverhouding): hoe ver je signaal boven de ruisvloer uitsteekt β€” dΓ‘t bepaalt of je kunt decoderen

πŸŽ›οΈ Speel: signaal vs. ruis

SNR 25 dB

Schuif de signaalsterkte omlaag en zie wanneer decoderen onmogelijk wordt. Elke modulatie heeft een eigen minimum-SNR β€” daarom hoor je FM nog prima waar digitale TV al lang is weggevallen.

βœ‹ Even checken #1

De NOAA-weersatelliet zendt op 137 MHz. Hoe lang is één golf β€” en hoe groot wordt je antenne?

  • Ξ» = c / f = 300 / 137 β‰ˆ 2,2 meter
  • Een Ξ»/4-antennepoot is dus β‰ˆ 55 cm β€” daarom is zo'n V-dipool best groot
  • En ADS-B op 1090 MHz? Ξ» β‰ˆ 27 cm β†’ antennetje van ~7 cm. Hogere frequentie = kleinere antenne
πŸ”‘ Vuistregel om te onthouden: Ξ» in meters β‰ˆ 300 / f in MHz

πŸ”¬ Lab 1 β€” Luisteren zonder hardware

Opdracht (Β±15 min): verken het kortegolfspectrum via de WebSDR van de Universiteit Twente β€” websdr.ewi.utwente.nl:8901 (gratis, in je browser).
  1. Tune naar 198 kHz (AM): BBC Radio 4 op de lange golf
  2. Zoek tussen 3.6–3.8 MHz een Nederlands amateurgesprek β€” zet de modus op LSB
  3. Vind rond 14.0–14.1 MHz een morse-signaal (modus CW)
  4. Kijk per signaal naar de waterfall: hoe fel = hoeveel SNR?

βœ… Klaar als je drie modulaties hebt gehoord: AM, SSB en CW β€” en het verschil kunt beschrijven.

Bonus: tune naar 4625 kHz… hoor jij The Buzzer? πŸ‘»

Les 2

Wat is Software Defined Radio?

⏱ 25 minπŸŽ’ browser (+ Python voor het lab)

🎯 Na deze les: je begrijpt het SDR-blokschema, IQ-sampling en Nyquist β€” en je kunt aliasing voorspellen.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

Klassieke radio

Elke functie = een eigen stuk hardware:

Filter
➜
Mixer
➜
IF-filter
➜
Demodulator
➜
Audio
  • Nieuw protocol of andere band? β†’ nieuwe hardware, soldeerbout erbij
  • EΓ©n apparaat = één functie

…en nu als SDR

Digitaliseer zo vroeg mogelijk β€” de rest wordt software:

Tuner /
versterker
➜
ADC
➜
πŸ’» SOFTWARE
filteren Β· demoduleren Β· decoderen Β· analyseren

EΓ©n apparaat β†’ duizend radio's. Nieuw protocol? Update de software, niet de soldeerbout.

Waarom is SDR zo'n gamechanger?

Vroeger

  • Scanner: €300+, vaste modi
  • Spectrumanalyzer: €10.000+
  • Per protocol nieuwe hardware

Nu

  • RTL-SDR dongle: ~€35
  • Volledig spectrum zichtbaar als waterfall
  • Gratis open-source software voor honderden protocollen
  • Opnemen en later (her)analyseren

SDR democratiseerde radio-onderzoek: hobbyisten doen nu dingen die vroeger alleen labs konden.

IQ-sampling gevorderd

  • De SDR mengt het antennesignaal naar laag-frequent en bemonstert twee kanalen: I (in-phase) en Q (quadrature, 90Β° verschoven)
  • Samen vormen ze een complex getal I + jQ per sample
  • Hiermee ken je amplitude Γ©n fase β†’ Γ©lke modulatie is in software te demoduleren
  • Negatieve frequenties worden onderscheidbaar β†’ bandbreedte = samplerate
πŸ”‘ Te veel wiskunde? Onthoud alleen dit: IQ-samples zijn de ruwe grondstof van SDR β€” waterfall, audio en decoders worden er allemaal uit berekend.

Digitale modulatie in het echt

Plot de IQ-samples op symboolmomenten β†’ constellatiediagram. Elke "wolk" = één symbool; hoe meer punten, hoe meer bits per symbool (en hoe gevoeliger voor ruis):

BPSK, QPSK en 16-QAM constellaties
  • WiFi/5G gebruiken adaptief t/m 1024-QAM β€” alleen bij hoge SNR
  • In GQRX/SDR++ of GNU Radio zie je deze plots live van echte signalen

πŸŽ›οΈ Draai aan de ruis

SNR 18 dB

QPSK live: elk puntje is een ontvangen symbool. Wordt een punt rood, dan belandde hij in het verkeerde kwadrant = bitfout. DΓ­t is waarom je modem terugschakelt bij slecht signaal.

Nyquist & samplerate gevorderd

  • Nyquist: om een signaal te reconstrueren moet je β‰₯ 2Γ— de hoogste frequentie samplen
  • Met complexe IQ-samples: bandbreedte = samplerate
    • RTL-SDR @ 2.4 MS/s β†’ 2.4 MHz spectrum in beeld
    • HackRF @ 20 MS/s β†’ 20 MHz spectrum
  • Te weinig samplerate β†’ aliasing: signalen "vouwen" terug en verschijnen op de verkeerde plek
  • Praktijk: 8-bit samples @ 2.4 MS/s = ~4.8 MB/s aan data. IQ-opnames worden snel groot!
πŸ”‘ Simpel onthouden: samplerate = hoeveel MHz spectrum je tegelijk ziet.

πŸŽ›οΈ Zie aliasing gebeuren

samplerate

Blauw = het echte signaal (10 cycli) Β· stippen = jouw samples Β· oranje = wat jouw SDR ervan reconstrueert. Zak onder 2Γ— de signaalfrequentie en er verschijnt een spook-signaal op de verkeerde frequentie.

βœ‹ Even checken #2

Je RTL-SDR staat afgestemd op 100 MHz met samplerate 2.4 MS/s.

  • Welk stuk spectrum zie je in je waterfall? 98.8 – 101.2 MHz (bandbreedte = samplerate)
  • Er zendt iets op 101.5 MHz. Zie je dat? Nee β€” valt buiten de band. Hertunen dus!
  • Een uur IQ opnemen kost ~17 GB (4.8 MB/s Γ— 3600 s) β€” daarom neem je kort en gericht op

πŸ”¬ Lab 2 β€” Voorspel het spook

Opdracht (Β±10 min): word aliasing-meester met de demo van zonet (2 slides terug).
  1. Zet de samplerate-slider op 18 β€” voorspel éérst op papier de spookfrequentie (f βˆ’ fs), check daarna
  2. Herhaal voor 16 en 24 samples. Wanneer klopt je formule, wanneer "vouwt" hij?
  3. Python-bonus: sample een 440 Hz-toon op 600 Hz en luister:
    import numpy as np, sounddevice as sd
    t = np.arange(0, 2, 1/600)                 # fs = 600 Hz
    sd.play(np.sin(2*np.pi*440*t), 600)        # hoor je 160 Hz?

βœ… Klaar als je de spookfrequentie 2Γ— goed voorspelt vΓ³Γ³r je de slider beweegt.

Les 3

Hardware

⏱ 20 minπŸŽ’ RTL-SDR dongle (~€35)

🎯 Na deze les: je kiest de juiste SDR en antenne β€” en je dongle werkt en ontvangt FM.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

RTL-SDR: de €35 wonderdongle

  • Ooit: DVB-T tv-stick. Hack (2012): chip levert ruwe IQ-samples!
  • RTL-SDR Blog V3/V4: de facto standaard
  • Bereik: 500 kHz – 1.7 GHz
  • Samplerate: tot 2.4 MS/s stabiel, 8-bit
  • Alleen ontvangen (RX)
  • V3+: TCXO (stabiele klok), bias-tee, direct sampling voor HF
RTL-SDR dongle

Foto: Joeceads, CC BY-SA 4.0, Wikimedia Commons

Wat kun je ermee?

  • FM/DAB+ Β· ADS-B vliegtuigen Β· weersatellieten
  • Pagers, sensors, meteoballonnen, marifoon
  • ISS en amateursatellieten

Koop bij voorkeur een origineel (rtl-sdr.com) β€” kloons hebben vaak drift en opwarmproblemen.

HackRF One: ook zenden gevorderd

  • Bereik: 1 MHz – 6 GHz
  • Tot 20 MS/s, 8-bit
  • Half-duplex TX Γ©n RX (~€300)
  • Open hardware (Great Scott Gadgets)
  • Portapack-addon: standalone gebruik
HackRF One

Foto: Gareth Halfacree, CC BY 2.0, Wikimedia Commons

Alternatieven

  • Airspy 12-bit Β· SDRplay 14-bit Β· PlutoSDR full-duplex Β· USRP pro
⚠️ Zenden zonder vergunning is in NL illegaal β€” ook heel kort, ook op laag vermogen. Gebruik een dummy load of kabel voor experimenten. Meer hierover bij wetgeving.

Antennes: de helft van je succes

  • Een slechte antenne met dure SDR < goede antenne met goedkope SDR
  • Vuistregel: antenne resoneert bij Ξ»/4 of Ξ»/2 van je doelfrequentie
TypeGoed voorOpmerking
Telescoop-dipoolAlles (breedband)Zit bij RTL-SDR kit
DisconeScannen 25 MHz–1.3 GHzBreedband, geen gain
Colineair / GPADS-B 1090 MHzVeel gain op één band
V-dipool / QFHWeersat. 137 MHzOmhoog gericht, circulair (QFH)
Longwire / mini-whipHF kortegolfLang draad buiten

Tips: buiten > binnen, hoog > laag, korte goede coax > lange slechte. LNA dicht bij de antenne helpt bij satellieten.

QFH antenne

QFH-antenne voor 137 MHz weersatellieten β€” Karsten Lehmann, CC BY-SA 4.0

πŸ”¬ Lab 3 β€” Dongle aan de praat

Opdracht (Β±20 min): krijg je RTL-SDR werkend en meet je eerste dB's.
  1. Installeer SDR++ Β· Windows: USB-driver via Zadig Β· Linux: sudo apt install rtl-sdr
  2. Test: rtl_test -t β€” geen "lost samples"? Dan ben je goed
  3. Tune naar je sterkste lokale FM-zender β€” geluid? πŸŽ‰
  4. Antenne-experiment: vergelijk de signaalsterkte midden in de kamer vs. bij het raam β€” hoeveel dB scheelt het?

βœ… Klaar als FM speelt Γ©n je het raam-effect in dB kunt benoemen (meestal 6–15 dB!).

Geen dongle? Doe het lab met een WebSDR en sla stap 1–2 over.

Les 4

Software & tools

⏱ 30 minπŸŽ’ RTL-SDR + SDR++ / GNU Radio

🎯 Na deze les: je leest een waterfall als een boek en bouwt je eerste GNU Radio flowgraph.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

Eerst even: wat doet een FFT?

  • De SDR levert alleen samples in de tijd β€” een eindeloze rij getallen
  • De FFT (Fast Fourier Transform) werkt als een prisma: hij splitst het signaal in de frequenties waaruit het bestaat
  • 1 FFT = 1 momentopname van het spectrum = 1 regel van de waterfall
  • Duizenden FFT's onder elkaar plakken = de waterfall die je zo ziet
toon 2 ← verschuif en zie de piek mee
πŸ”‘ Zelfde truc als je oor: van trillingen (tijd) naar tonen (frequentie). Links het signaal, rechts een echte DFT, live berekend.

Je eerste waterfall 🌊

  • SDR++ / SDRSharp / GQRX: dΓ© startpunten β€” tunen, luisteren, kijken
  • X-as = frequentie, Y-as = tijd, kleur = signaalsterkte (dB)
  • Je ziet signalen voordat je ze hoort: elke modulatie heeft een eigen "vingerafdruk"

β–² live gesimuleerde waterfall: smalle FM-draaggolf Β· breedband FM Β· pager-bursts Β· frequency hopper

Een echte 2.4 MHz opname

Waterfall van IQ-opname Gemiddeld spectrum

Gegenereerd uit IQ-samples met NumPy β€” exact dezelfde FFT-pipeline als SDR++ gebruikt.

Hoe klinkt het spectrum? 🎧

Elke modulatie heeft ook een eigen geluid β€” na een tijdje herken je ze op het gehoor (allemaal hier gesynthetiseerd met NumPy):

πŸ“‘ Morse (CW) β€” "CQ CQ DE PA0SDR K", 600 Hz
πŸ“Ÿ POCSAG pager-bursts β€” FSK, let op de preamble
πŸ›°οΈ NOAA APT β€” het "tik-tok" van een weersatelliet
πŸ“» FM afstemmen β€” ruis β†’ zender β†’ ruis

Meer echte voorbeelden: sigidwiki.com heeft opnames van honderden signaalsoorten.

πŸŽ›οΈ Draai zelf aan de knop

88.0 MHz

Sleep de schuif over de band: vind de morse-baken, de FM-muziekzender en de pager. Net naast de zender? Dan hoor je hem vervormd door de ruis β€” precies zoals in het echt.

Het tool-landschap

ToolPlatformWaarvoor
SDR++Win/Linux/MacModerne allround ontvanger, plugins
SDRSharp (SDR#)WindowsKlassieker, veel plugins
GQRXLinux/MacEenvoudige ontvanger op GNU Radio-basis
GNU RadioalleVisueel DSP-bouwpakket β€” zie volgende slides
SigDigger / inspectrumLinuxSignaalinspectie & reverse engineering
Universal Radio HackeralleProtocol reverse engineering (GUI)
rtl_433alle (CLI)200+ sensoren/weerstations decoderen
dump1090 / readsballe (CLI)ADS-B vliegtuigtracking
SatDumpalleWeersatellieten (NOAA, Meteor, GOES…)
multimon-ngalle (CLI)POCSAG, AFSK, DTMF, …

GNU Radio: DSP als blokkendoos

  • Open-source framework: bouw je radio als flowgraph van blokken
  • GNU Radio Companion (GRC): visuele editor β†’ genereert Python
  • Elk blok bewerkt een stroom samples: filter, mixer, demodulator, decoder…
RTL-SDRSource Β· 2.4 MS/s Low-pass filterdecimatie ↓10 WBFM demod240k β†’ 48k Resampler48 kHz Audio SinkπŸ”Š speakers ↑ een complete FM-radio in 5 blokken

GNU Radio in de praktijk gevorderd

  • GRC genereert Python β€” je kunt alles ook scripten:
from gnuradio import gr, blocks, analog, filter, audio
import osmosdr

class FMRadio(gr.top_block):
    def __init__(self, freq=100.7e6):
        gr.top_block.__init__(self)
        src = osmosdr.source()                     # RTL-SDR bron
        src.set_sample_rate(2.4e6)
        src.set_center_freq(freq)
        lpf = filter.fir_filter_ccf(10,            # decimatie 2.4M -> 240k
              filter.firdes.low_pass(1, 2.4e6, 100e3, 10e3))
        demod = analog.wfm_rcv(quad_rate=240e3, audio_decimation=5)
        snd = audio.sink(48000)
        self.connect(src, lpf, demod, snd)

FMRadio().run()
  • Eigen blokken schrijven in Python of C++ (performance)
  • Ook zonder hardware: File Source met opgenomen IQ-data

πŸ”¬ Lab 4 β€” Waterfall-safari + flowgraph

Opdracht (Β±25 min): leer signalen herkennen aan hun "vingerafdruk" β€” en bouw je eerste radio.
  1. Scan met SDR++ de band 430–440 MHz en screenshot 3 verschillende signaalvormen in de waterfall
  2. Zoek ze op bij sigidwiki.com β€” wat denk je dat het zijn?
  3. Bouw in GNU Radio Companion de 5-bloks FM-ontvanger van deze les na en laat hem spΓ©len

βœ… Klaar als je flowgraph geluid geeft Γ©n je 2 van de 3 signalen hebt geΓ―dentificeerd.

Vast? De flowgraph staat als Python-voorbeeld in de cursus-repo (zie slotslide).

Les 5

Signalen decoderen

⏱ 40 minπŸŽ’ RTL-SDR + rtl_433 / dump1090 / multimon-ng

🎯 Na deze les: je hebt minstens één Γ©cht digitaal signaal gedecodeerd β€” vliegtuig, sensor of pager.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

ADS-B: vliegtuigen volgen ✈️

  • Vliegtuigen zenden continu positie, hoogte, snelheid, callsign op 1090 MHz
  • Modulatie: PPM, 1 Mbit/s, ongecodeerd β€” vrij te ontvangen
  • Bereik: 200–400 km met dakantenne (zichtlijn!)
# decoder starten + webkaart
dump1090 --interactive
# of modern:
readsb --device-type rtlsdr \
       --net --write-json /run/readsb
  • Eigen FlightRadar bouwen: feed naar FR24 / ADSBexchange β†’ gratis premium-account
  • Data = JSON β†’ perfect voor eigen analyses (zie deel 6)
  • Verwant: ACARS (131.725 MHz), VDL2: berichten van/naar cockpit

Zo ziet jouw ontvangst eruit πŸ›©οΈ

Links: vliegtuigen die jouw antenne hoort (ring = 100/200 km). Rechts: de ruwe Mode-S berichten zoals dump1090 ze decodeert β€” elk vliegtuig zendt er ~2 per seconde.

POCSAG: pagers leven nog πŸ“Ÿ

  • Pager-protocol uit 1982, nog volop in gebruik (ziekenhuizen, brandweer)
  • In NL: P2000 op 169.65 MHz β€” alarmeringen van hulpdiensten (FLEX-protocol)
  • FSK, 512/1200/2400 baud β€” triviaal te decoderen:
# POCSAG decoderen met rtl_fm + multimon-ng
rtl_fm -f 169.65M -s 22050 | \
  multimon-ng -t raw -a POCSAG512 -a POCSAG1200 -a FLEX -

🎧 Zo klinkt een pager-burst:

⚠️ Ontvangen mag, maar berichten bevatten soms persoonsgegevens. Publiceren of delen daarvan kan strafbaar zijn (AVG + Telecommunicatiewet, afluisterverbod art. 161 Sr). Luisteren voor eigen studie: oké. Verspreiden: niet doen.

Weersatellieten: beelden uit de ruimte πŸ›°οΈ

  • NOAA 15/18/19 β€” 137 MHz, APT: analoog beeld, te decoderen met geluidskaart-niveau DSP
  • Meteor M2 β€” 137 MHz, LRPT: digitaal, hogere resolutie
  • Polaire baan: 2–4 passes per dag, Β±12 min zichtbaar

Workflow

  1. Pass voorspellen (gpredict, n2yo.com)
  2. V-dipool of QFH-antenne richting hemel
  3. Opnemen + decoderen met SatDump
  4. β†’ eigen satellietfoto van Europa!

πŸš€ Gevorderd: GOES/EUMETSAT geostationair met schotel + LNA, ISS SSTV-events, amateursatellieten (FM-repeaters in de ruimte).

Hoe werkt zo'n pass? πŸ›°οΈ

De satelliet vliegt in ~100 minuten rond de aarde; jij hoort hem alleen als hij boven jouw horizon komt (groene boog). De elevatiecurve rechts bepaalt je plan: hoe hoger de piek, hoe beter het beeld.

Echt ontvangen: NOAA 19 πŸ›°οΈ

Echte NOAA 19 APT-ontvangst

NOAA 19, 18 juni 2021, APT op 137.100 MHz β€” public domain (NOAA), via Wikimedia Commons

  • Links: zichtbaar licht, rechts: infrarood
  • De verticale streeppatronen = sync-pulsen, zo lijnt de decoder elke beeldlijn uit
  • Dit ontvang je al met een RTL-SDR + zelfgebouwde V-dipool van ~€5 aan draad

🎧 Zo klinkt APT tijdens een pass:

APT-formaat uitleg

rtl_433: het IoT om je heen

  • 433/868 MHz ISM-band: weerstations, deurbellen, TPMS (bandenspanning), afstandsbedieningen, energiemeters…
  • rtl_433 kent 250+ apparaatprotocollen out of the box:
rtl_433 -f 433.92M -F json | jq .
{
  "time": "2025-11-06 19:04:12",
  "model": "Nexus-TH",
  "id": 42,
  "temperature_C": 18.4,
  "humidity": 61
}
  • Output naar JSON/MQTT β†’ direct in Home Assistant of eigen database
  • Leuke oefening: welke apparaten in jouw huis zenden stiekem van alles uit?

πŸ“» Frequentie-safari NL

De mooiste plekken op de band om vanavond nog af te luisteren β€” gesorteerd van laag naar hoog:

100 kHz1 MHz 30 MHz300 MHz2 GHz DCF77 AM-DX Buzzer πŸ‘» amateurs HF luchtvaart NOAA Β· ISS marifoon Β· P2000 433/446/sondes ADS-B druk op ↓ voor het complete luistermenu per band

Kortegolf & lager longwire / mini-whip + direct sampling

FrequentieWatWaarom leuk
77.5 kHzDCF77 tijdseinDit signaal zet al je "atoomklokken" gelijk
518 kHzNAVTEXScheepvaartberichten als tekst te decoderen
526–1602 kHzAM-omroep's Avonds hoor je heel Europa (ionosfeer!)
3.6 / 7.1 / 14.2 MHzAmateurs 80/40/20 mNL-rondes 's avonds Β· overdag wereldwijde DX (SSB)
4625 kHzUVB-76 "The Buzzer" πŸ‘»Mysterieuze Russische zoemer, al 40+ jaar
5505 kHzShannon VOLMETLuchtvaartweer, doorlopend voorgelezen
11175 kHzUS HFGCSAf en toe cryptische militaire "EAM"-berichten
27.555 MHzCB / freebandBij goede condities half Europa te horen

πŸ’‘ RTL-SDR V3/V4: zet direct sampling (Q-branch) aan voor alles onder 24 MHz. Of luister via een WebSDR (websdr.ewi.utwente.nl!).

VHF de gouden band voor beginners

FrequentieWatWaarom leuk
87.5–108 MHzFM-omroepJe eerste succes β€” altijd raak
108–118 MHzVOR/ILS-bakensNavigatiebakens die hun naam in morse piepen
118–137 MHzLuchtvaart (AM!)Schiphol Tower 119.225 Β· nood 121.5 Β· ACARS 131.725
137.100 / 137.9125 MHzNOAA 19 / 18 Β· MeteorJe eigen weersatellietfoto
144.800 MHzAPRSPosities/telemetrie van zendamateurs, makkelijk te decoderen
145.500 / 145.800 MHz2m aanroep Β· ISS!Astronauten en SSTV-events vanaf het ruimtestation
156.800 MHzMarifoon kanaal 16Nood & aanroep scheepvaart Β· AIS op 161.975/162.025
169.650 MHzP2000Alarmeringen hulpdiensten (FLEX)

UHF en hoger kleine antennes, grote projecten

FrequentieWatWaarom leuk
402–406 MHzRadiosondes 🎈Weerballonnen (De Bilt, 2Γ—/dag) live volgen β€” en soms terugvinden! (radiosonde_auto_rx)
430–440 MHzAmateurs 70 cmRepeaters, 433.500 aanroep, satellieten op 435–438
433.92 / 868 MHzISM-sensorenrtl_433: het IoT om je heen
446.0–446.2 MHzPMR446Vergunningsvrije portofoons β€” bouwmarkt, evenementen
1090 MHzADS-BVliegtuigen tot 400 km ver
1691 MHzMeteosat HRITGeostationair: elk kwartier een volledige aardschijf (schotel + LNA)
πŸ”‘ Startvolgorde voor vanavond: FM β†’ luchtvaart β†’ P2000 β†’ 433 MHz. Daarna plan je je eerste NOAA-pass.

Onbekend signaal? Reverse engineering gevorderd

  1. Vind het signaal in de waterfall; noteer frequentie en bandbreedte
  2. Neem op als IQ-bestand (SDR++ record / rtl_sdr)
  3. Inspecteer in inspectrum/URH: modulatie? symboolrate? preamble?
  4. Demoduleer naar bits (URH doet FSK/ASK/PSK semi-automatisch)
  5. Analyseer bitpatronen: sync-words, lengtes, counters, checksums (CRC-reveng!)
  6. Decodeer: schrijf een parser, of check of rtl_433 het al kent

πŸ’‘ Veel 433 MHz-apparaten gebruiken simpele OOK + vaste codes β€” daarom zijn replay-attacks op oude autosleutels mogelijk (en daarom hebben moderne rolling codes).

βœ‹ Even checken #3 β€” jij bent de detective

In je waterfall op 433.92 MHz zie je elke ~30 seconden een korte, smalle burst. Wat is het β€” en hoe kom je erachter?

  • Korte periodieke bursts in de ISM-band β†’ vrijwel zeker een sensor (weerstation, deurbel, TPMS…)
  • Stap 1: rtl_433 -f 433.92M β€” grote kans dat één van de 250 decoders hem al kent
  • Stap 2 (niets?): IQ opnemen β†’ URH/inspectrum β†’ het reverse-engineering-stappenplan van net
πŸ”‘ Dit denkpatroon β€” kijken β†’ herkennen β†’ decoderen β†’ analyseren β€” is de kern van Γ‘lle SDR-projecten.

πŸ”¬ Lab 5 β€” Kies je missie

Opdracht (±30 min): decodeer één écht signaal. Kies de missie die bij je past:
  • ✈️ Missie A β€” vliegtuigen: dump1090 --interactive β†’ hoeveel vliegtuigen zie je, en wat is je verste ontvangst (km)?
  • 🌑️ Missie B β€” sensoren: rtl_433 β†’ identificeer 3 apparaten in je omgeving (van wie is dat weerstation?)
  • πŸ“Ÿ Missie C β€” pagers: rtl_fm -f 169.65M -s 22050 | multimon-ng -t raw -a FLEX - β†’ tel de alarmeringen in 10 minuten (alleen kijken, niet delen!)

βœ… Klaar als jouw missie echte, gedecodeerde data oplevert.

Bonus: plan op n2yo.com een NOAA-pass van β‰₯ 60Β° elevatie voor morgen β€” en zet je wekker. πŸ›°οΈ

Les 6

Data-analyse

⏱ 30 minπŸŽ’ Python + pandas

🎯 Na deze les: je zet decoderdata om in grafieken en inzichten β€” van ruwe JSON tot antennediagram.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

De SDR data-pipeline

πŸ“‘ IQ-opname.cf32 / .cs8 / SigMF πŸ”¬ DSPfilter Β· demod Β· FFT πŸ“‹ Decoderingbits β†’ berichten πŸ—„οΈ OpslagJSON Β· SQLite Β· MQTT πŸ“Š Analysepandas Β· Grafana
  • SigMF: standaard om IQ-opnames + metadata (freq, rate, tijd) te delen
  • Scheiding opname ↔ analyse: je kunt een signaal eindeloos opnieuw bekijken

IQ-data in Python gevorderd

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

fs = 2.4e6                      # samplerate
raw = np.fromfile("opname.cs8", dtype=np.int8)       # RTL-SDR: 8-bit
iq  = (raw[0::2] + 1j*raw[1::2]) / 127.5 - (1+1j)    # -> complex

# Spectrogram (waterfall)
f, t, Sxx = signal.spectrogram(iq, fs=fs, nperseg=4096,
                               return_onesided=False)
plt.pcolormesh(np.fft.fftshift(f), t,
               10*np.log10(np.fft.fftshift(Sxx, axes=1)).T)
plt.xlabel("Frequentie-offset (Hz)"); plt.ylabel("Tijd (s)")

# FM-demodulatie in 1 regel: fase-verschil tussen samples
audio = np.angle(iq[1:] * np.conj(iq[:-1]))

NumPy + SciPy = je eigen SDR-lab. Aanrader: PySDR (pysdr.org), gratis online boek.

Van IQ naar audio β€” in beeld

Die ene regel np.angle(iq[1:] * conj(iq[:-1])) doet dit:

FM demodulatie keten

Berichten-data analyseren

  • Decoders leveren gestructureerde data (JSON) β†’ klassieke data-analyse:
import pandas as pd

df = pd.read_json("adsb_log.jsonl", lines=True)

df["hour"] = df.time.dt.hour
df.groupby("hour").flight.nunique().plot(kind="bar")   # drukte per uur

# verste ontvangst per richting -> antennediagram van je eigen setup
df.groupby(df.bearing.round(-1)).distance_km.max().plot(kind="polar")
Leuke vragen voor ADS-B:
  • Hoe ver reikt mijn antenne, en waarom niet rond?
  • Effect van weer/seizoen op bereik?
Voor rtl_433-sensoren:
  • Temperatuurtrends van de buurt
  • Hoe vaak zendt elk apparaat? Batterijstatus?

…en dit komt eruit πŸ“Š

ADS-B bereik polar plot
rtl_433 sensorlog

Je antennebereik-plot verraadt precies welk gebouw in de weg staat β€” en de buurt-sensoren loggen 24/7 gratis mee.

Dashboards & langetermijn-monitoring

  • Raspberry Pi + RTL-SDR = 24/7 ontvangststation (< 5 W)
  • Pipeline: rtl_433 β†’ MQTT β†’ InfluxDB β†’ Grafana
  • ADS-B: readsb β†’ tar1090 (live kaart) + graphs1090 (statistieken)
  • Meedoen met gedistribueerde netwerken:
    • ADSBexchange / FR24 / airplanes.live (vliegtuigen)
    • SatNOGS β€” open netwerk van satellietgrondstations
    • WebSDR / KiwiSDR β€” jouw ontvanger online delen

Van hobby naar citizen science: jouw antenne wordt onderdeel van een wereldwijd meetnetwerk.

Discone antenne op dak

Breedband discone + weerstation op het dak β€” mr_t_77, CC BY-SA 2.0, Wikimedia Commons

Machine learning op RF gevorderd

  • Automatische modulatieherkenning: CNN's op IQ-data of spectrogrammen (RadioML-datasets)
  • RF fingerprinting: zenders herkennen aan minieme hardware-imperfecties
  • Anomaliedetectie: afwijkende signalen in het spectrum spotten (spectrum monitoring)
  • Spectrogram = plaatje β†’ alle computer vision-technieken zijn toepasbaar
  • Tooling: GNU Radio + PyTorch, torchsig, DeepSig datasets

Onderzoeksveld in opkomst β€” laagdrempelig om zelf mee te experimenteren omdat je je eigen trainingsdata kunt opnemen.

πŸ”¬ Lab 6 β€” Van JSON naar inzicht

Opdracht (Β±20 min): analyseer sensorlogs met pandas. Geen eigen data? De cursus-repo bevat een oefenset: assets/sample_rtl433.jsonl (24 uur, 3 sensoren).
import pandas as pd
df = pd.read_json("assets/sample_rtl433.jsonl", lines=True)

# 1. hoeveel berichten per sensor?
print(df.model.value_counts())

# 2. temperatuurverloop per sensor
df.pivot_table(index="time", columns="model",
               values="temperature_C").plot()

# 3. jouw beurt: wanneer was de koudste 5-minuten? welke sensor
#    hangt binnen? en wie heeft een zwakke batterij?

βœ… Klaar als je plot 3 lijnen toont en je vraag 3 kunt beantwoorden met code.

Les 7

Wetgeving in Nederland βš–οΈ

⏱ 15 minπŸŽ’ niets β€” wel je geweten

🎯 Na deze les: je weet wat mag, wat niet, en hoe je legaal gaat zenden (N-licentie).

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

Ontvangen: wat mag?

  • Luisteren is in principe vrij β€” een ontvanger hebben en gebruiken mag
  • MAAR (Telecommunicatiewet + Wetboek van Strafrecht):
    • Niet-openbare communicatie die je opvangt mag je niet delen of misbruiken
    • Afluisteren van bijv. telefonie is strafbaar
  • Praktisch: omroep, luchtvaart, amateurs, satellieten, ISM-sensoren, ADS-B β†’ prima
  • P2000/pagers: ontvangen gedoogd, inhoud met persoonsgegevens publiceren β†’ risico (AVG)

Zenden: alleen met vergunning of in vrije banden

  • Zenden zonder toestemming is verboden β€” handhaving door RDI (Rijksinspectie Digitale Infrastructuur), boetes kunnen fors zijn
  • Ook "even testen" met een HackRF op FM of GPS-frequenties: illegaal Γ©n gevaarlijk (interferentie met luchtvaart/hulpdiensten!)
  • Legaal zenden kan via:
    • Vergunningsvrije banden (ISM: 433/868 MHz, WiFi) β€” binnen vermogens- en duty-cycle-limieten, met conforme apparatuur
    • Amateurradio-licentie (N of F): examen bij RDI β†’ roepnaam β†’ experimenteren op amateurbanden is juist de bedoeling
πŸŽ“ De N-licentie is goed te doen en opent de deur naar legaal zenden, eigen zenders bouwen en satellietwerk. Zie veron.nl / vrza.nl voor cursussen.

Ethiek: with great power…

  • SDR geeft je toegang tot veel β€” gebruik het verantwoord:
  • βœ… Doen: eigen apparaten onderzoeken, open signalen decoderen, leren, publiceren over techniek
  • ❌ Niet doen: jammen, replay-attacks op andermans spullen, persoonsgegevens verspreiden, GPS spoofen
  • Responsible disclosure: zwakke plek in een product gevonden? Meld bij fabrikant / NCSC

πŸ”¬ Lab 7 β€” Mag dit? (casussen)

Opdracht (Β±10 min): oordeel zelf, daarna het antwoord. Bespreek met je buur waarom.
  • 1️⃣ Je leest met rtl_433 het weerstation van de buren uit. Mag β€” vrij ontvangbaar, geen persoonsgegevens. Netjes: vertel het ze, leuk gesprek!
  • 2️⃣ Je zet P2000-meldingen mΓ©t adressen op social media. Mag niet β€” persoonsgegevens verspreiden (AVG + Tw).
  • 3️⃣ Je test je HackRF "heel even" op 433.92 MHz met 1 mW. Mag niet β€” ISM vereist conforme apparatuur; gebruik een dummy load of kabel.
  • 4️⃣ Met je N-licentie roep je CQ op 145.500 MHz. Mag β€” daar is de licentie voor. Vergeet je roepnaam niet!

βœ… Klaar als je bij elke casus het wetsartikel-gevoel kunt uitleggen: ontvangen vrij Β· delen beperkt Β· zenden gereguleerd.

Les 8

Demo's & eindopdracht πŸŽ™οΈ

⏱ 25 min + 2 weken eindopdracht

🎯 Na deze les: je hebt een plan voor je eigen ontvangststation β€” de eindopdracht van deze cursus.

Basics Β· SDR Β· Hardware Β· Tools Β· Decoderen Β· Data Β· Wetgeving Β· Eindopdracht

Demoplan

  1. Waterfall-safari β€” SDR++ open, spectrum verkennen: FM, DAB+, 433 MHz (5 min)
  2. Vliegtuigen live β€” dump1090/tar1090-kaart met vliegtuigen boven ons (5 min)
  3. Sensoren sniffen β€” rtl_433 live: wat zendt er hier in de zaal? (5 min)
  4. P2000 meekijken β€” multimon-ng/PDW alarmeringen (3 min)
  5. GNU Radio β€” FM-ontvanger live bouwen in GRC (7 min)

Backup-plan: IQ-opnames van thuis meenemen β€” demo's werken dan ook zonder ontvangst in de zaal (File Source in plaats van RTL-SDR Source).

🏁 Eindopdracht β€” jouw eigen station

Capstone (2 weken): bouw een ontvangststation, verzamel β‰₯ 48 uur data en presenteer je resultaat (5 min) in de hackerspace.
  1. Kies je doel β€” ADS-B, weersatelliet, buurt-sensoren of iets geks (radiosondes!)
  2. Bouw/plaats je antenne β€” en documenteer je keuze met de Ξ»/4-regel
  3. Log minimaal 48 uur β€” JSON/SQLite, zoals in les 6
  4. Maak één grafiek + één verhaal β€” wat verraste je?
  5. Presenteer β€” 5 minuten, inclusief wat er mis ging (dat is het leerzaamst)

πŸ† Beoordeel jezelf: werkt het 48 uur stabiel? Kun je elke ontwerpkeuze uitleggen? Dan ben je officieel SDR-hobbyist.

πŸͺœ Jouw leerpad: 5 experimenten

  1. Dag 1 β€” FM-radio ontvangen in SDR++ (direct succes, leert tunen + waterfall lezen)
  2. Week 1 β€” vliegtuigen volgen met dump1090 (leert antennes + CLI-tools)
  3. Week 2 β€” rtl_433: sensoren in je straat ontdekken (leert ISM-band + JSON-data)
  4. Maand 1 β€” eigen weersatellietfoto: V-dipool + SatDump (leert passes plannen + antennebouw)
  5. Maand 2+ β€” GNU Radio flowgraph + IQ-analyse in Python (…en misschien je N-licentie?)
πŸ”‘ Elke stap bouwt op de vorige β€” precies zoals deze presentatie. Blijf je ergens hangen: r/RTLSDR en de VERON-afdelingen helpen graag.

Beginnen? Boodschappenlijst πŸ›’

NiveauSetupKosten
InstapRTL-SDR Blog V4 kit (incl. antennes) + SDR++~€45
Hobbyist+ Raspberry Pi, ADS-B antenne, V-dipool buiten~€150
Gevorderd+ Airspy/SDRplay, LNA's, filters, discone op dak~€400
Zendamateur+ N-licentie, HackRF/PlutoSDR, transceiver~€700+

Leren

  • pysdr.org β€” gratis boek: SDR + DSP met Python
  • rtl-sdr.com β€” blog met eindeloos veel projecten
  • sigidwiki.com β€” "wat is dit voor signaal?" encyclopedie
  • greatscottgadgets.com/sdr β€” gratis videocursus (Michael Ossmann)
  • r/RTLSDR, VERON/VRZA-afdelingen, hackerspaces

πŸ“‹ Spiekbrief β€” maak een foto! πŸ“Έ

Frequenties om te onthouden

87.5–108 MHzFM-omroep
118–137 MHzluchtvaart (AM!)
137 MHzNOAA / Meteor weersat.
144 / 430 MHzzendamateurs
169.65 MHzP2000 alarmeringen
433.92 / 868 MHzsensoren (ISM)
1090 MHzADS-B vliegtuigen

Welke tool wanneer?

  • luisteren/verkennen β†’ SDR++
  • vliegtuigen β†’ dump1090 Β· sensoren β†’ rtl_433
  • satellieten β†’ SatDump Β· pagers β†’ multimon-ng
  • onbekend signaal β†’ URH / inspectrum
  • zelf bouwen β†’ GNU Radio Β· leren β†’ pysdr.org

Formules

  • Ξ» (m) β‰ˆ 300 / f (MHz)
  • zichtbare bandbreedte = samplerate
  • +3 dB = Γ—2 vermogen, +10 dB = Γ—10

Vragen? πŸ™‹

πŸ“» Het spectrum ligt open β€” veel plezier met luisteren!

QR naar de presentatie

reinvelt.github.io/SDR-voor-beginners Β· πŸ“– cursusboek

Rein Velt Β· Hackerspace Drenthe