24#pragma region HEADER_FILES
27#include "LTENR_AntennaModel.h"
30#define MAX_FASTFADING_ENTRY 50000
33 char fileName[BUFSIZ];
41}LTENR_FASTFADINGHANDLE, * ptrLTENR_FASTFADINGHANDLE;
42static ptrLTENR_FASTFADINGHANDLE* fastFadingHandles = NULL;
43static UINT fastFadingHandleCount = 0;
45static ptrLTENR_FASTFADINGHANDLE fastfading_find_handle(UINT txAntennaCount, UINT rxAntennaCount)
47 if (fastFadingHandleCount == 0)
return NULL;
48 for (UINT i = 0; i < fastFadingHandleCount; i++)
50 if ((fastFadingHandles[i]->txAntennaCount == 0 || fastFadingHandles[i]->txAntennaCount == txAntennaCount) &&
51 (fastFadingHandles[i]->rxAntennaCount == 0 || fastFadingHandles[i]->rxAntennaCount == rxAntennaCount))
52 return fastFadingHandles[i];
57static bool read_fastfading_file(ptrLTENR_FASTFADINGHANDLE handle, UINT layerCount)
59 handle->file = fopen(handle->fileName,
"r");
62 fnSystemError(
"Unable to open %s file.", handle->fileName);
63 perror(handle->fileName);
68 while (fgets(s, 5000, handle->file))
71 for (UINT i = 0; i < layerCount; i++)
73 if (handle->entries[i])
74 handle->entries[i] = realloc(handle->entries[i], ((
size_t)handle->entryCount + 1) * (
sizeof * handle->entries[i]));
76 handle->entries[i] = calloc(1,
sizeof * handle->entries[i]);
78 if (i == 0) t = strtok(s,
",");
79 else t = strtok(NULL,
",");
80 handle->entries[i][handle->entryCount] = atof(t);
88static bool fastfading_open_handle(ptrLTENR_FASTFADINGHANDLE handle)
90 sprintf(handle->fileName,
"%s/5GBeamforming/%d_%d.beamforming",
92 handle->txAntennaCount,
93 handle->rxAntennaCount);
95 UINT layerCount = min(handle->txAntennaCount, handle->rxAntennaCount);
96 handle->entries = calloc(layerCount,
sizeof * handle->entries);
98 if (read_fastfading_file(handle, layerCount))
104 free(handle->entries);
109static ptrLTENR_FASTFADINGHANDLE fastfading_init_handle(UINT txAntennaCount, UINT rxAntennaCount)
111 ptrLTENR_FASTFADINGHANDLE handle = fastfading_find_handle(txAntennaCount, rxAntennaCount);
112 if (handle)
return handle;
114 handle = calloc(1,
sizeof * handle);
115 handle->rxAntennaCount = rxAntennaCount;
116 handle->txAntennaCount = txAntennaCount;
118 if (fastfading_open_handle(handle))
120 if (fastFadingHandleCount == 0)
121 fastFadingHandles = calloc(1,
sizeof * fastFadingHandles);
123 fastFadingHandles = realloc(fastFadingHandles, ((
size_t)fastFadingHandleCount + 1) * (
sizeof * fastFadingHandles));
124 fastFadingHandles[fastFadingHandleCount] = handle;
125 fastFadingHandleCount++;
135double LTENR_BeamForming_GetValue(ptrLTENR_FASTFADINGHANDLE handle, UINT layerId, UINT* index)
137 double val = handle->entries[layerId][*index];
139 if (*index == handle->entryCount) *index = 0;
141 return 10*log10(val);
144static void LTENR_BeamFormingGain_Update(ptrLTENR_ASSOCIATEDUEPHYINFO info)
146 for (NETSIM_ID c = 0; c < MAX_CA_COUNT; c++)
148 ptrLTENR_PROPAGATIONINFO propagation = info->propagationInfo[c];
149 if (propagation && (propagation->propagationConfig->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING))
151 for (UINT l = 0; l < propagation->downlink.layerCount; l++)
153 propagation->downlink.beamFormingGain[l] = LTENR_BeamForming_GetValue(propagation->downlink.beamformingHandle,
155 &propagation->downlink.beamFormingIndex[l]);
158 for (UINT l = 0; l < propagation->uplink.layerCount; l++)
160 propagation->uplink.beamFormingGain[l] = LTENR_BeamForming_GetValue(propagation->uplink.beamformingHandle,
162 &propagation->uplink.beamFormingIndex[l]);
169void LTENR_BeamForming_HandleCoherenceTimer()
171 NETSIM_ID d = pstruEventDetails->nDeviceId;
172 NETSIM_ID in = pstruEventDetails->nInterfaceId;
173 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(d, in);
175 pstruEventDetails->dEventTime += phy->propagationConfig->
coherenceTime;
176 fnpAddEvent(pstruEventDetails);
177 pstruEventDetails->dEventTime -= phy->propagationConfig->
coherenceTime;
179 ptrLTENR_ASSOCIATEDUEPHYINFO info = phy->associatedUEPhyInfo;
182 LTENR_BeamFormingGain_Update(info);
183 LTENR_ASSOCIATEDUEPHYINFO_NEXT(info);
187void LTENR_BeamForming_InitCoherenceTimer(ptrLTENR_GNBPHY phy)
189 static bool isCalled =
false;
192 LTENR_SUBEVENT_REGISTER(LTENR_SUBEVENT_FASTFADING_COHERENCE_TIMER,
"FastFading_Coherence_Timer", LTENR_BeamForming_HandleCoherenceTimer);
196 ptrLTENR_PROPAGATIONCONFIG propagation = phy->propagationConfig;
197 if (propagation->fastFadingModel != LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING && propagation->fastFadingModel != LTENR_FASTFADING_MODEL_NO_FADING_MIMO_ARRAY_GAIN)
return;
199 NetSim_EVENTDETAILS pevent;
200 memset(&pevent, 0,
sizeof pevent);
201 pevent.nDeviceId = phy->gnbId;
202 pevent.nDeviceType = DEVICE_TYPE(phy->gnbId);
203 pevent.nEventType = TIMER_EVENT;
204 pevent.nInterfaceId = phy->gnbIf;
205 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(phy->gnbId,phy->gnbIf);
206 LTENR_SET_SUBEVENT(pd, &pevent, LTENR_SUBEVENT_FASTFADING_COHERENCE_TIMER);
207 fnpAddEvent(&pevent);
210static ptrLTENR_FASTFADINGHANDLE beamforming_init(UINT tx,UINT rx,UINT** ppindex,
double** ppgain)
212 ptrLTENR_FASTFADINGHANDLE handle = fastfading_init_handle(tx, rx);
213 UINT layer = min(tx, rx);
214 UINT* index = calloc(layer,
sizeof * index);
215 double* gain = calloc(layer,
sizeof * gain);
216 for (UINT i = 0; i < layer; i++)
218 index[i] = NETSIM_RAND_RN(handle->entryCount, 0);
219 gain[i] = LTENR_BeamForming_GetValue(handle, i, &index[i]);
227void LTENR_BeamForming_Init(ptrLTENR_PROPAGATIONINFO propagation)
229 propagation->downlink.beamformingHandle = beamforming_init(propagation->downlink.txAntennaCount,
230 propagation->downlink.rxAntennaCount,
231 &propagation->downlink.beamFormingIndex,
232 &propagation->downlink.beamFormingGain);
234 propagation->uplink.beamformingHandle = beamforming_init(propagation->uplink.txAntennaCount,
235 propagation->uplink.rxAntennaCount,
236 &propagation->uplink.beamFormingIndex,
237 &propagation->uplink.beamFormingGain);
double coherenceTime
For AWGN-RAYLEIGH/Rician Fading.