1#include "NTN_PropagationModel.h"
2#include "LTENR_PropagationModel.h"
3#include "NTN_PropagationUtils.h"
6#define BOLTZMANN 1.38064852e-23
9void updateNoisePower(ptrLTENR_PROPAGATIONINFO propInfo)
11 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
12 double noise = BOLTZMANN * TEMPERATURE * ntnInfo->channelBandwidth * 1000000;
14 propInfo->downlink.thermalNoise = MW_TO_DBM(noise);
17double calculate_sinr(
double dReceivedPower_dbm,
double interferencePower_dBm,
double bandwidth_mHz)
19 double noise = BOLTZMANN * TEMPERATURE * bandwidth_mHz * 1000000;
20 double Pmw = DBM_TO_MW(dReceivedPower_dbm);
21 double Imw = DBM_TO_MW(interferencePower_dBm);
23 return MW_TO_DBM(Pmw / (Imw + noise));
26double NTNget_LOS_probability(NTN_SCENARIO scenario,
double elevationAngle)
28 const int TABLE_SIZE = 9;
30 elevationAngle = quantizeElevationAngle(elevationAngle);
31 NTN_LOS_ElevationAngleTable* table;
35 case NTN_SCENARIO_DENSE_URBAN:
36 table = denseUrbanScenario;
38 case NTN_SCENARIO_URBAN:
39 table = urbanScenario;
41 case NTN_SCENARIO_RURAL:
42 table = ruralScenario;
45 fprintf(stderr,
"Unknown scenario type");
50 for (
int i = 0; i < TABLE_SIZE; i++)
52 if (table[i].elevationAngle == elevationAngle) {
53 return table[i].LOS_probability;
56 fprintf(stderr,
"Elevation angle entry not found in the los probability table");
60double get_shadowingSD(NTN_SCENARIO scenario, NTN_LOS_NLOS_STATE state, NTN_CARRIER_BAND band,
double elevationAngle)
62 NTN_ShadowingSD_ElevationAngleTable* table;
63 const int TABLE_SIZE = 9;
65 elevationAngle = quantizeElevationAngle(elevationAngle);
68 if (scenario == NTN_SCENARIO_DENSE_URBAN)
70 table = (band == NTN_BAND_S) ? sBandShadowingSD_DenseUrban : kaBandShadowingSD_DenseUrban;
72 else if (scenario == NTN_SCENARIO_URBAN)
74 table = (band == NTN_BAND_S) ? sBandShadowingSD_Urban : kaBandShadowingSD_Urban;
76 else if (scenario == NTN_SCENARIO_RURAL)
78 table = (band == NTN_BAND_S) ? sBandShadowingSD_Rural : kaBandShadowingSD_Rural;
84 fprintf(stderr,
"Unknown NTN scenario for shadowing SD calculations\n");
88 for (
int i = 0; i < TABLE_SIZE; i++) {
89 if (table[i].elevationAngle == elevationAngle) {
91 return (state == NTN_STATE_LOS) ? table[i].standardDeviation_LOS : table[i].standardDeviation_NLOS;
95 fprintf(stderr,
"Nearest elevation angle not found for shadowing SD calculations");
99double get_clutterloss(NTN_SCENARIO scenario, NTN_LOS_NLOS_STATE state, NTN_CARRIER_BAND band,
double elevationAngle)
101 NTN_ShadowingSD_ElevationAngleTable* table;
102 const int TABLE_SIZE = 9;
104 elevationAngle = quantizeElevationAngle(elevationAngle);
106 if (scenario == NTN_SCENARIO_DENSE_URBAN)
108 table = (band == NTN_BAND_S) ? sBandShadowingSD_DenseUrban : kaBandShadowingSD_DenseUrban;
110 else if (scenario == NTN_SCENARIO_URBAN)
112 table = (band == NTN_BAND_S) ? sBandShadowingSD_Urban : kaBandShadowingSD_Urban;
114 else if (scenario == NTN_SCENARIO_RURAL)
116 table = (band == NTN_BAND_S) ? sBandShadowingSD_Rural : kaBandShadowingSD_Rural;
122 fprintf(stderr,
"Unknown NTN scenario for clutter loss calculations\n");
126 for (
int i = 0; i < TABLE_SIZE; i++) {
127 if (table[i].elevationAngle == elevationAngle) {
129 return (state == NTN_STATE_LOS) ? 0 : table[i].clutterLoss_dB;
133 fprintf(stderr,
"Nearest elevation angle not found for clutter loss calculations");
137double quantizeElevationAngle(
double elevAngle) {
139 double elevAngleQuantized;
141 elevAngleQuantized = elevAngle <= 10 ? 10 : round(elevAngle / 10.0) * 10;
142 return elevAngleQuantized;
145int countDistinctBeamChannels(BeamNode* head) {
147 int seen[20] = { 0 };
149 BeamNode* temp = head;
151 while (temp != NULL) {
153 if (!seen[temp->beamChannelId])
155 seen[temp->beamChannelId] = 1;