Chapter Summary

Chapter Summary

Key Points

  • 1.

    Build constellations systematically. Use qam_constellation(M) for rectangular QAM and psk_constellation(M) for constant-envelope PSK. Always normalize to unit energy (Es=1E_s = 1) for consistent SNR calculations. Gray coding ensures PbPs/log2MP_b \approx P_s / \log_2 M at moderate SNR.

  • 2.

    Simulate BER with statistical rigor. Run until at least 100 errors per SNR point. Report Clopper-Pearson confidence intervals. Always validate against a known theoretical result (BPSK AWGN: Pb=Q(2Eb/N0)P_b = Q(\sqrt{2E_b/N_0})) before simulating complex systems.

  • 3.

    The matched filter is optimal for AWGN. The matched filter h(t)=s(Tt)h(t) = s^*(T-t) maximizes output SNR to 2Es/N02E_s/N_0 by the Cauchy-Schwarz inequality. It is equivalent to a correlator receiver and forms a sufficient statistic for ML detection.

  • 4.

    Higher-order modulation trades SNR for throughput. Going from QPSK to 16-QAM doubles the bits per symbol but costs about 3.8 dB in required Eb/N0E_b/N_0. Adaptive modulation selects the best trade-off based on current channel quality.

  • 5.

    Vectorize everything in NumPy. Process all symbols in parallel using broadcasting: np.abs(rx[:, None] - const[None, :]) computes all distances at once. This gives 100-1000x speedup over Python loops and is essential for large-scale BER simulations.

Looking Ahead

Chapter 21 introduces channel impairments beyond AWGN: path loss, shadowing, and multipath fading. The modulation and detection tools from this chapter become the inner loop of fading channel simulations.