This simulator was generated by Claude (Anthropic) for the Wireless 101 course, and
it builds the lab that courses/wrl101/SYLLABUS.md Module 8
declares: a 2D propagation simulator with walls, visible multipath reflections and path-loss
contour maps. The propagation physics is genuinely computed in your browser, from the
geometry on screen, every time you move something.
Three kinds of number, labelled where they appear.(1) Computed — free-space path loss, the log-distance extension, every
wall-crossing test, mirror-image specular reflection, the Fresnel TE reflection coefficient at
the real angle of incidence, the diffraction parameter v from the real
geometry, and the power or coherent sum of the rays.
(2) Published figures — the knife-edge loss approximation (ITU-R P.526 /
Lee), the wall penetration-loss ranges and path-loss exponent ranges from this course's
own M8-L4 tables, and the relative permittivities from ITU-R P.2040 Table 3.
(3) Illustrative, marked † — the single
decibel value chosen inside each published range, every preset floor plan, and the shadowing
sigma.
Caveat on the permittivities. This repo is offline, so the
ITU-R P.2040 values below are quoted from standard reference tabulations and were
not verified against the recommendation text. P.2040 also has no row for
low-emissivity glass, so this page gives it none: low-E blocks a signal because its
metal-oxide coating reflects, so it is modelled as a conductor like the metal cladding, and the
materials table says so. They set only the reflection strength, and
the reflection loss they produce is printed for every bounce so you can see the effect of
changing them. The penetration losses are separate and come from M8-L4.
What it is not. It is a plan view: no ground reflection, no floors, no antenna
height, so the two-ray d−4 law of M8-L2 cannot appear
here. Antennas are isotropic (0 dBi). Scattering is not modelled — every
surface is treated as smooth and large compared with the wavelength. Diffraction is
single-edge and is not combined with reflection: the one wall whose edge dominates is
treated as a partially transmitting screen, so going through it and bending round it are charged
together and the total has no step at the shadow boundary, but a second wall across the
same path is charged plain penetration. Fading statistics are out of
scope and belong to M8-L3; the optional shadowing layer here is spatial.
Module 8 lab. Drag the transmitter, the receiver or any wall — or select an
object and use the arrow keys, or type coordinates. The map is path loss recomputed over a
grid; the lines are the actual ray geometry that produced the number at the receiver. Everything
is in metres, decibels and dBm.
The chain, end to end
Every thumbnail is drawn from the same computation as the big map —
hover or focus a block to light what it produces and the knobs that drive it.
Path-loss map & ray geometry
The shadow is not black — the knife-edge geometry
All of the geometry between the transmitter, the obstructing edge and the
receiver collapses into one dimensionless number, v. These are
this moment's real values.
The formula is a published approximation, not the exact answer.
The exact diffraction loss needs the Fresnel integral, which has no closed form, so
practice uses a fitted expression — here the ITU-R P.526 / Lee one that
M8-L2 teaches, L ≈ 6.9 + 20 log₁₀(√((v−0.1)²+1) + v − 0.1),
quoted there as accurate to a few tenths of a decibel and valid for
v > −0.7. Below that this page reports zero diffraction
loss, which leaves a known 0.54 dB step at the cut-off — the formula's own
behaviour, not a bug here. At v = 0, exactly grazing, it gives
6.0 dB: the field on the shadow boundary is half the free-space amplitude, which
is the single most useful number in the whole model.
Every ray reaching the receiver, and what it cost
The colour of the map at the receiver is this sum and nothing else. Each row
is one traced path with its losses broken out, so the number is explainable rather than
merely displayed.
Scale: viridis — perceptually uniform and colour-blind safe, with monotonically
increasing lightness, so it also reads correctly in greyscale.
Deliberately not a rainbow scale: a rainbow is not perceptually ordered and its
yellow/cyan bands read as contours that the data does not contain.
Because a heat map cannot be read by colour alone, the same field is drawn as
contour lines every 10 dB and the exact value at the receiver is printed on the
right.
Keyboard control (a mouse is optional)
Click the scene, or Tab to it, then: arrow keys nudge the selected object by 0.5 m
(Shift for 2 m) · Tab/Shift+Tab inside the object list picks
what moves · [ and ] rotate a selected wall by 5° ·
− and = shorten and lengthen it by 1 m · T selects the
transmitter, R the receiver · Delete removes the selected wall.
The numeric boxes under “Selected object” are an equivalent path for every one of
these.
Penetration loss is charged once per wall a ray actually crosses, found by a real
segment–segment intersection test, not by a distance guess. Reflection loss is
not in this table at all — it is computed per bounce from the permittivity and the
angle, so the same wall reflects weakly head-on and almost perfectly at a grazing angle.
What each stage of the calculation does
Performance, stated rather than hidden. A live heat map with two-bounce ray tracing can
hang a page, so this one is budgeted, and the budget is printed under the scene while it runs
instead of being silently applied.
Two grids. A coarse grid of about 2,400 sample points while you are dragging,
and a fine grid on release — about 12,000 points at 0 or 1 bounce, reduced to about
5,000 at 2 bounces, because a 2-bounce point costs roughly eight times as much. Both grids call
the same physics function, so the fast path is not a different model; the checker
asserts that the coarse and fine fields agree.
Ray budget: 90 image paths per point. Mirror images of the transmitter are built once
per scene, not once per point. Every 1-bounce image is always traced. If the 2-bounce ordered
wall pairs push the total past 90, the surplus is dropped and the status line says
CAPPED with both counts — a silent truncation would read
as “we traced everything”.
The main thread is never blocked. The map is computed in time-sliced chunks of about
10 ms and painted progressively, so dragging stays responsive and the page never freezes.
Walls are capped at 14 so the image count stays bounded; the Add button disables
itself and says so rather than quietly refusing.
Power sum or coherent sum — and why the default is power. Each traced ray arrives with
its own path length, so it has its own phase. Adding the rays coherently
(Σ aiejφi, with
φ = −2πd/λ plus π for
every reflection whose coefficient came out negative) is the physically complete answer for a
single frequency, and the fringes it draws are real interference at half-wavelength spacing
— the multipath of M8-L3, made spatial. It is off by default for two honest reasons: those
fringes are finer than the grid at gigahertz frequencies, so what you see is partly the grid
sampling them, and a real receiver with any bandwidth averages over them. The power sum
(Σ|ai|²) is what coverage tools report, and it is
the quantity every published path-loss model is fitted to. The ray past an obstructing edge is given
the phase of its geometric path only; the Fresnel integral's own phase term is not included, so
treat the fringe positions near a shadow edge as indicative.
Where this sits in Module 8. M8-L1 gives the free-space law this starts from; M8-L2 gives
the reflection, diffraction and scattering mechanisms and the knife-edge model used here; M8-L3
gives the statistics of the multipath you can see as rays; M8-L4 gives the log-distance exponent,
the partition-loss budget and the shadowing. This page is deliberately the spatial view:
it shows you where the energy goes, not how it fluctuates in time.