Walls and materials
Compare how glass, drywall, concrete, a layered wall and metal transmit and reflect a 3.5 GHz signal, and choose materials and components for wall penetration.
A wall in Channel is a surface with a layered material. This guide puts one wall between a transmitter and a receiver, swaps its material and reads the penetration loss and the reflection. See Materials for the model behind it.
The script#
import torch
from witwin.core import AntennaState, MaterialLayer, Mesh, PhysicalMaterial, Scene, Structure
from witwin.channel import deterministic
FREQUENCY_HZ = 3.5e9
vertices = torch.tensor([[2.5, -3.0, -1.0], [2.5, 3.0, -1.0], [2.5, -3.0, 2.0], [2.5, 3.0, 2.0]])
faces = torch.tensor([[0, 1, 2], [1, 3, 2]])
materials = {
"glass 6 mm": PhysicalMaterial(eps_r=6.31, sigma_e=0.0036, thickness_m=0.006),
"drywall 12.5 mm": PhysicalMaterial(eps_r=2.73, sigma_e=0.0085, thickness_m=0.0125),
"concrete 20 cm": PhysicalMaterial(eps_r=5.24, sigma_e=0.0462, thickness_m=0.2),
"insulated wall": PhysicalMaterial(layers=(
MaterialLayer(0.0125, eps_r=2.73, sigma_e=0.0085),
MaterialLayer(0.09, eps_r=1.2),
MaterialLayer(0.0125, eps_r=2.73, sigma_e=0.0085),
)),
"metal": PhysicalMaterial.perfect_conductor(),
}
tx = AntennaState(1, "tx", torch.tensor([0.0, 0.0, 0.5]), power_w=1.0)
rx = AntennaState(2, "rx", torch.tensor([5.0, 0.0, 0.5])) # behind the wall
mirror = AntennaState(3, "rx", torch.tensor([0.0, 2.0, 0.5])) # in front of the wall
config = deterministic.Config(max_depth=1, components={"los", "reflection", "transmission"})
free = deterministic.solve(Scene(structures=[], endpoints=[tx, rx]), config, reference_frequency_hz=FREQUENCY_HZ)
print(f"free space at 5 m: {10 * torch.log10(free.path_gain).item():.1f} dB")
print(f"{'material':18s} {'through (dB)':>13s} {'reflected (dB)':>15s}")
for name, material in materials.items():
wall = Structure(Mesh(vertices, faces, recenter=False, fill_mode="surface"), material, name=name)
result = deterministic.solve(
Scene(structures=[wall], endpoints=[tx, rx, mirror]), config, reference_frequency_hz=FREQUENCY_HZ
)
through = result.component_power["transmission"][0, 0] / free.path_gain[0, 0]
reflected = result.component_power["reflection"][0, 1]
print(f"{name:18s} {10 * torch.log10(through).item():13.1f} {10 * torch.log10(reflected).item():15.1f}")Output:
free space at 5 m: -57.3 dB
material through (dB) reflected (dB)
glass 6 mm -2.8 -60.9
drywall 12.5 mm -1.1 -64.1
concrete 20 cm -8.1 -64.2
insulated wall -2.4 -64.1
metal -inf -58.0"through" is the penetration loss: transmitted power behind the wall relative to free space. "reflected" is the reflection-path gain at the receiver in front of the wall (5.385 m path, 21.8 degrees from the wall normal).
What to notice#
- Line of sight is blocked. Once a wall is in the way, the
"los"component at the receiver behind it is 0. All power behind the wall arrives through the"transmission"component. Without"transmission"incomponents, the receiver behind the wall would get nothing (or only diffraction around the wall's edges, if you request"diffraction"). - Loss grows with thickness and conductivity. 20 cm of concrete costs 8.1 dB at 3.5 GHz; drywall costs about 1 dB.
- Metal is a mirror. The perfect conductor reflects with
abs(reflection coefficient) = 1: -58.0 dB is exactly the free-space gain of the 5.385 m reflection path. Nothing passes through it. - Layers matter. The insulated wall is two drywall sheets with an air-like gap. Channel computes the whole stack, including reflections between the layers.
Choosing material values#
Channel does not ship a material library. The values above are close to ITU-R P.2040 at 3.5 GHz. For other bands, use the ITU-R P.2040 frequency law with PowerLawDispersion, or measured values. Keep thickness_m realistic: it sets the penetration loss of a thin-sheet wall.
| Situation | Material setting |
|---|---|
| Single wall, floor or ceiling modelled as one surface | Default geometry_mode="thin_sheet" with thickness_m |
| Composite wall | layers=(MaterialLayer(...), ...) |
| Metal (doors, cabinets, vehicles) | PhysicalMaterial.perfect_conductor() |
| Closed solid you only want to reflect from | geometry_mode="volumetric"; the "transmission" component does not pass through it |
| Wide frequency range | dispersion=PowerLawDispersion(...) |
Cost of transmission#
Each wall crossing counts as one interaction toward max_depth, like a reflection. In a building, a path that crosses three walls and reflects once needs max_depth=4. Raise max_depth step by step and watch the run time: the number of candidate paths grows quickly with depth. The limit is 5.