---
title: 'Channel Planning and Coverage'
source: 'https://academia.sh/en/courses/wireless-and-security/channel-planning-and-coverage'
course: 'Wireless Networks and Network Security'
language: en
updated: '2026-08-17T18:07:22+00:00'
license: 'CC BY-SA 4.0'
---

# Channel Planning and Coverage

At signal budget 58, 52, 46, and 40 the associated clients are 31, 23, 17, and 13; false admit is 5, 0, 0, 0 and false deny is 1, 4, 10, 14 — the configuration that zeroes out the leak leaves ten clients inside the cell out.

The previous lesson took the access points' budgets from the fiction and never asked why those
values were what they were. The measurement showed that three separate budgets gave the same
client three separate answers: for 14 of the forty clients the association decision, and for 29
the rate tier, changed depending on which point it happened to land on.

So what should that budget have been? A wireless network's design is exactly this question, and
it has two parts: which channel, which signal budget goes to each point. What this lesson
measures is what changing the budget alone does to both directions at once. The result is the
course's most counterintuitive table: the configuration that zeroes out the leak is the
configuration that breaks the design's promise the most.

## Cell, Overlap, and Reuse

The area an access point covers is called a **cell**. When cells tile an area, two constraints
operate at once, and they pull in opposite directions.

The first constraint is **overlap**. If cells never overlap, gaps remain between them where the
client hears no point at all; the client loses its bond while walking and has to re-establish it.
For this reason neighboring cells' edges are deliberately overlapped.

The second constraint is **reuse distance**. Two overlapping cells on the same channel are
interference to each other. Because the number of channels is limited, the same channel is
reused sooner or later; the plan tries to make sure that repetition happens far enough away.

```text
# taught channel reuse pattern , fictional and not executed

band N, non-overlapping channel set: 1, 4, 7   (three channels)

  top floor      [1] [4] [7] [1]
  middle floor   [7] [1] [4] [7]
  bottom floor   [4] [7] [1] [4]

  the same channel sits three cells away from its nearest neighbor
  horizontal overlap : ~20% of the cell radius
  vertical leakage   : if inter-floor attenuation is low, the floor above also produces interference

band W, non-overlapping channel set: 24 channels
  the same channel never repeats within the pattern -> interference from within the plan ~0
  cost: range is short, the same area needs more points
```

The pattern is three-dimensional, and this is often overlooked. Two well-separated channels on
the same floor can be identical to the channel used by the neighbor on the floor above; if
inter-floor attenuation is low, vertical interference can exceed horizontal interference. The
numbers above are **fictional**; real bands' channel counts and which ranges are usable vary
from country to country and are updated by regulatory decisions. Nothing this lesson measures
depends on those numbers.

## What a Site Survey Measures

The plan is made at a desk; its verification happens on site. A **site survey** walks point to
point through the building and records, at every location, which point is heard at which signal
strength. Its output is a coverage map.

What the map says and what it does not say must be kept separate. The map gives the association
boundary well: where no point is heard above the threshold. It gives the rate tier only for the
instant it measured; interference changes through the day, neighboring networks turn on and off,
human bodies cut the signal path. And the map does not know intent at all — where the design
promised full rate is not written on the map, it is written in the plan.

This lesson does not run a site survey. We know the fictional forty clients' real distance and
real interference; that is the oracle. What is measured is, for how many clients the given
budget departs from this known truth.

For a survey to make the two directions countable, it has to record three things at once: where
the measurement point is, the signal strength measured at that point, and which cell the plan
counts that point inside. If the third is not written down, false admit cannot be separated from
false deny — all that is left is a power map, and the map cannot say which measurement is
outside intent. When the measurement record and the plan record live in separate files, this
separation is in practice most often not made.

The measurement's assumptions:

- **WN14.** Forty clients; distance and interference come from the first lesson's fiction. There
  are 27 clients inside the cell, 13 outside.
- **WN15.** Intent does not change: the client inside the 30 m radius cell should have been
  admitted. The budget sweep changes only the mechanism, not the intent.
- **WN16.** The swept budgets are 58, 52, 46, and 40. The 6-unit step between them is fictional
  and is on the same order of magnitude as the spacing between tier thresholds.
- **WN17.** A single access point is measured. The contribution from neighboring points is
  folded into the interference field; it is not modeled as a separate point.
- **WN18.** The channel plan is modeled as a mechanism that puts a **ceiling** on interference.
  The better the plan, the lower the ceiling; ceiling 12 corresponds to the unplanned state,
  ceiling 0 to no interference at all.
- **WN19.** In the interference-ceiling measurement the budget is held fixed at 52. **One thing
  changes at a time:** either the budget or the ceiling.
- **WN20.** The full rate column is the number of clients at tier 6; the associated column is
  the number whose tier is greater than zero.
- **WN21.** The set is forty clients; the smallest measurable difference is **1/40 = 0.025**.

## Measurement

