Source code for hermespy.channel.cluster_delay_line_rural_macrocells

# -*- coding: utf-8 -*-

from math import atan

import numpy as np

from ..core.factory import Serializable
from .cluster_delay_lines import ClusterDelayLineBase

__author__ = "Jan Adler"
__copyright__ = "Copyright 2023, Barkhausen Institut gGmbH"
__credits__ = ["Jan Adler"]
__license__ = "AGPLv3"
__version__ = "1.2.0"
__maintainer__ = "Jan Adler"
__email__ = "jan.adler@barkhauseninstitut.org"
__status__ = "Prototype"


[docs] class RuralMacrocellsLineOfSight(ClusterDelayLineBase, Serializable): """3GPP cluster delay line preset modeling a rural scenario with direct line of sight between the linked wireless devices. Refer to the :footcite:t:`3GPP:TR38901` for detailed information. The following minimal example outlines how to configure the channel model within the context of a :doc:`simulation.simulation.Simulation`: .. literalinclude:: ../scripts/examples/channel_cdl_rural_macrocells_los.py :language: python :linenos: :lines: 12-40 """ yaml_tag = "RMaLOS" """YAML serialization tag.""" @property def line_of_sight(self) -> bool: return True @property def delay_spread_mean(self) -> float: return -7.49 @property def delay_spread_std(self) -> float: return 0.55 @property def aod_spread_mean(self) -> float: return 0.9 @property def aod_spread_std(self) -> float: return 0.38 @property def aoa_spread_mean(self) -> float: return 1.52 @property def aoa_spread_std(self) -> float: return 0.24 @property def zoa_spread_mean(self) -> float: return 0.47 @property def zoa_spread_std(self) -> float: return 0.4 @property def zod_spread_mean(self) -> float: device_distance = np.linalg.norm(self.beta_device.position - self.alpha_device.position, 2) terminal_height = abs(self.alpha_device.position[2] - self.beta_device.position[2]) return max(-1, -17e-5 * device_distance - 0.01 * (terminal_height - 1.5) + 0.22) @property def zod_spread_std(self) -> float: return 0.34 @property def zod_offset(self) -> float: return 0.0 @property def rice_factor_mean(self) -> float: return 7.0 @property def rice_factor_std(self) -> float: return 4.0 @property def delay_scaling(self) -> float: return 3.8 @property def cross_polarization_power_mean(self) -> float: return 12.0 @property def cross_polarization_power_std(self) -> float: return 4.0 @property def num_clusters(self) -> int: return 11 @property def num_rays(self) -> int: return 20 @property def cluster_delay_spread(self) -> float: return 0.0 @property def cluster_aod_spread(self) -> float: return 2.0 @property def cluster_aoa_spread(self) -> float: return 3.0 @property def cluster_zoa_spread(self) -> float: return 3.0 @property def cluster_shadowing_std(self) -> float: return 3.0 @property def _center_frequency(self) -> float: # pragma: no cover return max(6e9, ClusterDelayLineBase._center_frequency.fget(self)) # type: ignore
[docs] class RuralMacrocellsNoLineOfSight(ClusterDelayLineBase, Serializable): """3GPP cluster delay line preset modeling a rural scenario without direct line of sight between the linked wireless devices. Refer to the :footcite:t:`3GPP:TR38901` for detailed information. The following minimal example outlines how to configure the channel model within the context of a :doc:`simulation.simulation.Simulation`: .. literalinclude:: ../scripts/examples/channel_cdl_rural_macrocells_nlos.py :language: python :linenos: :lines: 12-40 """ yaml_tag = "RMaLOS" """YAML serialization tag.""" @property def line_of_sight(self) -> bool: return False @property def delay_spread_mean(self) -> float: return -7.43 @property def delay_spread_std(self) -> float: return 0.48 @property def aod_spread_mean(self) -> float: return 0.95 @property def aod_spread_std(self) -> float: return 0.45 @property def aoa_spread_mean(self) -> float: return 1.52 @property def aoa_spread_std(self) -> float: return 0.13 @property def zoa_spread_mean(self) -> float: return 0.58 @property def zoa_spread_std(self) -> float: return 0.37 @property def zod_spread_mean(self) -> float: device_distance = np.linalg.norm(self.beta_device.position - self.alpha_device.position, 2) terminal_height = abs(self.alpha_device.position[2] - self.beta_device.position[2]) return max(-1, -19e-5 * device_distance - 0.01 * (terminal_height - 1.5) + 0.28) @property def zod_spread_std(self) -> float: return 0.3 @property def zod_offset(self) -> float: device_distance = np.linalg.norm(self.beta_device.position - self.alpha_device.position, 2) return atan((35 - 0.35) / device_distance) - atan((35 - 1.5) / device_distance) @property def rice_factor_mean(self) -> float: return 0.0 @property def rice_factor_std(self) -> float: return 0.0 @property def delay_scaling(self) -> float: return 1.7 @property def cross_polarization_power_mean(self) -> float: return 7.0 @property def cross_polarization_power_std(self) -> float: return 3.0 @property def num_clusters(self) -> int: return 10 @property def num_rays(self) -> int: return 20 @property def cluster_delay_spread(self) -> float: return 0.0 @property def cluster_aod_spread(self) -> float: return 2.0 @property def cluster_aoa_spread(self) -> float: return 3.0 @property def cluster_zoa_spread(self) -> float: return 3.0 @property def cluster_shadowing_std(self) -> float: return 3.0 @property def _center_frequency(self) -> float: # pragma: no cover return max(6e9, ClusterDelayLineBase._center_frequency.fget(self)) # type: ignore
[docs] class RuralMacrocellsOutsideToInside(ClusterDelayLineBase, Serializable): """3GPP cluster delay line preset modeling a rural scenario with the linked wireless devices being outside and inside a building, respectively. Refer to the :footcite:t:`3GPP:TR38901` for detailed information. The following minimal example outlines how to configure the channel model within the context of a :doc:`simulation.simulation.Simulation`: .. literalinclude:: ../scripts/examples/channel_cdl_rural_macrocells_o2i.py :language: python :linenos: :lines: 12-40 """ yaml_tag = "RMaO2I" """YAML serialization tag.""" @property def line_of_sight(self) -> bool: return False @property def delay_spread_mean(self) -> float: return -7.47 @property def delay_spread_std(self) -> float: return 0.24 @property def aod_spread_mean(self) -> float: return 0.67 @property def aod_spread_std(self) -> float: return 0.18 @property def aoa_spread_mean(self) -> float: return 1.66 @property def aoa_spread_std(self) -> float: return 0.21 @property def zoa_spread_mean(self) -> float: return 0.93 @property def zoa_spread_std(self) -> float: return 0.22 @property def zod_spread_mean(self) -> float: device_distance = np.linalg.norm(self.beta_device.position - self.alpha_device.position, 2) terminal_height = abs(self.alpha_device.position[2] - self.beta_device.position[2]) return max(-1, -19e-5 * device_distance - 0.01 * (terminal_height - 1.5) + 0.28) @property def zod_spread_std(self) -> float: return 0.3 @property def zod_offset(self) -> float: device_distance = np.linalg.norm(self.beta_device.position - self.alpha_device.position, 2) return atan((35 - 0.35) / device_distance) - atan((35 - 1.5) / device_distance) @property def rice_factor_mean(self) -> float: return 0.0 @property def rice_factor_std(self) -> float: return 0.0 @property def delay_scaling(self) -> float: return 1.7 @property def cross_polarization_power_mean(self) -> float: return 7.0 @property def cross_polarization_power_std(self) -> float: return 3.0 @property def num_clusters(self) -> int: return 10 @property def num_rays(self) -> int: return 20 @property def cluster_delay_spread(self) -> float: return 0.0 @property def cluster_aod_spread(self) -> float: return 2.0 @property def cluster_aoa_spread(self) -> float: return 3.0 @property def cluster_zoa_spread(self) -> float: return 3.0 @property def cluster_shadowing_std(self) -> float: return 3.0 @property def _center_frequency(self) -> float: # pragma: no cover return max(6e9, ClusterDelayLineBase._center_frequency.fget(self)) # type: ignore