_tx_line_losses = 2.0;
_propagation_model = 2; // choose between models via option: realistic radio on/off
- _terrain_sampling_distance = 90.0; // regular SRTM is 90 meters
+ _terrain_sampling_distance = fgGetDouble("/sim/radio/sampling-distance", 90.0); // regular SRTM is 90 meters
}
FGRadioTransmission::~FGRadioTransmission()
double horizons[], double &clutter_loss) {
distance_m = itm_elev[0] * itm_elev[1]; // only consider elevation points
+
if (p_mode == 0) { // LOS: take each point and see how clutter height affects first Fresnel zone
int mat = 0;
- int j=1; // first point is TX elevation, last is RX elevation
+ int j=1;
for (int k=3;k < (int)(itm_elev[0]) + 2;k++) {
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (itm_elev[0] - j) * itm_elev[1] / 1000000) / ( distance_m * freq / 1000) );
assert(frs_rad > 0);
- //cerr << "Clutter:: fresnel radius: " << frs_rad << endl;
+
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
d1 = (itm_elev[0] - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses
int last = 1;
/** perform the first pass */
int mat = 0;
- int j=1; // first point is TX elevation, 2nd is obstruction elevation
+ int j=1;
for (int k=3;k < num_points_1st + 2;k++) {
if (num_points_1st < 1)
break;
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[num_points_1st + 2] + clutter_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (num_points_1st - j) * itm_elev[1] / 1000000) / ( num_points_1st * itm_elev[1] * freq / 1000) );
assert(frs_rad > 0);
- //cerr << "Clutter:: fresnel radius: " << frs_rad << endl;
+
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[num_points_1st + 2] + clutter_height);
d1 = (num_points_1st - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[last+1] + clutter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (num_points_2nd - j) * itm_elev[1] / 1000000) / ( num_points_2nd * itm_elev[1] * freq / 1000) );
assert(frs_rad > 0);
- //cerr << "Clutter:: fresnel radius: " << frs_rad << endl;
+
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
double min_elev = SGMiscd::min(itm_elev[last+1] + clutter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
d1 = (num_points_2nd - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses
else { // double horizon: same as single horizon, except there are 3 segments
int num_points_1st = (int)floor( horizons[0] * itm_elev[0] / distance_m );
- int num_points_2nd = (int)ceil( (horizons[1] - horizons[0]) * itm_elev[0] / distance_m );
+ int num_points_2nd = (int)floor(horizons[1] * itm_elev[0] / distance_m );
int num_points_3rd = (int)itm_elev[0] - num_points_1st - num_points_2nd;
-
- cerr << "Clutter:: points1: " << num_points_1st << " points2: " << num_points_2nd << " points3: " << num_points_3rd << endl;
+ cerr << "Double horizon:: horizon1: " << horizons[0] << " horizon2: " << horizons[1] << " distance: " << distance_m << endl;
+ cerr << "Double horizon:: points1: " << num_points_1st << " points2: " << num_points_2nd << " points3: " << num_points_3rd << endl;
int last = 1;
/** perform the first pass */
int mat = 0;
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[num_points_1st + 2] + clutter_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (num_points_1st - j) * itm_elev[1] / 1000000) / ( num_points_1st * itm_elev[1] * freq / 1000) );
assert(frs_rad > 0);
- //cerr << "Clutter:: fresnel radius: " << frs_rad << endl;
+
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[num_points_1st + 2] + clutter_height);
d1 = (num_points_1st - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[last+1] + clutter_height - itm_elev[num_points_1st + num_points_2nd + 2] + clutter_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (num_points_2nd - j) * itm_elev[1] / 1000000) / ( num_points_2nd * itm_elev[1] * freq / 1000) );
- //cerr << "Clutter:: fresnel radius: " << frs_rad << " points2: " << num_points_2nd << " j: " << j << endl;
+ //cerr << "Double horizon second pass:: fresnel radius: " << frs_rad << " points2: " << num_points_2nd << " j: " << j << endl;
assert(frs_rad > 0);
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
d1 = (num_points_2nd - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses
double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density);
- //cerr << "Clutter:: material: " << materials[mat] << " height: " << clutter_height << ", density: " << clutter_density << endl;
+
double grad = fabs(itm_elev[last2+1] + clutter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (num_points_3rd - j) * itm_elev[1] / 1000000) / ( num_points_3rd * itm_elev[1] * freq / 1000) );
- cerr << "Clutter:: fresnel radius: " << frs_rad << " points2: " << num_points_3rd << " j: " << j << endl;
+ //cerr << "Double horizon third pass:: fresnel radius: " << frs_rad << " points3: " << num_points_3rd << " j: " << j << endl;
assert(frs_rad > 0);
- //cerr << "Clutter:: fresnel radius: " << frs_rad << endl;
+
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
double min_elev = SGMiscd::min(itm_elev[last2+1] + clutter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
d1 = (num_points_3rd - j) * itm_elev[1];
}
double ray_height = (grad * d1) + min_elev;
- //cerr << "Clutter:: ray height: " << ray_height << " ground height:" << itm_elev[k] << endl;
+
double clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance);
- //cerr << "Clutter:: clearance: " << clearance << endl;
+
if (clearance >= 0) {
// no losses
}
else if (clearance < 0 && (intrusion < clutter_height)) {
- clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * freq/100;
+ clutter_loss += clutter_density * (intrusion / (frs_rad * 2) ) * (freq/100) * (itm_elev[1]/100);
}
else if (clearance < 0 && (intrusion > clutter_height)) {
- clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * freq/100;
+ clutter_loss += clutter_density * (clutter_height / (frs_rad * 2 ) ) * (freq/100) * (itm_elev[1]/100);
}
else {
// no losses