📄 propagation.cc
字号:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (c) 1997 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Computer Systems * Engineering Group at Lawrence Berkeley Laboratory. * 4. Neither the name of the University nor of the Laboratory may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * propagation.cc $Id: propagation.cc,v 1.7 2005/02/03 20:15:00 haldar Exp $*/#include <stdio.h>#include <topography.h>#include <propagation.h>#include <wireless-phy.h>#include <fso/fso-antenna.h>class PacketStamp;intPropagation::command(int argc, const char*const* argv){ TclObject *obj; if(argc == 3) { if( (obj = TclObject::lookup(argv[2])) == 0) { fprintf(stderr, "Propagation: %s lookup of %s failed\n", argv[1], argv[2]); return TCL_ERROR; } if (strcasecmp(argv[1], "topography") == 0) { topo = (Topography*) obj; return TCL_OK; } } return TclObject::command(argc,argv);} /* As new network-intefaces are added, add a default method here */doublePropagation::Pr(PacketStamp *, PacketStamp *, Phy *){ fprintf(stderr,"Propagation model %s not implemented for generic NetIF\n", name); abort(); return 0; // Make msvc happy}doublePropagation::Pr(PacketStamp *, PacketStamp *, WirelessPhy *){ fprintf(stderr, "Propagation model %s not implemented for SharedMedia interface\n", name); abort(); return 0; // Make msvc happy}doublePropagation::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda){ fprintf(stderr, "Propagtion model %s not implemented for generic use\n", name); abort(); return 0;}doublePropagation::Friis(double Pt, double Gt, double Gr, double lambda, double L, double d){ /* * Friis free space equation: * * Pt * Gt * Gr * (lambda^2) * P = -------------------------- * (4 * pi * d)^2 * L */ if (d == 0.0) //XXX probably better check < MIN_DISTANCE or some such return Pt; double M = lambda / (4 * PI * d); return (Pt * Gt * Gr * (M * M)) / L;}// methods for free space modelstatic class FreeSpaceClass: public TclClass {public: FreeSpaceClass() : TclClass("Propagation/FreeSpace") {} TclObject* create(int, const char*const*) { return (new FreeSpace); }} class_freespace;double FreeSpace::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp){ double L = ifp->getL(); // system loss double lambda = ifp->getLambda(); // wavelength double Xt, Yt, Zt; // location of transmitter double Xr, Yr, Zr; // location of receiver t->getNode()->getLoc(&Xt, &Yt, &Zt); r->getNode()->getLoc(&Xr, &Yr, &Zr); // Is antenna position relative to node position? Xr += r->getAntenna()->getX(); Yr += r->getAntenna()->getY(); Zr += r->getAntenna()->getZ(); Xt += t->getAntenna()->getX(); Yt += t->getAntenna()->getY(); Zt += t->getAntenna()->getZ(); double dX = Xr - Xt; double dY = Yr - Yt; double dZ = Zr - Zt; double d = sqrt(dX * dX + dY * dY + dZ * dZ); // get antenna gain double Gt = t->getAntenna()->getTxGain(dX, dY, dZ, lambda); double Gr = r->getAntenna()->getRxGain(dX, dY, dZ, lambda); // calculate receiving power at distance double Pr = Friis(t->getTxPr(), Gt, Gr, lambda, L, d); printf("%lf: d: %lf, Pr: %e\n", Scheduler::instance().clock(), d, Pr); return Pr;}doubleFreeSpace::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda){ return sqrt((Pt * Gt * Gr * lambda * lambda) / (L * Pr)) / (4 * PI);}// begin RPI FSO Extensions// methods for free space modelstatic class FreeSpaceOpticalClass: public TclClass {public: FreeSpaceOpticalClass() : TclClass("Propagation/FreeSpaceOptical") {} TclObject* create(int, const char*const*) { return (new FreeSpaceOptical); }} class_freespaceoptical;double FreeSpaceOptical::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp){ long double Visibility; /* Visibility of the weather in KM*/ long double Lambda; /*The wavelength of the light transmitted in Nano meters*/ double power_from_node = 0.0; FSOAntenna * Current_Receiver = (FSOAntenna *)r->getAntenna(); FSOAntenna * Current_Transmitter = (FSOAntenna *)t->getAntenna(); Visibility = ifp->getVisibility(); Lambda = ifp->getLambda(); power_from_node = Power( Current_Receiver, Current_Transmitter, Visibility, Lambda ); return power_from_node;}double FreeSpaceOptical::Power(FSOAntenna * CurrentAntenna, FSOAntenna * OtherAntenna, double visibility, double lambda) { /* This is the propagation model for the FSO link Here we calculate the loss due to propagaton,*/ /*and find the power at the recevier based on the distance and visibility*/ /* Transmitter parameters*/ long double Tx_Power; /* The transmitted power in Decibels*/ long double Tx_Angle; /* half included angle in milliradians*/ //long double Area_transmitter; /* Area of the transmitter/LED*/ long double Dia_Transmitter; /* Diameter of the transmitter/LED in Centimeters*/ /*Receiver Parameters*/ long double Rc_Sensitivity; /* In decibels*/ long double Dia_Receiver; /*In Centimeters*/ long double Rx_Angle; long double Roe; /* Received Power */ long double Rx_Power_ = 0.0 ; /* Geometrical loss parameters*/ long double Geometrical_Loss; long double Loss_Angle; /*Atmospheric loss paramters*/ long double particle_size; /*Calc:The size distribution of the scattering particles*/ long double Atmospheric_Loss;//calc long double sigma;//calc /*Total Loss*/ long double Loss; /* The angular orientation of the receiver */ long double theta; /*Angle between NLOS of antenna1 and R (To be found out)*/ long double phi;/*Angle between NLOS of antenna2 and R (To be found out)*/ /*R is the Vector between the receiver from the transmitter*/ long double Mod_R; /*Absolute distance between Tx and Rx*/ long double Mod_NLOS1; /*Absolute length of the NLOS1*/ long double Mod_NLOS2; /*Absolute length of NLOS2*/ long double Z; /* Distance of the receiver from transmitter if theta were zero (0)*/ /* Co-ordinates of both the communicating antennas and their NLOS's*/ long double XAntenna1_CoOrd; long double YAntenna1_CoOrd; long double ZAntenna1_CoOrd; long double XAntenna2_CoOrd; long double YAntenna2_CoOrd; long double ZAntenna2_CoOrd; long double X_NLOS1; long double Y_NLOS1; long double Z_NLOS1; long double X_NLOS2; long double Y_NLOS2; long double Z_NLOS2; XAntenna1_CoOrd = CurrentAntenna->getX(); YAntenna1_CoOrd = CurrentAntenna->getY(); ZAntenna1_CoOrd = CurrentAntenna->getZ(); XAntenna2_CoOrd = OtherAntenna->getX(); YAntenna2_CoOrd = OtherAntenna->getY(); ZAntenna2_CoOrd = OtherAntenna->getZ(); X_NLOS1 = CurrentAntenna->getXNormal(); Y_NLOS1 = CurrentAntenna->getYNormal(); Z_NLOS1 = CurrentAntenna->getZNormal(); X_NLOS2 = OtherAntenna->getXNormal(); Y_NLOS2 = OtherAntenna->getYNormal(); Z_NLOS2 = OtherAntenna->getZNormal(); Tx_Power = OtherAntenna->getTx_Power(); Tx_Angle = OtherAntenna->getTx_Angle(); Dia_Transmitter = OtherAntenna->getTx_Dia(); Rc_Sensitivity = CurrentAntenna->getRx_Sensitivity(); Rx_Angle = CurrentAntenna->getRx_Angle(); Dia_Receiver = CurrentAntenna->getRx_Dia(); /*Get the LOS distance from the co-orinates*/ Mod_R = sqrt(square(XAntenna2_CoOrd - XAntenna1_CoOrd) + square(YAntenna2_CoOrd - YAntenna1_CoOrd) + square(ZAntenna2_CoOrd - ZAntenna1_CoOrd)); Mod_NLOS1 = sqrt(square(X_NLOS1) + square(Y_NLOS1) + square(Z_NLOS1)); Mod_NLOS2 = sqrt(square(X_NLOS2) + square(Y_NLOS2) + square(Z_NLOS2)); Roe = ((XAntenna2_CoOrd - XAntenna1_CoOrd)*X_NLOS1 + (YAntenna2_CoOrd - YAntenna1_CoOrd)*Y_NLOS1 + (ZAntenna2_CoOrd - ZAntenna1_CoOrd)*Z_NLOS1)/(Mod_R * Mod_NLOS1); if(Roe < -1) { theta = PI; } else if(Roe > 1) { theta = 0.0; } else { theta = acos(Roe); } Z = Mod_R/cos(theta); /* R taken in the opposite direction*/ Roe = ((XAntenna1_CoOrd - XAntenna2_CoOrd)*X_NLOS2 + (YAntenna1_CoOrd - YAntenna2_CoOrd)*Y_NLOS2 + (ZAntenna1_CoOrd - ZAntenna2_CoOrd)*Z_NLOS2)/(Mod_R * Mod_NLOS2); if(Roe < -1) { phi = PI; } else if(Roe > 1) { phi = 0.0; } else { phi = acos(Roe); } Loss_Angle = pow(cos(phi), 10); /* Now check for the angular orientation of the receiver*/ /* If the receiver is exacly in line of sight, then the received power is the above*/ /*DAVID: This code is to be used once the co-ordinates of both antennas (recevier and sender): AJ*/ if(theta < (Rx_Angle/2.0) && phi < (Tx_Angle/2.0)) { /*Antennas are aligned*/ /* Geometricla Loss*/ Geometrical_Loss = Dia_Receiver/(Dia_Transmitter + 100*Mod_R*Tx_Angle); /* The SECOND component is due to the atmospheric attenuation*/ /* The size distribution of the scattering particles*/ if(visibility > 50) particle_size = 1.6; if((visibility <= 50) && (visibility > 6)) particle_size = 1.3; if(visibility <= 6) particle_size = 0.585*pow(visibility, 1/3); /* The attenuation co-efficient sigma*/ sigma = (3.91/visibility)*pow((long double)lambda/550e-9, -(particle_size)); Atmospheric_Loss = exp(-(sigma*(Mod_R))); /*Total Loss is the sum of both losses*/ Loss = Geometrical_Loss; /* The power at the receiver*/ Rx_Power_ = (Tx_Power + Loss) * pow(cos(theta),15) * pow(cos(phi),15); return Rx_Power_; } else { return 0.0; }}doubleFreeSpaceOptical::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda){ return sqrt((Pt * Gt * Gr * lambda * lambda) / (L * Pr)) / (4 * PI);}// end RPI FSO Extensions
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -