3.04 Egli model and unit test

This commit is contained in:
alex
2017-04-19 22:06:20 +01:00
parent e943a28d3c
commit 9038f32c3f
13 changed files with 260 additions and 47 deletions

View File

@@ -2,49 +2,45 @@
#include <stdlib.h>
#include <math.h>
double SUIpathLoss(float f, float TxH, float RxH, float d, int mode)
double SUIpathLoss(double f, double TxH, double RxH, double d, int mode)
{
/*
f = Frequency (MHz)
f = Frequency (MHz) 1900 to 11000
TxH = Transmitter height (m)
RxH = Receiver height (m)
d = distance (km)
mode A1 = Hilly + trees
mode B2 = Flat + trees OR hilly + light foliage
mode C3 = Flat + light foliage
mode A1 = URBAN / OBSTRUCTED
mode B2 = SUBURBAN / PARTIALLY OBSTRUCTED
mode C3 = RURAL / OPEN
http://www.cl.cam.ac.uk/research/dtg/lce-pub/public/vsa23/VTC05_Empirical.pdf
*/
d = d * 1000; // km to m
if (f < 1900 || f > 11000) {
fprintf(stderr,"Error: SUI model frequency range 1.9-11GHz\n");
exit(EXIT_FAILURE);
}
// Terrain mode A is default
d = d * 1000.0; // km to m
RxH = RxH * 1000.0; // Correction factor for CPE units.
// Urban (A1) is default
double a = 4.6;
double b = 0.0075;
double c = 12.6;
double s = 10.6; // Optional fading value
int XhCF = -10.8;
double s = 0.0; // Optional fading value. Max 10.6dB
double XhCF = -10.8;
if (mode == 2) {
if (mode == 2) { // Suburban
a = 4.0;
b = 0.0065;
c = 17.1;
s = 6; // average
}
if (mode == 3) {
if (mode == 3) { // Rural
a = 3.6;
b = 0.005;
c = 20;
s = 3; // Optimistic
XhCF = -20;
}
double d0 = 100;
double A = 20 * log10((4 * M_PI * d0) / (300 / f));
double A = 20 * log10((4 * M_PI * d0) / (300.0 / f));
double y = a - (b * TxH) + (c / TxH);
double Xf = 6 * log10(f / 2000);
//Correction factors
double Xf = 6.0 * log10(f / 2000);
double Xh = XhCF * log10(RxH / 2000);
//return A + (10 * y * log10(d / d0)) + Xf + Xh + s;
return A + (10 * y) * (log10(d / d0)) + Xf + Xh + s;
return A + (10 * y * log10(d / d0)) + Xf + Xh + s;
}