1
0
Fork 0

Clutter loss doesn't depend anymore on sampling distance

Also, fix double horizon diffraction, the second horizon
is relative to the first horizon, not to the beginning of
the path.
This commit is contained in:
adrian 2011-11-29 16:15:06 +02:00
parent dcc915e5bd
commit 8928e0c415

View file

@ -70,7 +70,7 @@ FGRadioTransmission::FGRadioTransmission() {
_tx_line_losses = 2.0; _tx_line_losses = 2.0;
_propagation_model = 2; // choose between models via option: realistic radio on/off _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() FGRadioTransmission::~FGRadioTransmission()
@ -428,20 +428,21 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
double horizons[], double &clutter_loss) { double horizons[], double &clutter_loss) {
distance_m = itm_elev[0] * itm_elev[1]; // only consider elevation points 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 if (p_mode == 0) { // LOS: take each point and see how clutter height affects first Fresnel zone
int mat = 0; 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++) { 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_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius // First Fresnel radius
double frs_rad = 548 * sqrt( (j * itm_elev[1] * (itm_elev[0] - j) * itm_elev[1] / 1000000) / ( distance_m * freq / 1000) ); 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); 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 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); double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
@ -450,19 +451,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (itm_elev[0] - j) * itm_elev[1]; d1 = (itm_elev[0] - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses
@ -481,19 +482,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
int last = 1; int last = 1;
/** perform the first pass */ /** perform the first pass */
int mat = 0; 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++) { for (int k=3;k < num_points_1st + 2;k++) {
if (num_points_1st < 1) if (num_points_1st < 1)
break; break;
double clutter_height = 0.0; // mean clutter height for a certain terrain type double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[num_points_1st + 2] + clutter_height) / distance_m;
// First Fresnel radius // 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) ); 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); 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 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); double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[num_points_1st + 2] + clutter_height);
@ -502,19 +503,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (num_points_1st - j) * itm_elev[1]; d1 = (num_points_1st - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses
@ -533,12 +534,12 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
double clutter_height = 0.0; // mean clutter height for a certain terrain type double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; double grad = fabs(itm_elev[last+1] + clutter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius // 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) ); 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); 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 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); double min_elev = SGMiscd::min(itm_elev[last+1] + clutter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
@ -547,19 +548,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (num_points_2nd - j) * itm_elev[1]; d1 = (num_points_2nd - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses
@ -572,10 +573,10 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
else { // double horizon: same as single horizon, except there are 3 segments 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_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; int num_points_3rd = (int)itm_elev[0] - num_points_1st - num_points_2nd;
cerr << "Double horizon:: horizon1: " << horizons[0] << " horizon2: " << horizons[1] << " distance: " << distance_m << endl;
cerr << "Clutter:: points1: " << num_points_1st << " points2: " << num_points_2nd << " points3: " << num_points_3rd << endl; cerr << "Double horizon:: points1: " << num_points_1st << " points2: " << num_points_2nd << " points3: " << num_points_3rd << endl;
int last = 1; int last = 1;
/** perform the first pass */ /** perform the first pass */
int mat = 0; int mat = 0;
@ -586,12 +587,12 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
double clutter_height = 0.0; // mean clutter height for a certain terrain type double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; double grad = fabs(itm_elev[2] + transmitter_height - itm_elev[num_points_1st + 2] + clutter_height) / distance_m;
// First Fresnel radius // 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) ); 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); 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 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); double min_elev = SGMiscd::min(itm_elev[2] + transmitter_height, itm_elev[num_points_1st + 2] + clutter_height);
@ -600,19 +601,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (num_points_1st - j) * itm_elev[1]; d1 = (num_points_1st - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses
@ -630,11 +631,11 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
double clutter_height = 0.0; // mean clutter height for a certain terrain type double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; 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 // 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) ); 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); assert(frs_rad > 0);
//double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3 //double earth_h = distance_m * (distance_m - j * itm_elev[1]) / ( 1000000 * 12.75 * 1.33 ); // K=4/3
@ -644,19 +645,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (num_points_2nd - j) * itm_elev[1]; d1 = (num_points_2nd - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses
@ -675,13 +676,13 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
double clutter_height = 0.0; // mean clutter height for a certain terrain type double clutter_height = 0.0; // mean clutter height for a certain terrain type
double clutter_density = 0.0; // percent of reflected wave double clutter_density = 0.0; // percent of reflected wave
get_material_properties(materials[mat], clutter_height, clutter_density); 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; double grad = fabs(itm_elev[last2+1] + clutter_height - itm_elev[(int)itm_elev[0] + 2] + receiver_height) / distance_m;
// First Fresnel radius // 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) ); 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); 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 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); double min_elev = SGMiscd::min(itm_elev[last2+1] + clutter_height, itm_elev[(int)itm_elev[0] + 2] + receiver_height);
@ -690,19 +691,19 @@ void FGRadioTransmission::clutterLoss(double freq, double distance_m, double itm
d1 = (num_points_3rd - j) * itm_elev[1]; d1 = (num_points_3rd - j) * itm_elev[1];
} }
double ray_height = (grad * d1) + min_elev; 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 clearance = ray_height - (itm_elev[k] + clutter_height) - frs_rad * 8/10;
double intrusion = fabs(clearance); double intrusion = fabs(clearance);
//cerr << "Clutter:: clearance: " << clearance << endl;
if (clearance >= 0) { if (clearance >= 0) {
// no losses // no losses
} }
else if (clearance < 0 && (intrusion < clutter_height)) { 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)) { 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 { else {
// no losses // no losses