📄 shadowing.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 + -