⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 propagation.cc

📁 fso antenna model for ns2
💻 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 + -