Beginner
From “what is a radio?” to decoding a simulated signal.
All lessons are free to read until 31 Jan 2027. No account, no sign-up.
What is a radio link
The parts of every radio link from bits to antenna and back, what the carrier frequency changes, why bandwidth matters, and a first working use of decibels
Complex baseband and IQ samples
Why radios represent signals as I and Q, how mixing moves a signal to and from the carrier, what sampling rate a complex signal needs, and what a negative frequency is
Decibels and link budgets
Decibel arithmetic in dB, dBm, dBW and dBi, the Friis transmission equation, free-space path loss checked against ITU-R P.525, and a link budget calculator in numpy
Noise, SNR and capacity
Where the −174 dBm/Hz thermal noise floor comes from, how noise figure and cascaded stages set receiver sensitivity, and what Shannon capacity says about bandwidth and power
Digital modulation and bit error rate
Map bits to BPSK, QPSK and 16-QAM symbols with Gray coding, detect them in noise, and measure bit error rate against Eb/N0 by Monte Carlo simulation compared with theory
Pulse shaping and matched filters
Why rectangular pulses waste spectrum, how raised-cosine and root-raised-cosine pulses avoid intersymbol interference, and why the receiver filter must match the transmit pulse
Fading channels
Multipath, Rayleigh and Rician fading, Doppler and coherence time, delay spread and coherence bandwidth, and how two-antenna diversity changes the BER curve, all simulated in numpy against theory
OFDM from scratch
Build a complete OFDM link in numpy, with IFFT modulation, a cyclic prefix, a multipath channel, pilot-based channel estimation and one-tap equalisation, and measure its bit error rate against theory
Your first GNU Radio flowgraph
Build a headless GNU Radio 3.10 flowgraph in Python that sends QPSK through root-raised-cosine filters and noise, demodulates it and counts bit errors, and see how it maps to GNU Radio Companion
Recording and reading IQ files
Raw IQ sample formats from cf32 to cu8, SigMF metadata, writing and reading a synthetic capture in numpy, finding a burst in its spectrogram, and recording from a real SDR with SoapySDR