RFDT Solver and WiTwin Simulator are undergoing internal testing as we prepare for public release. The functions are limited. Sign up to receive updates.

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#