25#pragma region HEADER_FILES
27#include "LTENR_AntennaModel.h"
30#define LTENR_TX_ANTENNA_COUNT_DEFAULT 1
31#define LTENR_RX_ANTENNA_COUNT_DEFAULT 1
32#define LTENR_ELEMENT_GAIN_DEFAULT 0
33#define LTENR_BORESIGHT_ANGLE_DEFAULT 60
34#define LTENR_BEAM_WIDTH_DEFAULT 65
35#define LTENR_FRONT_TO_BACK_RATIO_DEFAULT 30
36#define LTENR_SECTOR_ID_DEFAULT 1
37#define LTENR_RX_ANTENNA_GAIN_DEFAULT 0
39#define ANGLE_TO_RADIANS(angle) (angle * M_PI / 180.0)
41void LTENR_CONFIGURE_ANTENNA(NETSIM_ID d, NETSIM_ID in, ptrLTENR_ANTENNA antenna,
void* xmlNetSimNode)
43 void* xmlChild = fn_NetSim_xmlGetFirstChildElement(xmlNetSimNode,
"ANTENNA");
44 getXmlVar(&antenna->txAntennaCount, TX_ANTENNA_COUNT, xmlChild, 1, _UINT, LTENR);
45 getXmlVar(&antenna->rxAntennaCount, RX_ANTENNA_COUNT, xmlChild, 1, _UINT, LTENR);
48 antenna->antennaType = ConfigReadEnum(xmlChild,
"ANTENNA_TYPE", LTENR_ANTENNA_TYPE,
true);
49 switch (antenna->antennaType)
51 case LTENR_OMNIDIRECTIONAL:
54 antenna->antennaModel = ConfigReadEnum(xmlChild,
"ANTENNA_MODEL", LTENR_ANTENNA_MODEL,
true);
55 switch (antenna->antennaModel)
57 case LTENR_2D_PASSIVE_ANTENNA:
58 antenna->antennaModel = ConfigReadEnum(xmlChild,
"ANTENNA_MODEL", LTENR_ANTENNA_MODEL,
true);
59 getXmlVar(&antenna->boresightAngle, BORESIGHT_ANGLE, xmlChild, 1, _DOUBLE, LTENR);
60 getXmlVar(&antenna->elementGain, ELEMENT_GAIN, xmlChild, 1, _DOUBLE, LTENR);
61 getXmlVar(&antenna->beamwidth, BEAM_WIDTH, xmlChild, 1, _DOUBLE, LTENR);
62 getXmlVar(&antenna->frontToBackRatio, FRONT_TO_BACK_RATIO, xmlChild, 1, _DOUBLE, LTENR);
65 fnNetSimError(
"Unknown Antenna Model for device %d interface %d.\n", d, in);
70 fnNetSimError(
"Unknown Antenna Type for device %d interface %d.\n", d, in);
76 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(d,in);
78 getXmlVar(&uePhy->ueRxAntennaGain, RX_ANTENNA_GAIN, xmlChild, 1, _DOUBLE, LTENR);
85void LTENR_ANTENNA_SET_LAYER_COUNT(ptrLTENR_ANTENNA gnbAntenna, ptrLTENR_ANTENNA ueAntenna)
87 if (gnbAntenna->txAntennaCount < ueAntenna->rxAntennaCount ||
88 gnbAntenna->rxAntennaCount < ueAntenna->txAntennaCount)
90 fnNetSimError(
"Warning: gNB/eNB antenna count is less than the UE antenna count.\n"
91 "This configuration is not typical. Cross-check Antenna configuration in both gNB/eNB and UE.\n");
93 ueAntenna->downlinkLayerCount = min(gnbAntenna->txAntennaCount, ueAntenna->rxAntennaCount);
94 ueAntenna->uplinkLayerCount = min(gnbAntenna->rxAntennaCount, ueAntenna->txAntennaCount);
97UINT LTENR_ANTENNA_GET_LAYER_COUNT(ptrLTENR_ANTENNA ueAntenna,
bool isUplink)
99 if (isUplink)
return ueAntenna->uplinkLayerCount;
100 else return ueAntenna->downlinkLayerCount;
103UINT LTENR_ANTENNA_GET_LAYER_COUNT_FOR_NONASSOCIATED_UE(ptrLTENR_ANTENNA gnBAntenna, ptrLTENR_ANTENNA ueAntenna,
bool isUplink)
106 return min(gnBAntenna->rxAntennaCount, ueAntenna->txAntennaCount);
108 return min(gnBAntenna->txAntennaCount, ueAntenna->rxAntennaCount);
111_declspec(dllexport)
double LTENR_PHY_GetAntennaGain(ptrLTENR_PROPAGATIONINFO info, ptrLTENR_ANTENNA antenna)
114 double gNBX = info->gnbPos.X;
115 double gNBY = info->gnbPos.Y;
117 double ueX = info->uePos.X;
118 double ueY = info->uePos.Y;
120 double dx = ueX - gNBX;
121 double dy = ueY - gNBY;
122 double angle = atan2(dy, dx) * 180 / M_PI;
123 double antennaGain = 0;
130 double phi = ANGLE_TO_RADIANS(angle) - ANGLE_TO_RADIANS(antenna->boresightAngle);
141 double Ah = -min(12 * pow(phi / ANGLE_TO_RADIANS(antenna->beamwidth), 2), antenna->frontToBackRatio);
142 antennaGain = antenna->elementGain - min(-Ah, antenna->frontToBackRatio);