Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: PHYS
Views: 3032
1
"""author: Ramon Fontes ([email protected])
2
3
Implemented propagation models:
4
(Indoors):
5
Free-Space Propagation Model
6
Log-Distance Propagation Model
7
International Telecommunication Union (ITU) Propagation Model
8
(Outdoors):
9
Two-Ray-Ground Propagation Model"""
10
11
import math
12
from random import gauss
13
from time import sleep
14
15
16
class propagationModel(object):
17
"Propagation Models"
18
19
rssi = -62
20
model = ''
21
exp = 3 # Exponent
22
sL = 1 # System Loss
23
lF = 0 # Floor penetration loss factor
24
pL = 0 # Power Loss Coefficient
25
nFloors = 0 # Number of floors
26
gRandom = 0 # Gaussian random variable
27
variance = 2 # variance
28
noise_threshold = -91
29
cca_threshold = -90
30
31
def __init__(self, node1=None, node2=None, dist=0, wlan=0):
32
if self.model in dir(self):
33
self.__getattribute__(self.model)(node1=node1, node2=node2,
34
dist=dist, wlan=wlan)
35
36
@classmethod
37
def setAttr(cls, **kwargs):
38
cls.model = 'logDistance'
39
if 'model' in kwargs:
40
cls.model = kwargs['model']
41
if 'exp' in kwargs:
42
cls.exp = kwargs['exp']
43
if 'sL' in kwargs:
44
cls.sL = kwargs['sL']
45
if 'lF' in kwargs:
46
cls.lF = kwargs['lF']
47
if 'pL' in kwargs:
48
cls.pL = kwargs['pL']
49
if 'nFloors' in kwargs:
50
cls.nFloors = kwargs['nFloors']
51
if 'variance' in kwargs:
52
cls.variance = kwargs['variance']
53
if 'noise_threshold' in kwargs:
54
cls.noise_threshold = kwargs['noise_threshold']
55
if 'cca_threshold' in kwargs:
56
cls.cca_threshold = kwargs['cca_threshold']
57
58
def pathLoss(self, node1, dist, wlan):
59
"""Path Loss Model:
60
(f) signal frequency transmited(Hz)
61
(d) is the distance between the transmitter and the receiver (m)
62
(c) speed of light in vacuum (m)
63
(L) System loss"""
64
f = node1.params['frequency'][wlan] * 10 ** 9 # Convert Ghz to Hz
65
c = 299792458.0
66
L = self.sL
67
68
if dist == 0:
69
dist = 0.1
70
71
lambda_ = c / f # lambda: wavelength (m)
72
denominator = lambda_ ** 2
73
numerator = (4 * math.pi * dist) ** 2 * L
74
pl = 10 * math.log10(numerator / denominator)
75
76
return int(pl)
77
78
def friis(self, **kwargs):
79
"""Friis Propagation Loss Model:
80
(f) signal frequency transmited(Hz)
81
(d) is the distance between the transmitter and the receiver (m)
82
(c) speed of light in vacuum (m)
83
(L) System loss"""
84
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
85
pt = kwargs['node2'].params['txpower'][0]
86
gt = kwargs['node2'].params['antennaGain'][0]
87
d = kwargs['dist']
88
gains = pt + gt + gr
89
90
pl = self.pathLoss(kwargs['node1'], d, kwargs['wlan'])
91
self.rssi = gains - pl
92
93
return self.rssi
94
95
def twoRayGround(self, **kwargs):
96
"""Two Ray Ground Propagation Loss Model (does not give a good result for
97
a short distance)"""
98
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
99
hr = kwargs['node1'].params['antennaHeight'][kwargs['wlan']]
100
pt = kwargs['node2'].params['txpower'][0]
101
gt = kwargs['node2'].params['antennaGain'][0]
102
ht = kwargs['node2'].params['antennaHeight'][0]
103
gains = pt + gt + gr
104
105
d = kwargs['dist']
106
if kwargs['dist'] == 0:
107
d = 0.1
108
L = self.sL
109
110
pldb = (pt * gt * gr * ht ** 2 * hr ** 2) / (d ** 4 * L)
111
self.rssi = gains - int(pldb)
112
113
return self.rssi
114
115
def logDistance(self, **kwargs):
116
"""Log Distance Propagation Loss Model:
117
ref_d (m): The distance at which the reference loss is
118
calculated
119
exponent: The exponent of the Path Loss propagation model, where 2
120
is for propagation in free space
121
(dist) is the distance between the transmitter and the receiver (m)"""
122
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
123
pt = kwargs['node2'].params['txpower'][0]
124
gt = kwargs['node2'].params['antennaGain'][0]
125
gains = pt + gt + gr
126
ref_d = 1
127
128
pl = self.pathLoss(kwargs['node1'], ref_d, kwargs['wlan'])
129
130
d = kwargs['dist']
131
if kwargs['dist'] == 0:
132
d = 0.1
133
134
pldb = 10 * self.exp * math.log10(d / ref_d)
135
self.rssi = gains - (int(pl) + int(pldb))
136
137
return self.rssi
138
139
def logNormalShadowing(self, **kwargs):
140
"""Log-Normal Shadowing Propagation Loss Model:
141
ref_d (m): The distance at which the reference loss is
142
calculated
143
exponent: The exponent of the Path Loss propagation model, where 2
144
is for propagation in free space
145
(d) is the distance between the transmitter and the receiver (m)
146
gRandom is a Gaussian random variable"""
147
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
148
pt = kwargs['node2'].params['txpower'][0]
149
gt = kwargs['node2'].params['antennaGain'][0]
150
gRandom = self.gRandom
151
gains = pt + gt + gr
152
ref_d = 1
153
154
pl = self.pathLoss(kwargs['node1'], ref_d, kwargs['wlan'])
155
156
dist = kwargs['dist']
157
if kwargs['dist'] == 0:
158
dist = 0.1
159
160
pldb = 10 * self.exp * math.log10(dist / ref_d) + gRandom
161
self.rssi = gains - (int(pl) + int(pldb))
162
163
return self.rssi
164
165
def ITU(self, **kwargs):
166
"""International Telecommunication Union (ITU) Propagation Loss Model:"""
167
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
168
pt = kwargs['node2'].params['txpower'][0]
169
gt = kwargs['node2'].params['antennaGain'][0]
170
f = kwargs['node1'].params['frequency'][kwargs['wlan']] * 10 ** 3
171
nFloors = self.nFloors # Number of Floors
172
gains = pt + gt + gr
173
pL = self.pL
174
lF = self.lF # Floor penetration loss factor
175
N = 28 # Power Loss Coefficient
176
177
"""Power Loss Coefficient Based on the Paper
178
Site-Specific Validation of ITU Indoor Path Loss Model at 2.4 GHz
179
from Theofilos Chrysikos, Giannis Georgopoulos and Stavros Kotsopoulos"""
180
d = kwargs['dist']
181
if kwargs['dist'] == 0:
182
d = 0.1
183
if d > 16:
184
N = 38
185
if pL != 0:
186
N = pL
187
188
pldb = 20 * math.log10(f) + N * math.log10(d) + lF * nFloors - 28
189
self.rssi = gains - int(pldb)
190
191
return self.rssi
192
193
def young(self, **kwargs):
194
"Young Propagation Loss Model"
195
gr = kwargs['node1'].params['antennaGain'][kwargs['wlan']]
196
hr = kwargs['node1'].params['antennaHeight'][kwargs['wlan']]
197
gt = kwargs['node2'].params['antennaGain'][0]
198
ht = kwargs['node2'].params['antennaHeight'][0]
199
cf = 0.01075 # clutter factor
200
201
d = kwargs['dist']
202
if kwargs['dist'] == 0:
203
d = 0.1
204
205
self.rssi = int(d ** 4 / (gt * gr) * (ht * hr) ** 2 * cf)
206
207
return self.rssi
208
209
210
ppm = propagationModel
211
212
213
class GetSignalRange(object):
214
215
dist = 0
216
217
def __init__(self, node=None, wlan=0, enable_interference=False):
218
"Calculate the signal range given the propagation model"
219
if ppm.model in dir(self):
220
self.__getattribute__(ppm.model)(node=node, wlan=wlan,
221
interference=enable_interference)
222
223
def friis(self, **kwargs):
224
"""Path Loss Model:
225
(f) signal frequency transmited(Hz)
226
(c) speed of light in vacuum (m)
227
(L) System loss"""
228
# Convert Ghz to Hz
229
f = kwargs['node'].params['frequency'][kwargs['wlan']] * 10 ** 9
230
txpower = kwargs['node'].params['txpower'][kwargs['wlan']]
231
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
232
gains = txpower + (gain * 2)
233
c = 299792458.0
234
L = ppm.sL
235
236
lambda_ = c / f # lambda: wavelength (m)
237
denominator = lambda_ ** 2
238
self.dist = math.pow(10, ((-ppm.noise_threshold + gains +
239
10 * math.log10(denominator)) /
240
10 - math.log10((4 * math.pi) ** 2 * L)) / (2))
241
242
return self.dist
243
244
def pathLoss(self, node, dist, wlan):
245
"""Path Loss Model:
246
(f) signal frequency transmited(Hz)
247
(d) is the distance between the transmitter and the receiver (m)
248
(c) speed of light in vacuum (m)
249
(L) System loss"""
250
f = node.params['frequency'][wlan] * 10 ** 9 # Convert Ghz to Hz
251
c = 299792458.0
252
L = ppm.sL
253
lambda_ = c / f # lambda: wavelength (m)
254
denominator = lambda_ ** 2
255
numerator = (4 * math.pi * dist) ** 2 * L
256
pl = 10 * math.log10(numerator / denominator)
257
258
return pl
259
260
def logDistance(self, **kwargs):
261
"""Log Distance Propagation Loss Model:
262
ref_d (m): The distance at which the reference loss is
263
calculated
264
exponent: The exponent of the Path Loss propagation model, where 2 is
265
for propagation in free space
266
(dist) is the distance between the transmitter and the receiver (m)"""
267
txpower = kwargs['node'].params['txpower'][kwargs['wlan']]
268
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
269
gains = txpower + (gain * 2)
270
ref_d = 1
271
272
pl = self.pathLoss(kwargs['node'], ref_d, kwargs['wlan'])
273
self.dist = math.pow(10, ((-ppm.noise_threshold - pl + gains) /
274
(10 * ppm.exp))) * ref_d
275
276
return self.dist
277
278
def logNormalShadowing(self, **kwargs):
279
"""Log-Normal Shadowing Propagation Loss Model"""
280
from mininet.wifi.wmediumdConnector import WmediumdGRandom, \
281
WmediumdServer
282
283
ref_d = 1
284
txpower = kwargs['node'].params['txpower'][kwargs['wlan']]
285
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
286
gains = txpower + (gain * 2)
287
mean = 0
288
variance = propagationModel.variance
289
gRandom = float('%.2f' % gauss(mean, variance))
290
propagationModel.gRandom = gRandom
291
292
if kwargs['interference']:
293
sleep(0.002) #notice problem when there are multiple threads
294
WmediumdServer.update_gaussian_random(
295
WmediumdGRandom(kwargs['node'].wmIface[kwargs['wlan']],
296
gRandom))
297
298
pl = self.pathLoss(kwargs['node'], ref_d, kwargs['wlan']) - gRandom
299
numerator = -ppm.noise_threshold - pl + gains
300
denominator = 10 * ppm.exp
301
302
self.dist = math.pow(10, (numerator / denominator)) * ref_d
303
304
return self.dist
305
306
def ITU(self, **kwargs):
307
"""International Telecommunication Union (ITU) Propagation Loss Model:"""
308
f = kwargs['node'].params['frequency'][kwargs['wlan']] * 10 ** 3
309
txpower = kwargs['node'].params['txpower'][kwargs['wlan']]
310
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
311
gains = txpower + (gain * 2)
312
N = 28 # Power Loss Coefficient
313
lF = ppm.lF # Floor penetration loss factor
314
nFloors = ppm.nFloors # Number of Floors
315
316
self.dist = math.pow(10, ((-ppm.noise_threshold + gains -
317
20 * math.log10(f) - lF * nFloors + 28)/N))
318
319
return self.dist
320
321
322
class GetPowerGivenRange(object):
323
"Get tx power when the signal range is set"
324
txpower = 0
325
326
def __init__(self, node, wlan, dist, enable_interference):
327
"Calculate txpower given the signal range"
328
if ppm.model in dir(self):
329
self.__getattribute__(ppm.model)(node=node, wlan=wlan, dist=dist,
330
interference=enable_interference)
331
332
def friis(self, **kwargs):
333
"""Path Loss Model:
334
distance is the range of the transmitter (m)
335
(f) signal frequency transmited(Hz)
336
(c) speed of light in vacuum (m)
337
(L) System loss"""
338
# Convert Ghz to Hz
339
f = kwargs['node'].params['frequency'][kwargs['wlan']] * 10 ** 9
340
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
341
c = 299792458.0
342
d = kwargs['dist']
343
lambda_ = c / f # lambda: wavelength (m)
344
denominator = lambda_ ** 2
345
L = ppm.sL
346
347
self.txpower = 10 * (
348
math.log10((4 * math.pi) ** 2 * L * d ** 2)) + ppm.noise_threshold \
349
- 10 * math.log10(denominator) - (gain * 2)
350
if self.txpower < 0:
351
self.txpower = 1
352
353
return self.txpower
354
355
def pathLoss(self, node, dist, wlan):
356
"""Path Loss Model:
357
(f) signal frequency transmited(Hz)
358
(d) is the distance between the transmitter and the receiver (m)
359
(c) speed of light in vacuum (m)
360
(L) System loss"""
361
f = node.params['frequency'][wlan] * 10 ** 9 # Convert Ghz to Hz
362
c = 299792458.0
363
L = ppm.sL
364
lambda_ = c / f # lambda: wavelength (m)
365
denominator = lambda_ ** 2
366
numerator = (4 * math.pi * dist) ** 2 * L
367
pl = 10 * math.log10(numerator / denominator)
368
369
return pl
370
371
def logDistance(self, **kwargs):
372
"""Log Distance Propagation Loss Model:
373
ref_d (m): The distance at which the reference loss is
374
calculated
375
exponent: The exponent of the Path Loss propagation model, where 2 is
376
for propagation in free space
377
distance is the range of the transmitter (m)"""
378
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
379
g_fixed = (gain * 2)
380
d = kwargs['dist']
381
ref_d = 1
382
pl = self.pathLoss(kwargs['node'], ref_d, kwargs['wlan'])
383
numerator = math.pow(d / ref_d, 10 * ppm.exp) * 10 ** pl
384
denominator = 10 ** - ppm.noise_threshold
385
386
self.txpower = int(math.ceil(math.log10(numerator / denominator) - g_fixed))
387
if self.txpower < 0:
388
self.txpower = 1
389
390
return self.txpower
391
392
def logNormalShadowing(self, **kwargs):
393
"""Log-Normal Shadowing Propagation Loss Model
394
distance is the range of the transmitter (m)"""
395
from mininet.wifi.wmediumdConnector import WmediumdGRandom, \
396
WmediumdServer
397
398
mean = 0
399
d = kwargs['dist']
400
ref_d = 1
401
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
402
variance = propagationModel.variance
403
gRandom = float('%.2f' % gauss(mean, variance))
404
propagationModel.gRandom = gRandom
405
406
if kwargs['interference']:
407
sleep(0.001) # notice problem when there are many threads
408
WmediumdServer.update_gaussian_random(WmediumdGRandom(
409
kwargs['node'].wmIface[kwargs['wlan']], gRandom))
410
411
pl = self.pathLoss(kwargs['node'], ref_d, kwargs['wlan']) - gRandom
412
413
self.txpower = 10 * ppm.exp * math.log10(d / ref_d) + \
414
ppm.noise_threshold + pl - (gain * 2)
415
if self.txpower < 0:
416
self.txpower = 1
417
418
return self.txpower
419
420
def ITU(self, **kwargs):
421
"""International Telecommunication Union (ITU) Propagation Loss Model:
422
distance is the range of the transmitter (m)"""
423
f = kwargs['node'].params['frequency'][kwargs['wlan']] * 10 ** 3
424
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
425
d = kwargs['dist']
426
lF = ppm.lF # Floor penetration loss factor
427
nFloors = ppm.nFloors # Number of Floors
428
N = 28 # Power Loss Coefficient
429
430
self.txpower = N * math.log10(d) + ppm.noise_threshold + \
431
20 * math.log10(f) + lF * nFloors - 28 - (gain * 2)
432
if self.txpower < 0:
433
self.txpower = 1
434
435
return self.txpower
436
def ITU(self, **kwargs):
437
"""International Telecommunication Union (ITU) Propagation Loss Model:
438
distance is the range of the transmitter (m)"""
439
f = kwargs['node'].params['frequency'][kwargs['wlan']] * 10 ** 3
440
gain = kwargs['node'].params['antennaGain'][kwargs['wlan']]
441
d = kwargs['dist']
442
lF = ppm.lF # Floor penetration loss factor
443
nFloors = ppm.nFloors # Number of Floors
444
N = 28 # Power Loss Coefficient
445
446
self.txpower = N * math.log10(d) + ppm.noise_threshold + \
447
20 * math.log10(f) + lF * nFloors - 28 - (gain * 2)
448
if self.txpower < 0:
449
self.txpower = 1
450
451
return self.txpower
452