```python
"""Cell design: budget sweep and the channel plan's interference ceiling."""
SEED = 20260811
RADIUS = 30
TIERS = ((34, 6), (28, 4), (22, 2), (18, 1))


def generator(seed):
    d = seed % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def clients(count=40, seed=SEED):
    r, pool = generator(seed), []
    for i in range(count):
        pool.append({"no": i + 1, "distance": 5 + r(41), "interference": r(13)})
    return pool


def signal(c, power=52, ceiling=12):
    """The channel plan puts a ceiling on interference; the better the plan, the lower the ceiling."""
    return power - c["distance"] - min(c["interference"], ceiling)


def rate_tier(c, power=52, ceiling=12):
    for threshold, tier in TIERS:
        if signal(c, power, ceiling) >= threshold:
            return tier
    return 0


def cell_intent(c, radius=RADIUS):
    return c["distance"] <= radius


def medium(c, power=52, ceiling=12):
    return rate_tier(c, power, ceiling) > 0


def gap(events, intent, mechanism):
    d = {"correct_admit": 0, "correct_deny": 0, "false_admit": 0, "false_deny": 0}
    for e in events:
        n, m = intent(e), mechanism(e)
        if n and m:
            d["correct_admit"] += 1
        elif not n and not m:
            d["correct_deny"] += 1
        elif m:
            d["false_admit"] += 1
        else:
            d["false_deny"] += 1
    return d


pool = clients()
print(f"clients {len(pool)} | inside cell {sum(1 for c in pool if cell_intent(c))} "
      f"| outside cell {sum(1 for c in pool if not cell_intent(c))}")
print()

print(f"{'power':>5s} {'associated':>10s} {'full rate':>9s} {'false admit':>12s} "
      f"{'false deny':>12s} {'total deviation':>15s}")
for power in (58, 52, 46, 40):
    d = gap(pool, cell_intent, lambda c, p=power: medium(c, p))
    print(f"{power:5d} {d['correct_admit'] + d['false_admit']:10d} "
          f"{sum(1 for c in pool if rate_tier(c, power) == 6):9d} {d['false_admit']:12d} "
          f"{d['false_deny']:12d} {d['false_admit'] + d['false_deny']:15d}")
print()

print(f"{'interference ceiling':>21s} {'associated':>10s} {'full rate':>9s} "
      f"{'false admit':>12s} {'false deny':>12s}")
for ceiling in (12, 8, 4, 0):
    d = gap(pool, cell_intent, lambda c, t=ceiling: medium(c, 52, t))
    print(f"{ceiling:21d} {d['correct_admit'] + d['false_admit']:10d} "
          f"{sum(1 for c in pool if rate_tier(c, 52, ceiling) == 6):9d} "
          f"{d['false_admit']:12d} {d['false_deny']:12d}")
print()

print("clients left outside at power 46 despite being inside the cell (no, distance, interference):")
print([(c["no"], c["distance"], c["interference"]) for c in pool
       if cell_intent(c) and not medium(c, 46)])
print()
print("clients outside the cell leaking in at power 58 (no, distance, interference):")
print([(c["no"], c["distance"], c["interference"]) for c in pool
       if not cell_intent(c) and medium(c, 58)])
```

```
clients 40 | inside cell 27 | outside cell 13

power associated full rate  false admit   false deny total deviation
   58         31        13            5            1               6
   52         23         9            0            4               4
   46         17         2            0           10              10
   40         13         0            0           14              14

 interference ceiling associated full rate  false admit   false deny
                   12         23         9            0            4
                    8         24         9            0            3
                    4         27         9            0            0
                    0         32        13            5            0

clients left outside at power 46 despite being inside the cell (no, distance, interference):
[(4, 24, 11), (8, 20, 9), (10, 29, 0), (12, 30, 6), (13, 29, 2), (20, 25, 5), (25, 30, 12), (27, 20, 10), (32, 30, 7), (34, 23, 11)]

clients outside the cell leaking in at power 58 (no, distance, interference):
[(6, 37, 3), (14, 32, 7), (16, 33, 5), (28, 33, 2), (31, 35, 0)]
```

## Growing Does Not Bring You Closer to Intent

The top table lowers the budget from 58 to 40 and shows four numbers at once.

At budget 58 the associated clients are 31 — eight more than the 23 at 52. The coverage gain is
real. But 5 of the eight gained are outside the cell: the last table shows their distances
between 32 and 37 m, all in territory the design never promised. The shortfall inside the cell
drops only from 4 to 1. So a third of the eight-client gain went to intent, two-thirds leaked
outside.

**The rule is: growing the apparatus does not bring it closer to intent.** Raising the budget
grows the cell's boundary in every direction at once, and it cannot choose where that growth
goes. The coverage gained is paid for with coverage that leaks.

The total deviation column collects this into a single number: **6, 4, 10, 14**. The lowest
value is at 52. Neither the highest budget nor the lowest is closest to intent; the one closest
to intent is the budget that matches the radius the promise was made for. A budget is not right
or wrong as "more" or "less" — it is right or wrong **relative to the radius**.

## What Zero Leakage Hides

The bottom three rows pay the course's third claim. At budget 46 false admit is 0, at 40 it is
again 0. An audit that reports only this column finds both configurations flawless — it even
finds 52 flawless, because there is no leak there either. Three configurations look identical.

