/* * 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 . * */ package de.tud.kom.p2psim.impl.topology.views.wifi.phy.propagation.loss; import de.tud.kom.p2psim.api.topology.views.wifi.phy.PropagationLossModel; import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location; /** * The Friis Propagation Loss Model: * *
 *  P     Gt * Gr * (lambda^2)
 * --- = --------------------- 
 * Pt     (4 * pi * d)^2 * L
 * 
* * Where:
* * Pt: tx power (W)
* Gt: tx gain (unit-less)
* Gr: rx gain (unit-less)
* lambda: wavelength (m)
* d: distance (m)
* L: system loss
* * * Here, we set tx and rx gain to 1, so it has no influence. * *
 *                 lambda^2
 * rx = tx * (-------------------) 
 *             (4 * pi * d)^2 * L
 * 
* *
* * This class based on NS3 (src/propagation/model/propagation-loss-model.cc). * * @version 1.0, 21.08.2012 */ public class FriisPropagationLossModel extends PropagationLossModel { /** * Frequency in Hz
* Default 2,4 GHz */ private long frequency = 2400000000l; /** * The wavelength */ private double lambda = ((double) lightspeed) / frequency; /** * The system loss */ private double systemLoss = 1d; /** * The distance under which the propagation model refuse the result.
* In meter. */ private double minDistance = 0.5d; @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 <= minDistance) { return txPowerDbm; } double recPower = dbmToW(txPowerDbm) * (lambda * lambda) / (Math.pow((4 * Math.PI * distance), 2) * systemLoss); return wToDbm(recPower); } @Override public double getDistance(double txPowerDbm, double rxPowerDbm) { return Math.sqrt(dbmToW(txPowerDbm) * lambda * lambda / (dbmToW(rxPowerDbm) * systemLoss * 16 * Math.PI * Math.PI)); } @Override public void setFrequency(long frequency) { this.frequency = frequency; this.lambda = ((double) lightspeed) / frequency; } public void setSystemLoss(double systemLoss) { this.systemLoss = systemLoss; } }