1#include "NTN_PropagationModel.h"
4#define DegreesToRadians(degree) ((degree) * (M_PI / 180.0))
5#define RadiansToDegrees(radian) ((radian) * (180.0 / M_PI))
7static FILE* fpRMlog = NULL;
8static FILE* fpLog = NULL;
11void initNTN_UeAssociationLogs() {
13 if (!get_protocol_log_status(
"NTN_UE_Beam_Association"))
17 sprintf(s,
"%s\\%s", pszIOLogPath,
"NTN_UE_Beam_Association.csv");
18 fpRMlog = fopen(s,
"w");
21 fnSystemError(
"Unable to open %s file", s);
25 fprintf(fpRMlog,
"%s,%s,%s,%s,",
26 "Time(ms)",
"Ue Name",
"UeX(m)",
"UeY(m)");
28 fprintf(fpRMlog,
"%s,%s,%s,%s,%s,",
29 "Elevation Angle(°)",
"Slant height(Km)",
"Theta(°)",
"EIRP(dBW)",
"PathLoss(dB)");
31 fprintf(fpRMlog,
"%s,%s,%s,%s,",
32 "ShadowLoss(dB)",
"Additional Loss(dB)",
"Clutter Loss(dB)",
"Angular Antenna Gain(dB)");
34 fprintf(fpRMlog,
"%s,%s,",
35 "UE Rx Antenna Gain(dB)",
"CIR(dB)");
37 fprintf(fpRMlog,
"%s,%s,%s,%s,",
38 "TotalLoss(dB)",
"Noise(dBm)",
"Rx Power(dBm)",
"FR Channel Id");
40 fprintf(fpRMlog,
"%s,%s,%s,%s,",
41 "Channel Bandwidth(MHz)",
"Interference Power(dBm)",
"Guard Band BW(MHz)",
"SNR(dB)");
43 fprintf(fpRMlog,
"%s,%s,%s,%s,%s,\n",
44 "SINR(dB)",
"Current Beam Id",
"CQI",
"MCS Index",
"Associated Beam");
48void NTN_plotUeAssociation(ptrLTENR_PROPAGATIONINFO propInfo,
int CA_ID, UINT layerId,
bool isSelected) {
50 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
51 ptrLTENR_UEPHY uePhy = LTENR_UEPHY_GET(propInfo->ueId, propInfo->ueIf);
52 int frChannelId = getBeamChannelId(propInfo->selectedBeamId);
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];
58 if (assocInfo->isAssociated && ca->configSlotType == SLOT_UPLINK)
return;
62 NETSIM_ID ueId = propInfo->ueId;
64 fprintf(fpRMlog,
"%lf,%s,%.2lf,%.2lf,",
65 ldEventTime / MILLISECOND, DEVICE_NAME(ueId),
66 DEVICE_POSITION(ueId)->X, DEVICE_POSITION(ueId)->Y);
68 fprintf(fpRMlog,
"%.2lf,%.3lf,%.2lf,",
69 RadiansToDegrees(propInfo->elevationAngle_rad),
70 propInfo->slantHeight/1000 ,
71 RadiansToDegrees(propInfo->theta_rad));
73 fprintf(fpRMlog,
"%.2lf,%.2lf,%.2lf,",
76 propInfo->dShadowFadingLoss);
78 fprintf(fpRMlog,
"%.2lf,%.2lf,%.2lf,%.2lf,",
79 propInfo->dAdditionalLoss,
80 propInfo->dClutterLoss,
81 propInfo->angularAntennaGain_dB,
82 uePhy->ueRxAntennaGain);
84 if (ntnInfo->interferenceModel == NTN_CIR)
85 fprintf(fpRMlog,
"%.2lf,", ntnInfo->carrier_InterferenceRatio);
87 fprintf(fpRMlog,
"N/A,");
89 fprintf(fpRMlog,
"%.2lf,%.2lf,%.2lf,",
91 propInfo->downlink.thermalNoise,
92 propInfo->downlink.rxPower_dbm[layerId]);
94 fprintf(fpRMlog,
"%d,%.2lf,%.2lf,%.2lf,",
96 ntnInfo->channelBandwidth,
97 propInfo->downlink.InterferencePower_dbm[layerId],
98 ntnInfo->guardBand_MHz);
100 fprintf(fpRMlog,
"%.2lf,%.2lf,%u,",
101 propInfo->downlink.SNR_db[layerId],
102 propInfo->downlink.SINR_db[layerId],
103 propInfo->selectedBeamId);
106 if (assocInfo->downlinkAMCInfo[CA_ID])
108 fprintf(fpRMlog,
"%d,%u,",
109 assocInfo->downlinkAMCInfo[CA_ID][layerId]->cqiTable.CQIIndex,
110 assocInfo->downlinkAMCInfo[CA_ID][layerId]->mcsTable.mcsIndex);
113 fprintf(fpRMlog,
"NA,NA,");
117 fprintf(fpRMlog,
"true,");
120 fprintf(fpRMlog,
"\n");
126void initNTNRadioMeasurementLogs() {
128 if (!get_protocol_log_status(
"NTN_Radio_Measurement_Logs"))
132 sprintf(s,
"%s\\%s", pszIOLogPath,
"NTN_Radio_Measurement_Logs.csv");
133 fpLog = fopen(s,
"w");
136 fnSystemError(
"Unable to open %s file", s);
140 fprintf(fpLog,
"%s,%s,%s,%s,",
141 "Time(ms)",
"gNB or eNB Name",
"UE Name",
"Slant height(Km)");
143 fprintf(fpLog,
"%s,%s,%s,%s,%s,",
144 "Elevation Angle(°)",
"CC_ID",
"Band",
"Channel",
"Rank");
146 fprintf(fpLog,
"%s,%s,%s,%s,%s,",
147 "Layer ID",
"EIRP(dBW)",
"PathLoss(dB)",
"ShadowFadingLoss(dB)",
"AdditonalLoss(dB)");
149 fprintf(fpLog,
"%s,%s,%s,%s,%s,",
150 "ClutterLoss(dB)",
"TotalLoss(dB)",
"BeamFormingGain(dB)",
"Angular Antenna Gain(dB)",
"UE Rx Antenna Gain(dB)");
152 fprintf(fpLog,
"%s,%s,%s,%s,",
153 "Rx_Power(dBm)",
"SNR(dB)",
"SINR(dB)",
"ThermalNoise(dBm)");
155 fprintf(fpLog,
"%s,%s,%s,\n",
156 "InterferencePower(dBm)",
"CQI Index",
"MCS Index");
159void NTNRadioMeasurementLog(ptrLTENR_GNBPHY phy,
int CA_ID, ptrLTENR_ASSOCIATEDUEPHYINFO info)
161 if (fpLog == NULL)
return;
164 ptrLTENR_PROPAGATIONINFO pinfo = info->propagationInfo[CA_ID];
165 ptrLTENR_PROPAGATIONCONFIG propagation = pinfo->propagationConfig;
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);
170 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
171 int frChannelId = getBeamChannelId(pinfo->selectedBeamId);
173 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
175 if (!assocInfo->isAssociated || ca->configSlotType == SLOT_UPLINK)
return;
177 layerCount = pinfo->downlink.layerCount;
179 for (UINT layerId = 0; layerId < layerCount; layerId++)
182 fprintf(fpLog,
"%.2lf,%s,%s,%.3lf,",
183 ldEventTime / MILLISECOND,
184 DEVICE_NAME(pinfo->gnbId),
185 DEVICE_NAME(pinfo->ueId),
186 pinfo->slantHeight / 1000);
188 fprintf(fpLog,
"%.2lf,%d,%s,%d,",
189 RadiansToDegrees(pinfo->elevationAngle_rad),
194 fprintf(fpLog,
"%d,%d,%.2lf,%.2lf,%.2lf,",
195 pinfo->downlink.layerCount,
199 pinfo->dShadowFadingLoss);
201 fprintf(fpLog,
"%.2lf,%.2lf,%.2lf,",
202 pinfo->dAdditionalLoss,
206 if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING)
207 fprintf(fpLog,
"%lf,",pinfo->downlink.beamFormingGain[layerId]);
209 fprintf(fpLog,
"%s,",
"N/A");
211 fprintf(fpLog,
"%.2lf,%.2lf,",
212 pinfo->angularAntennaGain_dB,
213 uePhy->ueRxAntennaGain);
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);
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);
226 if (nDbgFlag) fflush(fpLog);