NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
PropagationModel.h
1#pragma once
2/************************************************************************************
3* Copyright (C) 2023 *
4* TETCOS, Bangalore. India *
5* *
6* Tetcos owns the intellectual property rights in the Product and its content. *
7* The copying, redistribution, reselling or publication of any or all of the *
8* Product or its content without express prior written consent of Tetcos is *
9* prohibited. Ownership and / or any other right relating to the software and all *
10* intellectual property rights therein shall remain at all times with Tetcos. *
11* *
12* Author: Shashi Kant Suman *
13* *
14* ---------------------------------------------------------------------------------*/
15
16#ifndef _NETSIM_PROPAGATION_MODEL_H_
17#define _NETSIM_PROPAGATION_MODEL_H_
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22#define NEGATIVE_DBM -1000.0
23#define ZERO_MW 1.0e-100
24#define MW_TO_DBM(mw) ((mw) <= ZERO_MW?NEGATIVE_DBM:10.0*log10(mw))
25#define DBM_TO_MW(dbm) ((dbm) == NEGATIVE_DBM? 0.0: pow(10.0,(dbm)/10.0))
26
27#define HZ (1.0)
28#define KHZ (1000.0*HZ)
29#define MHZ (1000.0*KHZ)
30#define GHZ (1000.0*MHZ)
31#define RANDOM_01 (double)rand()/(double)RAND_MAX;
32
33#ifndef MAC_LAYER_PROTOCOL
34#define MAC_LAYER_PROTOCOL int
35#endif
36#ifndef __CALLBACK__
37#define __CALLBACK__
38#endif
39
40#define PROPAGATION_PROPAGATION_MEDIUM_DEFAULT _strdup("AIR")
41#define PROPAGATION_CHANNEL_CHARACTERISTICS_DEFAULT _strdup("NO_PATHLOSS")
42#define PROPAGATION_PATHLOSS_MODEL_DEFAULT _strdup("Friis_Free_Space_propagation")
43#define PROPAGATION_FADING_MODEL_DEFAULT _strdup("NONE")
44#define PROPAGATION_SHADOWING_MODEL_DEFAULT _strdup("NONE")
45#define PROPAGATION_STANDARD_DEVIATION_DEFAULT 5.0
46#define PROPAGATION_PATHLOSS_EXPONENT_DEFAULT 2.0
47#define PROPAGATION_FADING_FIGURE_DEFAULT 1.0
48#define PROPAGATION_SHAPE_PARAMETER_DEFAULT 2.0
49#define PROPAGATION_OMEGA_DEFAULT 2.0
50#define PROPAGATION_THORP_SPREAD_COEFF_DEFAULT 2.0
51#define PROPAGATION_TEMPERATUREZONE_COUNT_DEFAULT 0
52#define PROPAGATION_Z_DEFAULT 0.0
53#define PROPAGATION_TEMPERATURE_DEFAULT 25.0 // in degree celcius
54#define PROPAGATION_SALINITY_DEFAULT 35
55#define PROPAGATION_WINDSPEED_DEFAULT 0 // In m/s
56#define PROPAGATION_SHIPPING_DEFAULT 0.5 // [0-1]
57
58 //Typedef's
59 typedef struct stru_propagation_info PROPAGATION_INFO, * PPROPAGATION_INFO;
60 typedef struct stru_recvpower RECV_POWER, * PRECV_POWER;
61
62 typedef bool (*fnCheckInterface)(NETSIM_ID nTxId,
63 NETSIM_ID nTxInterface,
64 NETSIM_ID nRxId,
65 NETSIM_ID nRxInterface);
66 typedef void(*fnUserPathlossModel)(PPROPAGATION_INFO pinfo,
67 PRECV_POWER p);
68
69 typedef enum
70 {
71 PROPAGATIONMODEL_NO_PATHLOSS,
72 PROPAGATIONMODEL_PATHLOSS_ONLY,
73 PROPAGATIONMODEL_PATHLOSS_AND_SHADOWING,
74 PROPAGATIONMODEL_PATHLOSS_AND_FADING_AND_SHADOWING,
75 }PROPAGATION_MODEL;
76
77 typedef enum
78 {
79 PATHLOSSMODEL_None,
80 PATHLOSSMODEL_Log_Distance,
81 PATHLOSSMODEL_Friis_Free_Space,
82 PATHLOSSMODEL_Cost_231_Hata_Urban,
83 PATHLOSSMODEL_Cost_231_Hata_SubUrban,
84 PATHLOSSMODEL_Hata_Urban,
85 PATHLOSSMODEL_Hata_SubUrban,
86 PATHLOSSMODEL_Indoor_Office,
87 PATHLOSSMODEL_Indoor_Home,
88 PATHLOSSMODEL_Indoor_Factory,
89 PATHLOSSMODEL_THORP,
90 PATHLOSSMODEL_TWO_RAY,
91 PATHLOSSMODEL_RANGE_BASED,
92 PATHLOSSMODEL_MATRIX_MODEL,
93 }PATHLOSS_MODEL;
94
95 typedef enum
96 {
97 FADINGMODEL_NONE,
98 FADINGMODEL_RICIAN,
99 FADINGMODEL_RAYLEIGH,
100 FADINGMODEL_NAKAGAMI,
101 FADINGMODEL_MARKOV_LOO,
102 }FADING_MODEL;
103
104 typedef enum
105 {
106 SHADOWMODEL_NONE,
107 SHADOWMODEL_CONSTANT,
108 SHADOWMODEL_LOGNORMAL,
109 }SHADOW_MODEL;
110
111 typedef enum
112 {
113 PROPMEDIUM_AIR,
114 PROPMEDIUM_ACOUSTICS,
115 }PROP_MEDIUM;
116
117 typedef enum
118 {
119 OMNIDIRECTIONAL_ANTENNA,
120 SECTOR_ANTENNA,
121 EXTERNAL_ANTENNA
122 }ANTENNA_TYPE;
123
124 typedef struct stru_pathloss_var
125 {
126 double pathLossExponent;
127 double d0;
128
129 //Throp Progation model
130 double spreadCoeff;
131
132 //Path loss matrix model
133 char* MatrixFile;
134
135 //Range Based model
136 double range;
137 }PATHLOSS_VAR, * PPATHLOSS_VAR;
138
139 /*
140 structure to store consineWaveOscillator
141*/
142 typedef struct stru_oscillator
143 {
144 double amplitude;
145 double phi;
146 double omega;
147 } OSCILLATOR, * ptrOSCILLATOR;
148
149 /*
150 structure to store complex number
151 */
152 typedef struct stru_complex
153 {
154 double real;
155 double img;
156 }_COMPLEX, * _ptrCOMPLEX;
157
158 /*
159 structure to store complexOscillator
160 */
162 {
163 _COMPLEX amplitude;
164 double phi;
165 double omega;
166 }COMPLEXOSCILLATOR, * ptrCOMPLEXOSCILLATOR;
167
168 typedef struct stru_state_looParam
169 {
170 UINT stateId;
171
172 double directSignalMean_dB;
173 double directSignalStdDeviation_dB;
174 double rmsMultiPathPower_dB;
175 UINT numMultipathOscillators;
176 UINT numDirectSignalOscillators;
177 UINT directSignalDopper_Hz;
178 UINT multipathDoppler_Hz;
179
180 double initialProbability;
181
182 ptrOSCILLATOR directSignalOscillators;
183 ptrCOMPLEXOSCILLATOR multipathOscillators;
184 double sigma;
185 }LOOPARAMS, * ptrLOOPARAMS;
186
187 typedef struct stru_elevation
188 {
189 UINT elevationId;
190 UINT stateCount;
191 ptrLOOPARAMS* looParams;
192
193 double** stateTransitionProbability; // [from state i][to state j]
194
195 UINT activeStateId;
196 }ELEVATION, * ptrELEVATION;
197
199 {
200 UINT elevationCount;
201 ptrELEVATION* elevationPrams;
202
203 UINT activeElevationId;
204 }MARKOVLOO_VAR, * ptrMARLOVLOO_VAR;
205
206 typedef struct stru_fading_var
207 {
208 double coolOffPeriod;
209
210 //Nakagami parameter
211 double shape_parameter; // Range: 0.5-9, default 2
212 double omega; // Range: 0.25-27, default 2
213
214 //Markov parameter
215 ptrMARLOVLOO_VAR markovLooVar;
216 }FADING_VAR, * PFADING_VAR;
217
218 typedef struct stru_shadowloss_var
219 {
220 double standardDeviation;
221 bool iSet;
222 double Gset;
223 }SHADOW_VAR, * PSHADOW_VAR;
224
226 {
227 double lDepth;
228 double hDepth;
229 double avgDepth;
230 double depth;
231 double temperature; // in degree celsius
232 }TEMPERATUREZONE, * ptrTEMPERATUREZONE;
233
235 {
236 double dWindSpeed; // In m/s
237 double dShipping; // [0,1]
238 double dSalinity;
239 UINT temperatureZoneCount;
240 ptrTEMPERATUREZONE tempratureZone;
241 }ACOUTICSPROPVAR, * ptrACOUTICSPROPVAR;
242
244 {
245 PROP_MEDIUM propMedium;
246
247 PROPAGATION_MODEL model;
248
249 PATHLOSS_MODEL pathloss_model;
250 PATHLOSS_VAR pathlossVar;
251
252 FADING_MODEL fading_model;
253 FADING_VAR fadingVar;
254
255 SHADOW_MODEL shadow_model;
256 SHADOW_VAR shadowVar;
257
258 ptrACOUTICSPROPVAR acouticsPropVar;
259 }PROPAGATION, * PPROPAGATION;
260
262 {
263 double time;
264 double dRxPower_mw; // without fading loss
265 double dRxPower_dbm; // without fading loss
266
267 double dPathloss_db;
268 double dShadowLoss_db;
269 double dFadingLoss_db;
270 struct stru_recvpower* next;
271 };
272
274 {
275 double Phi;
276 double AntennaGain;
277
278 } External_Antenna_Gain, * ptrExternal_Antenna_Gain;
279
280 typedef struct stru_tx_info
281 {
282 double dCentralFrequency; // In mHz
283 double dChannelBandwidth; // In mHz
284 double dTxPower_mw;
285 double dTxPower_dbm;
286
287 double dTxGain; // In dBi
288 double dRxGain; // In dBi
289 double dTx_Rx_Distance; // In m
290 double dTxAntennaHeight; // In m
291 double dRxAntennaHeight; //In m
292
293 double d0; // In m
294
295 bool isExternalGainTableRead;
296 // Tx Sector Antenna Gain Parameters
297 ANTENNA_TYPE Tx_AntennaType;
298 double dTx_BoresightAngle;
299 double dTx_FrontToBackRatio;
300 double dTx_ElementGain;
301 double dTx_Beamwidth;
302 char Tx_AntennaPatternFileName[BUFSIZ];
303 ptrExternal_Antenna_Gain Tx_AntennaGainTable;
304 UINT Tx_AntennaGainTableSize;
305
306 // Rx Sector Antenna Gain Parameters
307 ANTENNA_TYPE Rx_AntennaType;
308 double dRx_BoresightAngle;
309 double dRx_FrontToBackRatio;
310 double dRx_ElementGain;
311 double dRx_Beamwidth;
312 char Rx_AntennaPatternFileName[BUFSIZ];
313 ptrExternal_Antenna_Gain Rx_AntennaGainTable;
314 UINT Rx_AntennaGainTableSize;
315
316 // Tx Rx Positions
317 double Tx_X;
318 double Tx_Y;
319 double Tx_Z;
320
321 double Rx_X;
322 double Rx_Y;
323 double Rx_Z;
324 }TX_INFO, * PTX_INFO;
325
327 {
328 NETSIM_ID nTxId;
329 NETSIM_ID nTxInterface;
330 NETSIM_ID nRxId;
331 NETSIM_ID nRxInterface;
332 char* uniqueId;
333
334 TX_INFO txInfo;
335
336 PRECV_POWER recvPower;
337
338 PROPAGATION propagation;
339
340 fnCheckInterface fnpCheckInterface; /* Function pointer to check whether
341 * two device is interfering with each other or not
342 */
343 };
344
345 typedef void* PROPAGATION_HANDLE;
346
347 typedef void(*fnGetTxInfo)(NETSIM_ID nTxId,
348 NETSIM_ID nTxInterface,
349 NETSIM_ID nRxId,
350 NETSIM_ID nRxInterface,
351 PTX_INFO Txinfo);
352 typedef bool(*check_protocol_configure)(NETSIM_ID d,
353 NETSIM_ID i);
354
355 //Initialize the propagation module
356 _declspec(deprecated("This function is deprecated. Use propagation_create_propagation_info."))
357 _declspec(dllexport) PROPAGATION_HANDLE propagation_init(MAC_LAYER_PROTOCOL protocol,
358 __CALLBACK__ check_protocol_configure check,
359 __CALLBACK__ fnGetTxInfo fnpGetTxInfo,
360 __CALLBACK__ fnCheckInterface checkInterference);
361
362 //Init the custom propagation info
363 _declspec(dllexport) PPROPAGATION_INFO propagation_create_propagation_info(NETSIM_ID txId, NETSIM_ID txIf,
364 NETSIM_ID rxId, NETSIM_ID rxIf,
365 char* uniqueId, PTX_INFO txInfo,
366 PPROPAGATION propagation);
367
368 //Free the propagation module
369 _declspec(dllexport) void propagation_finish(PROPAGATION_HANDLE handle);
370
371 //APIs to get radio measurment parameters
372 _declspec(dllexport) double propagation_get_Pathloss(PPROPAGATION_INFO info, double time);
373 _declspec(dllexport) double propagation_get_Shadowloss(PPROPAGATION_INFO info, double time);
374 _declspec(dllexport) double propagation_get_Fadingloss(PPROPAGATION_INFO info, double time);
375 _declspec(dllexport) double propagation_get_Totalloss(PPROPAGATION_INFO info, double time);
376
377 //Calculate the received power due to path loss and shadow
378 _declspec(dllexport) void _propagation_calculate_received_power(PPROPAGATION_INFO info, double time);
379#define propagation_calculate_received_power(h,t,ti,r,ri,time) __pragma(message(__LOC__"propagation_calculate_received_power function is deprcated. Use _propagation_calculate_received_power")) _propagation_calculate_received_power(get_propagation_info(h,t,ti,r,ri),time)
380
381 //Calculate the log normal shadow loss
382 _declspec(dllexport) void propagation_calculate_lognormalshadow(PPROPAGATION_INFO pinfo,
383 PRECV_POWER p);
384
385 _declspec(dllexport) double _propagation_calculate_lognormalshadow(double standardDeviation,
386 double* Gset, bool* iSet);
387
388 //Calculate the log distance path loss
389 _declspec(dllexport) void propagation_calculate_logdistancepathloss(PPROPAGATION_INFO pinfo,
390 PRECV_POWER p);
391
392 _declspec(dllexport) double _propagation_calculate_logdistancepathloss(double pathLossExponent,
393 double dTx_Rx_Distance, double dCentralFrequency, double d0);
394
395 //Calculate cost 231 hata path loss. Common for urban and suburban with only cm value changes
396 _declspec(dllexport) void propagation_calculate_cost231hata(PPROPAGATION_INFO pinfo,
397 PRECV_POWER p,
398 double cm);
399
400 //Calculate hata suburban path loss.
401 _declspec(dllexport) void propagation_calculate_hata_Suburban(PPROPAGATION_INFO pinfo,
402 PRECV_POWER p);
403 //Calculate Two Ray path loss
404 _declspec(dllexport) void propagation_calculate_Two_Ray(PPROPAGATION_INFO pinfo,
405 PRECV_POWER p);
406 //Calculate Range Based path loss
407 _declspec(dllexport) void propagation_calculate_Range_Based(PPROPAGATION_INFO pinfo,
408 PRECV_POWER p);
409 //Calculate Matrix Model
410 _declspec(dllexport) void propagation_calculate_Matrix_Model(PPROPAGATION_INFO pinfo);
411
412 void add_new_recv_power(PPROPAGATION_INFO info, double time, double loss);
413
414 //Calculate hata urban path loss.
415 _declspec(dllexport) void propagation_calculate_hata_urban(PPROPAGATION_INFO pinfo,
416 PRECV_POWER p);
417 //Calculate the deterministic shadow loss
418 _declspec(dllexport) void propagation_calculate_deterministicshadow(PPROPAGATION_INFO pinfo,
419 PRECV_POWER p);
420
421 //Calculate the Thorp path loss
422 _declspec(dllexport) void propagation_calculate_thorpPathLoss(PPROPAGATION_INFO pinfo,
423 PRECV_POWER p);
424
425 _declspec(deprecated("get_propagation_info is deprected."))
426 _declspec(dllexport) PPROPAGATION_INFO get_propagation_info(PROPAGATION_HANDLE handle,
427 NETSIM_ID txid,
428 NETSIM_ID txif,
429 NETSIM_ID rxid,
430 NETSIM_ID rxif);
431
432 /// Used to get the transmitter info. will be used by user code to change the transmitter information at run time.
433 _declspec(dllexport) PTX_INFO _get_tx_info(PPROPAGATION_INFO info);
434#define get_tx_info(h,t,ti,r,ri) __pragma(message(__LOC__"get_tx_info function is deprcated. Use _get_tx_info")) _get_tx_info(get_propagation_info(h,t,ti,r,ri))
435
436 ///Used to the received power in dBm over time.
437 _declspec(dllexport) double _propagation_get_received_power_dbm(PPROPAGATION_INFO info, double time);
438#define propagation_get_received_power_dbm(h,t,ti,r,ri,time) __pragma(message(__LOC__"propagation_get_received_power_dbm function is deprcated. Use _propagation_get_received_power_dbm")) _propagation_get_received_power_dbm(get_propagation_info(h,t,ti,r,ri),time)
439
440 /// Used to calculate the fading loss. Fading model and parameter must be set in PROPAGATION structure within info.
441 _declspec(dllexport) double _propagation_calculate_fadingloss(PPROPAGATION_INFO info);
442#define propagation_calculate_fadingloss(h,t,ti,r,ri) __pragma(message(__LOC__"propagation_calculate_fadingloss function is deprcated. Use _propagation_calculate_fadingloss")) _propagation_calculate_fadingloss(get_propagation_info(h,t,ti,r,ri))
443
444 //Propagation delay
445 _declspec(dllexport) double propagation_air_calculate_propagationDelay(NETSIM_ID tx,
446 NETSIM_ID rx,
447 PPROPAGATION propagation);
448
449 _declspec(dllexport) double propagation_acoutics_calculate_propagationDelay(NETSIM_ID tx,
450 NETSIM_ID rx,
451 PPROPAGATION propagation);
452
453 //Noise
454 _declspec(dllexport) double propagation_acoutics_calculate_noise(double frequency_kHz,
455 double shipping,
456 double windSpeed);
457
458 //Loo fading
459 void initLoo(ptrMARLOVLOO_VAR markovLooVar);
460 double calculateLooFadingDB(PPROPAGATION_INFO info);
461
462 //Config reader
463 _declspec(dllexport) int fn_NetSim_xmlConfigureWirelessMedium(void* xmlNetSimNode,
464 struct stru_NetSim_Links* pstruLink);
465
466 typedef void(*fnConfigureWirelessMedium)(void* xmlNetSimNode,
467 struct stru_NetSim_Links* pstruLink);
468 // Update Antenna Gain
469 static void _propagation_update_antenna_gain(PPROPAGATION_INFO info);
470
471 // DTDMA extrnal Antenna Gain
472 void read_antenna_pattern_file(PPROPAGATION_INFO info);
473 void read_external_antenna_pattern_file(
474 const char* filename,
475 ptrExternal_Antenna_Gain* gainTable,
476 UINT* gainTableSize);
477
478#ifndef _PROPAGATIONMODEL_
479#pragma deprecated(PROPAGATION_HANDLE)
480#endif
481
482#ifdef __cplusplus
483}
484#endif
485#endif //_NETSIM_PROPAGATION_MODEL_H_