The other column separates the three. False deny is 4 at 52, 10 at 46, 14 at 40. At power 46,
ten clients inside the cell cannot associate at all; at 40, fourteen. Given that there are 27
clients inside the cell, at budget 40 more than half of those inside are left out. The design's
promise is not kept, and the leakage column never shows it.

The list of the ten clients left outside says a second thing. Their distances range from 20 to
30 m — some of them stand right at the cell's center. Clients 8 and 27 sit at 20 m and still
cannot associate; both have high interference. **Cutting the budget hits the client with
interference first**, because the two are added together in the same calculation.

The practical rule that follows: a wireless network's report cannot be given as a single number.
"No leakage" and "full coverage" are separate claims, and one does not support the other.

## For Coverage, or For Capacity

Reading the 46 and 40 rows in the table as "the wrong budget" would be incomplete. What makes
them fall short is not the budget itself but that the fiction carries a **single** access point
(WN17). Tiling the same area with more, smaller cells turns the low budget into the right
budget.

Two design goals separate here. **Design for coverage** tries to leave no gaps with the fewest
possible points: cells are large, budgets are high, the same channel is reused more often.
**Design for capacity** does the opposite: cells are shrunk, budgets are cut, the number of
points is increased. A small cell carries fewer clients and the queue waiting for the medium
gets shorter; also, because every client is closer to its point, its **tier rises**.

The measurement's fourth column shows why this second goal exists. At budget 52, only 9 of the
27 clients inside the cell are at full rate. Raising the budget does not fix this — at 58, full
rate is 13, but 5 leaks come with it. The way to actually raise full rate is to bring the client
closer to the point, that is, to build more cells.

**Channel width** is the second face of the same trade-off. Bonding four channels into one wide
channel raises the top speed a client can get, but it divides the number of non-overlapping
channels by four and shortens the reuse distance. In a dense area, a wide channel takes back the
speed it gained as interference; in a sparse area, the gain holds. Channel width is therefore
not a performance setting but a **plan decision**.

## What the Channel Plan Contributes

The bottom table fixes the budget at 52 and changes only the interference ceiling — that is, it
improves only the channel plan.

In the unplanned state (ceiling 12) associated is 23, false deny is 4. As the ceiling drops to 8
the shortfall drops to 3, and to 4 it drops to 0: associated becomes 27, exactly the number of
clients inside the cell. **False admit is also 0.** The channel plan met intent exactly, without
touching the budget at all.

The last row is the unexpected one. When interference is removed entirely (ceiling 0), associated
jumps to 32 and false admit shoots from 0 to 5. The cell grows larger than the design drew it.
The reason is clear: what draws the boundary is not the budget alone but **budget minus
interference**. The radius that matched intent had been tuned assuming a certain interference
level; once interference is gone, the same budget reaches farther.

This changes how channel planning has to be read. Reducing interference is not, on its own, an
improvement; it is a **second dial** that has to be tuned together with the budget. Improving
the plan and leaving the budget as it is can turn a configuration that does not leak into one
that does.

The full rate column, meanwhile, holds steady across every row. Even at ceiling 4, where intent
is met exactly, the number of clients running at full rate is 9 — a third of the 27 inside the
cell. Association being flawless in both directions does not mean working is flawless.

The measurability of the differences in this table also has to be checked. False deny dropping
from 4 to 0 is a **0.100** share of the forty-client set, four times the smallest measurable
difference (WN21, **0.025**). False admit rising from 0 to 5 is **0.125**. Both sit comfortably
inside the band. But the shortfall dropping from 4 to 3 as the ceiling drops from 12 to 8 is a
single client and sits right at the boundary; a trend can be read from that step, not a
conclusion.

## Summary

- Cell design carries two opposing constraints: leaving no gaps requires overlap, and not
  producing interference requires a reuse distance for the same channel.
- At budget 58, 52, 46, and 40, associated is **31, 23, 17, 13**; false admit is **5, 0, 0, 0**;
  false deny is **1, 4, 10, 14**. Total deviation, **6, 4, 10, 14**, is lowest at 52.
- Growing the budget sends two-thirds of the gain outside the cell; growing the apparatus does
  not bring it closer to intent.
- Three configurations that zero out the leak look identical in one column; in the other their
  shortfalls are **4**, **10**, and **14**. Counting one direction hides the other.
- When the interference ceiling drops to 4, intent is met exactly (0 false admit, 0 false deny);
  when the ceiling drops to 0, the cell grows and 5 clients leak in. Interference is part of the
  boundary.

## Next Step

Up to this point every client was counted as belonging to a single point and never moved from
its spot. Yet overlap was built in on purpose: a client at the edge hears two points at once,
and as it walks, one weakens while the other strengthens. Then the association decision is made
not once but **repeatedly**. The next lesson measures when the handover should happen: raising
the handover threshold lets the client go early, lowering it makes it stick to a weak point.
Early handover and late handover are two ends of the same dial, and they are **two separate
errors**.
