Core Classes API Reference

Fundamental classes that form the backbone of WiTwin

This section covers the fundamental classes that form the backbone of WiTwin.

Environment#

The Environment class represents the simulation environment where all wireless propagation takes place.

Constructor#

wt.Environment(
    frequency: float,
    bandwidth: float = 1e9,
    temperature: float = 293.15,
    resolution: Tuple[int, int] = (1024, 1024),
    bounds: Optional[Tuple[float, float, float, float, float, float]] = None
)

Parameters#

ParameterTypeDefaultDescription
frequencyfloat-Operating frequency in Hz
bandwidthfloat1e9Signal bandwidth in Hz
temperaturefloat293.15Ambient temperature in Kelvin
resolutionTuple[int, int](1024, 1024)Spatial resolution for ray tracing
boundsOptional[Tuple]NoneEnvironment bounds [xmin, ymin, zmin, xmax, ymax, zmax]

Methods#

add_device(device: Union[Transmitter, Receiver]) -> None

Adds a wireless device to the environment.

env = wt.Environment(frequency=60e9)
tx = wt.Transmitter(position=[0, 0, 10])
env.add_device(tx)

add_object(obj: Object) -> None

Adds a physical object to the environment.

wall = wt.Object(shape='box', dimensions=[10, 0.3, 3])
env.add_object(wall)

simulate(config: Optional[SimulationConfig] = None) -> SimulationResults

Runs the ray tracing simulation.

results = env.simulate()
# or with custom config
config = wt.SimulationConfig(max_reflections=5)
results = env.simulate(config)

compute_coverage(transmitter: Transmitter, height: float = 1.5) -> np.ndarray

Computes coverage map at specified height.

coverage_map = env.compute_coverage(tx, height=2.0)

Transmitter#

Represents a wireless transmitter device.

Constructor#

wt.Transmitter(
    position: List[float],
    orientation: List[float] = [0, 0, 0],
    power_dbm: float = 30,
    antenna: Optional[Antenna] = None,
    frequency: Optional[float] = None
)

Parameters#

ParameterTypeDefaultDescription
positionList[float]-3D position [x, y, z] in meters
orientationList[float][0, 0, 0]Euler angles [roll, pitch, yaw] in degrees
power_dbmfloat30Transmit power in dBm
antennaOptional[Antenna]IsotropicAntenna pattern object
frequencyOptional[float]NoneOverride environment frequency

Properties#

  • position: Get/set transmitter position
  • orientation: Get/set transmitter orientation
  • power_dbm: Get/set transmit power
  • power_watts: Get transmit power in watts

Example#

# Create a directional transmitter
tx = wt.Transmitter(
    position=[0, 0, 5],
    orientation=[0, 0, 45],  # 45 degrees yaw
    power_dbm=23,
    antenna=wt.antennas.HornAntenna(gain_dbi=15)
)

Receiver#

Represents a wireless receiver device.

Constructor#

wt.Receiver(
    position: List[float],
    orientation: List[float] = [0, 0, 0],
    antenna: Optional[Antenna] = None,
    noise_figure: float = 3.0,
    frequency: Optional[float] = None
)

Parameters#

ParameterTypeDefaultDescription
positionList[float]-3D position [x, y, z] in meters
orientationList[float][0, 0, 0]Euler angles [roll, pitch, yaw] in degrees
antennaOptional[Antenna]IsotropicAntenna pattern object
noise_figurefloat3.0Receiver noise figure in dB
frequencyOptional[float]NoneOverride environment frequency

Methods#

calculate_noise_power(bandwidth: float) -> float

Calculates thermal noise power for given bandwidth.

rx = wt.Receiver(position=[10, 0, 1.5])
noise_power_dbm = rx.calculate_noise_power(bandwidth=100e6)

Object#

Represents physical objects in the environment.

Constructor#

wt.Object(
    shape: str,
    dimensions: List[float],
    position: List[float] = [0, 0, 0],
    orientation: List[float] = [0, 0, 0],
    material: Union[str, Material] = 'concrete',
    velocity: Optional[List[float]] = None
)

Parameters#

ParameterTypeDefaultDescription
shapestr-Object shape: 'box', 'sphere', 'cylinder', 'mesh'
dimensionsList[float]-Shape-specific dimensions
positionList[float][0, 0, 0]Center position [x, y, z]
orientationList[float][0, 0, 0]Euler angles [roll, pitch, yaw]
materialUnion[str, Material]'concrete'Material properties
velocityOptional[List[float]]NoneVelocity vector [vx, vy, vz] m/s

Shape Dimensions#

ShapeDimensions
box[width, depth, height]
sphere[radius]
cylinder[radius, height]
mesh[scale] (requires mesh_file parameter)

Example#

# Create a moving metal sphere
sphere = wt.Object(
    shape='sphere',
    dimensions=[2.0],  # 2m radius
    position=[5, 5, 2],
    material='metal',
    velocity=[10, 0, 0]  # Moving at 10 m/s in x-direction
)

Material#

Defines electromagnetic properties of materials.

Constructor#

wt.Material(
    name: str,
    permittivity: complex,
    permeability: complex = 1.0,
    conductivity: float = 0.0,
    frequency_dependent: bool = False
)

Predefined Materials#

# Built-in materials
concrete = wt.materials.CONCRETE
metal = wt.materials.METAL
glass = wt.materials.GLASS
wood = wt.materials.WOOD

Custom Material#

# Create custom material
custom_material = wt.Material(
    name='special_absorber',
    permittivity=4.5 - 0.1j,
    conductivity=0.01
)

Antenna Patterns#

Isotropic#

antenna = wt.antennas.Isotropic()

Directional#

antenna = wt.antennas.DirectionalAntenna(
    gain_dbi=10,
    beamwidth_h=60,  # Horizontal beamwidth in degrees
    beamwidth_v=30   # Vertical beamwidth in degrees
)

Patch Antenna#

antenna = wt.antennas.PatchAntenna(
    gain_dbi=6,
    width=0.05,  # Physical dimensions
    height=0.05
)

Horn Antenna#

antenna = wt.antennas.HornAntenna(
    gain_dbi=15,
    aperture_width=0.1,
    aperture_height=0.08
)

Array Antenna#

antenna = wt.antennas.ArrayAntenna(
    element_pattern=wt.antennas.PatchAntenna(),
    n_elements=4,
    spacing=0.5,  # In wavelengths
    weights=np.array([1, 1, 1, 1])  # Complex weights for beamforming
)

Next Steps#