NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
LTENR_AntennaModel.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Shashi Kant Suman *
22* *
23* ----------------------------------------------------------------------------------*/
24
25#pragma region HEADER_FILES
26#include "stdafx.h"
27#include "LTENR_AntennaModel.h"
28#include "LTENR_PHY.h"
29#pragma endregion
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
38
39#define ANGLE_TO_RADIANS(angle) (angle * M_PI / 180.0)
40
41void LTENR_CONFIGURE_ANTENNA(NETSIM_ID d, NETSIM_ID in, ptrLTENR_ANTENNA antenna, void* xmlNetSimNode)
42{
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);
46 if (isGNB(d, in))
47 {
48 antenna->antennaType = ConfigReadEnum(xmlChild, "ANTENNA_TYPE", LTENR_ANTENNA_TYPE, true);
49 switch (antenna->antennaType)
50 {
51 case LTENR_OMNIDIRECTIONAL:
52 break; //Nothing to configure
53 case LTENR_SECTOR:
54 antenna->antennaModel = ConfigReadEnum(xmlChild, "ANTENNA_MODEL", LTENR_ANTENNA_MODEL, true);
55 switch (antenna->antennaModel)
56 {
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);
63 break;
64 default:
65 fnNetSimError("Unknown Antenna Model for device %d interface %d.\n", d, in);
66 break;
67 }
68 break;
69 default:
70 fnNetSimError("Unknown Antenna Type for device %d interface %d.\n", d, in);
71 break;
72 }
73 }
74 else
75 {
76 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(d,in);
77 if(isNTNScenario())
78 getXmlVar(&uePhy->ueRxAntennaGain, RX_ANTENNA_GAIN, xmlChild, 1, _DOUBLE, LTENR);
79 }
80
81
82
83}
84
85void LTENR_ANTENNA_SET_LAYER_COUNT(ptrLTENR_ANTENNA gnbAntenna, ptrLTENR_ANTENNA ueAntenna)
86{
87 if (gnbAntenna->txAntennaCount < ueAntenna->rxAntennaCount ||
88 gnbAntenna->rxAntennaCount < ueAntenna->txAntennaCount)
89 {
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");
92 }
93 ueAntenna->downlinkLayerCount = min(gnbAntenna->txAntennaCount, ueAntenna->rxAntennaCount);
94 ueAntenna->uplinkLayerCount = min(gnbAntenna->rxAntennaCount, ueAntenna->txAntennaCount);
95}
96
97UINT LTENR_ANTENNA_GET_LAYER_COUNT(ptrLTENR_ANTENNA ueAntenna, bool isUplink)
98{
99 if (isUplink) return ueAntenna->uplinkLayerCount;
100 else return ueAntenna->downlinkLayerCount;
101}
102
103UINT LTENR_ANTENNA_GET_LAYER_COUNT_FOR_NONASSOCIATED_UE(ptrLTENR_ANTENNA gnBAntenna, ptrLTENR_ANTENNA ueAntenna, bool isUplink)
104{
105 if (isUplink)
106 return min(gnBAntenna->rxAntennaCount, ueAntenna->txAntennaCount);
107 else
108 return min(gnBAntenna->txAntennaCount, ueAntenna->rxAntennaCount);
109}
110
111_declspec(dllexport) double LTENR_PHY_GetAntennaGain(ptrLTENR_PROPAGATIONINFO info, ptrLTENR_ANTENNA antenna)
112{
113
114 double gNBX = info->gnbPos.X;
115 double gNBY = info->gnbPos.Y;
116
117 double ueX = info->uePos.X;
118 double ueY = info->uePos.Y;
119
120 double dx = ueX - gNBX;
121 double dy = ueY - gNBY;
122 double angle = atan2(dy, dx) * 180 / M_PI;
123 double antennaGain = 0;
124
125 // Ensure the angle is positive
126 if (angle < 0) {
127 angle += 360;
128 }
129
130 double phi = ANGLE_TO_RADIANS(angle) - ANGLE_TO_RADIANS(antenna->boresightAngle);
131 while (phi < -M_PI)
132 {
133 phi += M_PI + M_PI;
134 }
135 while (phi > M_PI)
136 {
137 phi -= M_PI + M_PI;
138 }
139
140 //Horizontal Radiation Pattern
141 double Ah = -min(12 * pow(phi / ANGLE_TO_RADIANS(antenna->beamwidth), 2), antenna->frontToBackRatio);
142 antennaGain = antenna->elementGain - min(-Ah, antenna->frontToBackRatio);
143
144 return antennaGain;
145}