A Monte Carlo simulator of a 19-cell hexagonal cellular network, built to study how frequency reuse and fractional power control affect uplink Signal-to-Interference Ratio (SIR) and, ultimately, user throughput.
Final project for a Wireless Communications course.
The simulator models a classic 19-cell / 3-sector hexagonal grid (57 sectors) and estimates SIR distributions by running thousands of random snapshots.
For each snapshot:
- One user is placed uniformly at random within each of the 57 sectors.
- A path loss + log-normal shadow fading channel model computes the link gain between users and base stations.
- Directional (120°) sector antennas are modeled with an ideal gain pattern.
- Co-channel interferers are looked up from a precomputed reuse-pattern table.
- Uplink SIR is computed as desired signal power over the summed co-channel interference, optionally with fractional power control applied.
src/ # Reusable simulator components
├── cellular_layout.py # Hexagonal grid geometry, BS placement, user placement
├── channel_model.py # Path loss + log-normal shadow fading
├── frequency_reuse.py # Reuse-pattern assignment (K=1/3/9) and co-channel tables
├── sir_calculator.py # Directional antenna gain, power control, uplink SIR
└── statistics_display.py # Aggregate statistics and CDF plotting
experiments/ # One script per exercise
├── ex1_sir_by_reuse.py # SIR vs. reuse factor
├── ex2_fractional_power_control.py # Optimizing the FPC exponent
├── ex3_pathloss_sensitivity.py # Does optimal FPC depend on the environment?
└── ex4_throughput.py # SIR -> spectral efficiency -> throughput
pip install -r requirements.txt
python experiments/ex1_sir_by_reuse.pyEach experiment is standalone. Note that Ex2 and Ex3 run 50,000 snapshots per beta value (Ex3 across three propagation environments as well), so they take considerably longer than Ex1 and Ex4.
| Parameter | Value | Description |
|---|---|---|
| Path loss exponent (v) | 3.8 (3.0 / 4.5 in Ex3) | Typical for urban/suburban |
| Shadow fading std dev | 8 dB | Log-normal shadowing |
| Sector beamwidth | 120° | Ideal (rectangular) antenna pattern |
| Cells | 19 | 1 center + 6 inner ring + 12 outer ring |
| Sectors per cell | 3 | 57 sectors total |
| System bandwidth | 100 MHz | Split by reuse factor in Ex4 |
| SNR gap | 4 dB | Implementation gap from Shannon capacity |
| K | 3rd %ile | 20th %ile | Median | 80th %ile |
|---|---|---|---|---|
| 1 | -17.52 dB | -6.46 dB | 2.46 dB | 12.51 dB |
| 3 | -7.91 dB | 3.28 dB | 12.60 dB | 23.02 dB |
| 9 | 2.98 dB | 14.15 dB | 24.21 dB | 35.34 dB |
Looser reuse buys a dramatically better SIR distribution — roughly 10 dB per step — at the cost of spectral efficiency.
The optimal FPC exponent is beta = 0.525, achieving 96.58% of users at SIR >= -5 dB. Partial path loss compensation beats both extremes: too little and cell-edge users are starved, too much and they drown their neighbours in interference.
Re-optimizing beta independently for v = 3.0, 3.8, and 4.5 shows how the optimal power control setting shifts with the propagation environment. Run the script to reproduce the overlaid CDFs.
| K | Mean throughput | 97%-likely throughput |
|---|---|---|
| 1 | 175.77 Mbit/s | 1.03 Mbit/s |
| 3 | 127.08 Mbit/s | 3.02 Mbit/s |
| 9 | 80.01 Mbit/s | 8.96 Mbit/s |
This inverts the Ex1 story. K=1 wins on mean throughput because every sector gets the full 100 MHz — but its 97%-likely throughput collapses to about 1 Mbit/s, meaning the worst-served users get almost nothing. K=9 sacrifices more than half the mean to give those same users nearly 9x better service. The "best" reuse factor therefore depends entirely on whether the operator is optimizing for average capacity or for cell-edge fairness.
(Values vary run to run due to random Monte Carlo sampling.)