Communications: linear ratios, modulation phase and channel scope#

Frequency/bandwidth are Hz, transmit/receive/noise power W, distance m and absolute noise temperature K. Gains, SNR and Eb/N0 inputs are linear ratios, not dB. db is 10*log10 of a positive power ratio; dbm uses 1 mW reference. Zero logarithm inputs are rejected; use explicit -infinity for an ideal zero power dB limit. Shannon capacity assumes AWGN and unrestricted ideal coding, not an achievable throughput guarantee. Hartley/Nyquist helpers assume an ideal bandlimited real baseband channel.

Modulation corrections#

BPSK/QPSK accept only binary data. Values are converted before arithmetic, preventing unsigned 0 from wrapping to 255. QPSK returns unit-energy symbols with real and imaginary signs determined by each bit pair; BER assumes coherent Gray-labelled QPSK/BPSK in AWGN.

FM phase is 2*pi*fc*t+2*pi*kf*integral(message dt), with modulation phase zero at the first supplied sample. Trapezoidal integration supports nonuniform time grids. The old rectangular cumsum introduced a one-sample phase offset. AM expects normalized message input; preventing overmodulation remains the caller’s responsibility. Neither model checks carrier Nyquist sampling.

import numpy as np
from engineeringkit.communications import fm_signal
t = np.linspace(0, .1, 101)
waveform = fm_signal(np.ones_like(t)*2, t, fc=10, kf=3)
# Analytic comparison: cos(2*pi*16*t).

Tests cover initial phase, constant/linear-message phase integration, linear/log link-budget consistency, distance-squared attenuation, cascade noise, AWGN BER and binary-symmetric-channel limits.

Reference: SciPy cumulative trapezoid.