SionnaRT Channel

The SionnaRTChannel is an adapter for Sionna Ray Tracing module.

It is deterministic, defined by the given sionna.rt.Scene. Meaning, given same devices and positions, different channel samples (SionnaRTChannelSample) and realizations (SionnaRTChannelRealization<hermespy.channel.sionna_rt_channel.SionnaRTChannelRealization>`) would not introduce any random changes and would produce equal state and propagation results.

This channel model requires sionna.rt.Scene to operate. It should be loaded with sionna.rt.load_scene and provided to the SionnaRTChannel __init__ method.

Current assumptions in the adapter implementation are:

  • All the transmitting and receiving antennas utilize isometric pattern (“iso”) and a single vertical polarization (“V”).

  • The antenna arrays are synthetic.

  • The delays are not normalized.

  • If not a single ray hit was cought, then a zeroed signal or state are returned.

It should be noted that sionna.rt.Scene is a singleton class. So when a new scene is loaded, a conflict with the previous existing instance will occure. Thus usage of several scenes at once must be avoided.

        classDiagram

   direction LR

   class SionnaRTChannel {

      _realize() : SionnaRTChannelRealization
   }

   class SionnaRTChannelRealization {

      _sample() : SionnaRTChannelSample
   }

   class SionnaRTChannelSample {

      propagate(Signal) : Signal
   }

   SionnaRTChannel --o SionnaRTChannelRealization : realize()
   SionnaRTChannelRealization --o SionnaRTChannelSample : sample()

   click SionnaRTChannel href "#hermespy.channel.sionna_rt_channel.SionnaRTChannel"
   click SionnaRTChannelRealization href "#hermespy.channel.sionna_rt_channel.SionnaRTChannelRealization"
   click SionnaRTChannelSample href "#hermespy.channel.sionna_rt_channel.SionnaRTChannelSample"
    

The following minimal example outlines how to configure the channel model within the context of a Simulation:

 1# Initialize two devices to be linked by a channel
 2simulation = Simulation()
 3alpha_device = simulation.new_device(
 4    carrier_frequency=24e9, pose=Transformation.From_Translation(np.array([8.5, 21., 27.])))
 5beta_device = simulation.new_device(
 6    carrier_frequency=24e9, pose=Transformation.From_Translation(np.array([45., 90., 1.5])))
 7
 8# Load the desired scene
 9scene = rt.load_scene(rt.scene.munich)
10
11# Create a channel between the two devices
12channel = SionnaRTChannel(scene=scene, gain=1., seed=42)
13simulation.set_channel(alpha_device, beta_device, channel)
14
15# Configure communication link between the two devices
16link = SimplexLink()
17alpha_device.transmitters.add(link)
18beta_device.receivers.add(link)
19
20# Specify the waveform and postprocessing to be used by the link
21link.waveform = RRCWaveform(
22    symbol_rate=1e8, oversampling_factor=2, num_data_symbols=1000,
23    num_preamble_symbols=10, pilot_rate=10)
24link.waveform.channel_estimation = SCLeastSquaresChannelEstimation()
25link.waveform.channel_equalization = SCZeroForcingChannelEqualization()