Neural network-based channel estimation for OFDM systems, benchmarked against LS and MMSE baselines under 3GPP TDL channel models.
Course: ELEN E6771 — 5G & NextG Programmable Networks, Columbia University
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtpython scripts/run_training.py [--channel TDL-A] [--epochs 100] [--seed 42]Generates 50k training pairs, trains the FC network, and saves:
results/checkpoints/best_model.ptresults/figures/training_curves.png
python scripts/run_evaluation.py [--checkpoint results/checkpoints/best_model.pt] [--channel TDL-A]Evaluates LS, MMSE, and NN estimators across SNR range and saves all figures to results/figures/.
python -m pytest tests/ -v| Parameter | Value |
|---|---|
| FFT size | 64 subcarriers |
| Pilots | 8 (comb pattern) |
| Guard bands | 4 each side |
| Cyclic prefix | 16 samples |
| Modulation | QPSK |
| Channel model | TDL-A (3GPP TR 38.901) |
| Delay spread | 30 ns RMS |
| Doppler | 10 Hz |
| Sampling rate | 15.36 MHz |
| File | Description |
|---|---|
nmse_vs_snr.png |
NMSE (dB) vs SNR for LS, MMSE, NN |
ber_vs_snr.png |
BER vs SNR with perfect CSI bound |
training_curves.png |
Train/val MSE loss per epoch |
channel_realization.png |
|
nmse_vs_snr_tdl_comparison.png |
NN NMSE across TDL-A/B/C |
Input: [Re(H_pilots), Im(H_pilots)] → (batch, 16)
FC(16→256) → LayerNorm → ReLU → Dropout(0.1)
FC(256→512) → LayerNorm → ReLU → Dropout(0.1)
FC(512→512) → LayerNorm → ReLU → Dropout(0.1)
FC(512→256) → LayerNorm → ReLU → Dropout(0.1)
FC(256→128) → (batch, 128) = [Re(H_full), Im(H_full)]
565,888 parameters. He initialization, Adam optimizer, ReduceLROnPlateau scheduler.
| SNR (dB) | LS NMSE (dB) | MMSE NMSE (dB) | NN NMSE (dB) |
|---|---|---|---|
| -5 | -3 | -8 | -7 |
| 5 | -10 | -17 | -16 |
| 15 | -20 | -27 | -26 |
| 25 | -30 | -35 | -34 |
NN tracks MMSE closely without requiring explicit channel statistics.