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

📄 shadowing.cc

📁 thomson_mesh_modules_Enhanced Wireless Mesh Networking for ns-2 simulator
💻 CC
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * shadowing.cc * Copyright (C) 2000 by the University of Southern California * $Id: shadowing.cc,v 1.4 2005/08/25 18:58:09 johnh Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program 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 this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * * The copyright of this module includes the following * linking-with-specific-other-licenses addition: * * In addition, as a special exception, the copyright holders of * this module give you permission to combine (via static or * dynamic linking) this module with free software programs or * libraries that are released under the GNU LGPL and with code * included in the standard release of ns-2 under the Apache 2.0 * license or under otherwise-compatible licenses with advertising * requirements (or modified versions of such code, with unchanged * license).  You may copy and distribute such a system following the * terms of the GNU GPL for this module and the licenses of the * other code concerned, provided that you include the source code of * that other code when and as the GNU GPL requires distribution of * source code. * * Note that people who make modified versions of this module * are not obligated to grant this special exception for their * modified versions; it is their choice whether to do so.  The GNU * General Public License gives permission to release a modified * version without this exception; this exception also makes it * possible to release a modified version which carries forward this * exception. * *//* * Shadowing propation model, including the path-loss model. * This statistcal model is applicable for both outdoor and indoor. * Wei Ye, weiye@isi.edu, 2000 */#include <math.h>#include <delay.h>#include <packet.h>#include <packet-stamp.h>#include <antenna.h>#include <mobilenode.h>#include <propagation.h>#include <wireless-phy.h>#include <shadowing.h>static class ShadowingClass: public TclClass {public:	ShadowingClass() : TclClass("Propagation/Shadowing") {}	TclObject* create(int, const char*const*) {		return (new Shadowing);	}} class_shadowing;Shadowing::Shadowing(){	int i;	// VIVEK//	printf("Creating shadow_coeff_ array.\n");	shadow_coeff_ = new double * [MAXNODES];	for(i=0;i<MAXNODES;i++)		shadow_coeff_[i] = new double [MAXNODES];//	bind("pathlossExp_", &pathlossExp_);//	bind("std_db_", &std_db_);//	bind("dist0_", &dist0_);//	bind("seed_", &seed_);//	bind("num_nodes_", &num_nodes_);	pathlossExp_ =3.3;	pathlossConst_ =pow(10.0, -5.3);	std_db_ =4.0;	fw_rev_corr_=0.5;	dist0_ =1.0;	seed_ =0; //default seed_	init_seed_ = 0;	num_nodes_ = -1;//	ranVar = new RNG;//	ranVar->set_seed(RNG::PREDEF_SEED_SOURCE, seed_);}Shadowing::~Shadowing(){	int i;//	return;//	printf("Deleting shadow_coeff_ array.\n");	delete ranVar;	for(i=0;i<MAXNODES;i++){		delete [] shadow_coeff_[i];	}	delete [] shadow_coeff_;}// VIVEK_NEWvoid Shadowing::set_seed_(int value){	int i, j;	double temp, common_gaussian, gaussian_up, gaussian_down, temp_up, temp_down;	seed_ = value;//	return;// INIT the entire shadowing array of this node	if(!init_seed_){ // During first pass, set all gains.		// Ensures repeatability since gains do not depend on the order in which signals were recvd.		init_seed_ = 1;		ranVar = new RNG;//		ranVar->set_seed(RNG::RAW_SEED_SOURCE, ((1+seed_)*1234567)); // Seed		ranVar->set_seed(RNG::RAW_SEED_SOURCE, seed_+1); // 64 predefined seeds.//		printf("Setting seed_=%d\n", seed_);		for(i=0 ; i<MAXNODES ;i++){			for(j=i+1 ; j<MAXNODES ;j++){//VIVEK_NEW				//VIVEK_NEW				//The shadowing over uplink and downlink is about 50-90% correlated.				//See "Shadow Fading Correlation between Uplink and Downlink," Eldad Perahia, Donald C. Cox, VTC 2001				//Measurement study in suburban area in 1900MHz band show a correlation of about 0.9 between d/l and u/l				//Comparison of routing metric paper shows significant difference in fw and rev correlation (MSR paper)				common_gaussian = ranVar->normal(0.0, std_db_);				gaussian_up = ranVar->normal(0.0, std_db_);				gaussian_down = ranVar->normal(0.0, std_db_);				temp_up   = common_gaussian*pow(fw_rev_corr_, 0.5) + gaussian_up*pow(1.0-fw_rev_corr_, 0.5);				temp_down = common_gaussian*pow(fw_rev_corr_, 0.5) + gaussian_down*pow(1.0-fw_rev_corr_, 0.5);				//Shadowing gains are rarely above 2 standard deviation. If we generate these gains for all the 				//node pairs, there are 100*99 such terms, and some of them could be very high (basic probability).				//Hence we truncate the positive side of these gains within 2 std_db_				//Approach for larger shadow std dev//				if(temp_up> 2.0*std_db_)//					temp_up = 2.0*std_db_;//				else if(temp_up< -2.0*std_db_)//					temp_up = -2.0*std_db_;////				if(temp_down> 2.0*std_db_)//					temp_down = 2.0*std_db_;//				else if(temp_down< -2.0*std_db_)//					temp_down = -2.0*std_db_;				shadow_coeff_[i][j] = pow(10.0, temp_up/10.0);				shadow_coeff_[j][i] = pow(10.0, temp_down/10.0);//				if((i==73 && j==91) || (i==91 && j==73))//					printf("shadow coeff %d -> %d=%f\n", j, i, 10.0*log10(shadow_coeff_[i][j]));			}		}	}}// VIVEK_NEWdouble Shadowing::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp){	double Pr, avg_db;	int myaddr, othernd;	//VIVEK	if(num_nodes_ <0){		printf("Set number of wireless nodes with: \nset prop_inst [$ns_ set propInstance_]\n$prop_inst num_nodes_   $opt(nn);\n");		exit(0);	}	// calculate the receiving power at dist	double L = ifp->getL();		// system loss	double lambda = ifp->getLambda();   // wavelength	double Xt, Yt, Zt;		// loc of transmitter	double Xr, Yr, Zr;		// loc 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 dist = 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 reference distance// VIVEK_NEW	double Pr0 = Friis(t->getTxPr(), Gt, Gr, lambda, L, dist0_);	double c = pathlossConst_; // constant in path loss term	// Rcvd pwr is is c * dist^{-pathlossExp_) * shadow * fading * Gt * Gr * Txpwr	// Fading term will come later (parent class).	double Pr0 = t->getTxPr()*c*Gt*Gr;	myaddr  = r->getNode()->address();	othernd = t->getNode()->address();	avg_db = -10.0 * pathlossExp_ * log10(dist/dist0_); // Path loss//	printf("myaddr=%d, otherndaddr=%d\n",myaddr, othernd);	Pr = Pr0 * pow(10.0, (avg_db/10.0)) * shadow_coeff_[myaddr][othernd]; // Cumulative gain (path loss and shdwng)//	Pr = Pr0 * pow(10.0, (avg_db/10.0)) * pow(10.0, 1.130); // Cumulative gain (path loss and shdwng)	return Pr;}int Shadowing::command(int argc, const char* const* argv){	if ((argc == 3) && (strcmp(argv[1], "num_nodes_") == 0)){		if(atoi(argv[2]) > MAXNODES)			return(TCL_ERROR); // Network is too large, need to reconfigure		else{			set_num_nodes_(atoi(argv[2]));			return(TCL_OK);		}	}	if (argc == 4) {		/* VIVEK_NEW OBSOLETE UNDER COMBINED shdw-fdng MODEL */		if (strcmp(argv[1], "seed") == 0) {			int s = atoi(argv[3]);			if (strcmp(argv[2], "raw") == 0) {				ranVar->set_seed(RNG::RAW_SEED_SOURCE, s);			} else if (strcmp(argv[2], "predef") == 0) {				ranVar->set_seed(RNG::PREDEF_SEED_SOURCE, s);				// s is the index in predefined seed array				// 0 <= s < 64			} else if (strcmp(argv[2], "heuristic") == 0) {				ranVar->set_seed(RNG::HEURISTIC_SEED_SOURCE, 0);			}			return(TCL_OK);		}	}		return Propagation::command(argc, argv);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -