/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see
* rx = tx - Pr0 - 10 * n * log (d/d0) *
* Pr0: rx power at reference distance d0 (dBm)
* d0: reference distance: 1.0 (m)
* d: distance (m)
* n: the path loss exponent
* tx: tx power (dBm)
* rx: rx power (dBm)
*
*
* This class based on NS3 (src/propagation/model/propagation-loss-model.cc) by
* Mathieu Lacage
* Default 2,4 GHz
*/
private long frequency = 2400000000l;
/**
* The wavelength
*/
private double lambda = ((double) lightspeed) / frequency;
/**
* The reference Loss
*/
private double referenceLoss = 20 * Math.log10(4 * Math.PI
* referenceDistance / lambda);
@Override
public double getRxPowerDbm(double txPowerDbm, Location a, Location b) {
double distance = a.distanceTo(b);
return getRxPowerDbm(txPowerDbm, distance);
}
@Override
public double getRxPowerDbm(double txPowerDbm, double distance) {
if (distance <= referenceDistance) {
return txPowerDbm;
}
double pathLoss = 10 * exponent
* Math.log10(distance / referenceDistance);
double rxc = -this.referenceLoss - pathLoss;
return txPowerDbm + rxc;
}
@Override
public double getDistance(double txPowerDbm, double rxPowerDbm) {
return Math.pow(10, (rxPowerDbm - txPowerDbm + referenceLoss)
/ (-10 * exponent))
/ referenceDistance;
}
@Override
public void setFrequency(long frequency) {
this.frequency = frequency;
updatePreComputation();
}
public void setReferenceDistance(double referenceDistance) {
this.referenceDistance = referenceDistance;
updatePreComputation();
}
public void setExponent(double exponent) {
this.exponent = exponent;
}
public double getExponent() {
return exponent;
}
/**
* The lamba and the referenceLoss is depending of the frequency and the
* referenceDistance. If one of this values changed, then should be updated
* the pre computed values.
*/
private void updatePreComputation() {
this.lambda = ((double) lightspeed) / frequency;
this.referenceLoss = 20 * Math.log10(4 * Math.PI * referenceDistance
/ lambda);
}
}