NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
NTN_Measurements.c
1#include "NTN_PropagationModel.h"
2#include "LTE_NR.h"
3#include "LTENR_PHY.h"
4#define DegreesToRadians(degree) ((degree) * (M_PI / 180.0))
5#define RadiansToDegrees(radian) ((radian) * (180.0 / M_PI))
6
7static FILE* fpRMlog = NULL;
8static FILE* fpLog = NULL;
9
10// Shadowing St. dev removed from the plots.
11void initNTN_UeAssociationLogs() {
12
13 if (!get_protocol_log_status("NTN_UE_Beam_Association"))
14 return;
15
16 char s[BUFSIZ];
17 sprintf(s, "%s\\%s", pszIOLogPath, "NTN_UE_Beam_Association.csv");
18 fpRMlog = fopen(s, "w");
19 if (!fpRMlog)
20 {
21 fnSystemError("Unable to open %s file", s);
22 perror(s);
23 }
24
25 fprintf(fpRMlog, "%s,%s,%s,%s,",
26 "Time(ms)", "Ue Name", "UeX(m)", "UeY(m)");
27
28 fprintf(fpRMlog, "%s,%s,%s,%s,%s,",
29 "Elevation Angle(°)", "Slant height(Km)", "Theta(°)", "EIRP(dBW)", "PathLoss(dB)");
30
31 fprintf(fpRMlog, "%s,%s,%s,%s,",
32 "ShadowLoss(dB)", "Additional Loss(dB)", "Clutter Loss(dB)", "Angular Antenna Gain(dB)");
33
34 fprintf(fpRMlog, "%s,%s,",
35 "UE Rx Antenna Gain(dB)", "CIR(dB)");
36
37 fprintf(fpRMlog, "%s,%s,%s,%s,",
38 "TotalLoss(dB)", "Noise(dBm)", "Rx Power(dBm)", "FR Channel Id");
39
40 fprintf(fpRMlog, "%s,%s,%s,%s,",
41 "Channel Bandwidth(MHz)", "Interference Power(dBm)", "Guard Band BW(MHz)", "SNR(dB)");
42
43 fprintf(fpRMlog, "%s,%s,%s,%s,%s,\n",
44 "SINR(dB)", "Current Beam Id", "CQI", "MCS Index", "Associated Beam");
45
46}
47
48void NTN_plotUeAssociation(ptrLTENR_PROPAGATIONINFO propInfo,int CA_ID, UINT layerId, bool isSelected) {
49
50 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
51 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(propInfo->ueId, propInfo->ueIf);
52 int frChannelId = getBeamChannelId(propInfo->selectedBeamId);
53
54 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo = LTENR_ASSOCIATEDUEPHYINFO_GET(propInfo->gnbId, propInfo->gnbIf, propInfo->ueId, propInfo->ueIf);
55 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(propInfo->gnbId, propInfo->gnbIf);
56 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
57
58 if (assocInfo->isAssociated && ca->configSlotType == SLOT_UPLINK) return;
59
60 if (fpRMlog) {
61 //DEVICE_CONFIGID
62 NETSIM_ID ueId = propInfo->ueId;
63
64 fprintf(fpRMlog, "%lf,%s,%.2lf,%.2lf,",
65 ldEventTime / MILLISECOND, DEVICE_NAME(ueId),
66 DEVICE_POSITION(ueId)->X, DEVICE_POSITION(ueId)->Y);
67
68 fprintf(fpRMlog, "%.2lf,%.3lf,%.2lf,",
69 RadiansToDegrees(propInfo->elevationAngle_rad),
70 propInfo->slantHeight/1000 ,
71 RadiansToDegrees(propInfo->theta_rad));
72
73 fprintf(fpRMlog, "%.2lf,%.2lf,%.2lf,",
74 ntnInfo->eirp_dBW,
75 propInfo->dPathLoss,
76 propInfo->dShadowFadingLoss);
77
78 fprintf(fpRMlog, "%.2lf,%.2lf,%.2lf,%.2lf,",
79 propInfo->dAdditionalLoss,
80 propInfo->dClutterLoss,
81 propInfo->angularAntennaGain_dB,
82 uePhy->ueRxAntennaGain);
83
84 if (ntnInfo->interferenceModel == NTN_CIR)
85 fprintf(fpRMlog, "%.2lf,", ntnInfo->carrier_InterferenceRatio);
86 else
87 fprintf(fpRMlog, "N/A,");
88
89 fprintf(fpRMlog, "%.2lf,%.2lf,%.2lf,",
90 propInfo->dTotalLoss,
91 propInfo->downlink.thermalNoise,
92 propInfo->downlink.rxPower_dbm[layerId]);
93
94 fprintf(fpRMlog, "%d,%.2lf,%.2lf,%.2lf,",
95 frChannelId,
96 ntnInfo->channelBandwidth,
97 propInfo->downlink.InterferencePower_dbm[layerId],
98 ntnInfo->guardBand_MHz);
99
100 fprintf(fpRMlog, "%.2lf,%.2lf,%u,",
101 propInfo->downlink.SNR_db[layerId],
102 propInfo->downlink.SINR_db[layerId],
103 propInfo->selectedBeamId);
104
105
106 if (assocInfo->downlinkAMCInfo[CA_ID])
107 {
108 fprintf(fpRMlog, "%d,%u,",
109 assocInfo->downlinkAMCInfo[CA_ID][layerId]->cqiTable.CQIIndex,
110 assocInfo->downlinkAMCInfo[CA_ID][layerId]->mcsTable.mcsIndex);
111 }
112 else
113 fprintf(fpRMlog, "NA,NA,");
114
115
116 if (isSelected) {
117 fprintf(fpRMlog, "true,");
118 }
119
120 fprintf(fpRMlog, "\n");
121 fflush(fpRMlog);
122 }
123 return;
124}
125
126void initNTNRadioMeasurementLogs() {
127
128 if (!get_protocol_log_status("NTN_Radio_Measurement_Logs"))
129 return;
130
131 char s[BUFSIZ];
132 sprintf(s, "%s\\%s", pszIOLogPath, "NTN_Radio_Measurement_Logs.csv");
133 fpLog = fopen(s, "w");
134
135 if (!fpLog) {
136 fnSystemError("Unable to open %s file", s);
137 perror(s);
138 }
139
140 fprintf(fpLog, "%s,%s,%s,%s,",
141 "Time(ms)", "gNB or eNB Name", "UE Name", "Slant height(Km)");
142
143 fprintf(fpLog, "%s,%s,%s,%s,%s,",
144 "Elevation Angle(°)", "CC_ID", "Band", "Channel", "Rank");
145
146 fprintf(fpLog, "%s,%s,%s,%s,%s,",
147 "Layer ID", "EIRP(dBW)", "PathLoss(dB)", "ShadowFadingLoss(dB)", "AdditonalLoss(dB)");
148
149 fprintf(fpLog, "%s,%s,%s,%s,%s,",
150 "ClutterLoss(dB)", "TotalLoss(dB)", "BeamFormingGain(dB)", "Angular Antenna Gain(dB)", "UE Rx Antenna Gain(dB)");
151
152 fprintf(fpLog, "%s,%s,%s,%s,",
153 "Rx_Power(dBm)", "SNR(dB)", "SINR(dB)", "ThermalNoise(dBm)");
154
155 fprintf(fpLog, "%s,%s,%s,\n",
156 "InterferencePower(dBm)", "CQI Index", "MCS Index");
157}
158
159void NTNRadioMeasurementLog(ptrLTENR_GNBPHY phy, int CA_ID, ptrLTENR_ASSOCIATEDUEPHYINFO info)
160{
161 if (fpLog == NULL) return;
162
163 UINT layerCount;
164 ptrLTENR_PROPAGATIONINFO pinfo = info->propagationInfo[CA_ID];
165 ptrLTENR_PROPAGATIONCONFIG propagation = pinfo->propagationConfig;
166
167 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(pinfo->ueId, pinfo->ueIf);
168 ptrLTENR_ASSOCIATEDUEPHYINFO assocInfo = LTENR_ASSOCIATEDUEPHYINFO_GET(pinfo->gnbId, pinfo->gnbIf, pinfo->ueId, pinfo->ueIf);
169
170 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
171 int frChannelId = getBeamChannelId(pinfo->selectedBeamId);
172
173 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
174
175 if (!assocInfo->isAssociated || ca->configSlotType == SLOT_UPLINK) return;
176
177 layerCount = pinfo->downlink.layerCount;
178
179 for (UINT layerId = 0; layerId < layerCount; layerId++)
180 {
181
182 fprintf(fpLog, "%.2lf,%s,%s,%.3lf,",
183 ldEventTime / MILLISECOND,
184 DEVICE_NAME(pinfo->gnbId),
185 DEVICE_NAME(pinfo->ueId),
186 pinfo->slantHeight / 1000);
187
188 fprintf(fpLog, "%.2lf,%d,%s,%d,",
189 RadiansToDegrees(pinfo->elevationAngle_rad),
190 CA_ID + 1,
191 ca->operatingBand,
192 frChannelId);
193
194 fprintf(fpLog, "%d,%d,%.2lf,%.2lf,%.2lf,",
195 pinfo->downlink.layerCount,
196 layerId + 1,
197 ntnInfo->eirp_dBW,
198 pinfo->dPathLoss,
199 pinfo->dShadowFadingLoss);
200
201 fprintf(fpLog, "%.2lf,%.2lf,%.2lf,",
202 pinfo->dAdditionalLoss,
203 pinfo->dClutterLoss,
204 pinfo->dTotalLoss);
205
206 if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING)
207 fprintf(fpLog, "%lf,",pinfo->downlink.beamFormingGain[layerId]);
208 else
209 fprintf(fpLog, "%s,", "N/A");
210
211 fprintf(fpLog, "%.2lf,%.2lf,",
212 pinfo->angularAntennaGain_dB,
213 uePhy->ueRxAntennaGain);
214
215 fprintf(fpLog, "%.2lf,%.2lf,%.2lf,%.2lf,",
216 pinfo->downlink.rxPower_dbm[layerId],
217 pinfo->downlink.SNR_db[layerId],
218 pinfo->downlink.SINR_db[layerId],
219 pinfo->downlink.thermalNoise);
220
221 fprintf(fpLog, "%.2lf,%d,%d\n",
222 pinfo->downlink.InterferencePower_dbm[layerId],
223 info->downlinkAMCInfo[CA_ID][layerId]->cqiTable.CQIIndex,
224 info->downlinkAMCInfo[CA_ID][layerId]->mcsTable.mcsIndex);
225 }
226 if (nDbgFlag) fflush(fpLog);
227}