nakagami.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2007 
  3.  * Mercedes-Benz Research & Development North America, Inc.
  4.  * All rights reserved.
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. /*
  46.  * This code was developed by:
  47.  * 
  48.  * Qi Chen                 : qi.chen@daimler.com
  49.  * Heiko Mangold            
  50.  * Daniel Jiang            : daniel.jiang@daimler.com
  51.  * 
  52.  * For further information see: 
  53.  * http://dsn.tm.uni-karlsruhe.de/english/Overhaul_NS-2.php
  54.  */
  55. #include <math.h>
  56. #include <delay.h>
  57. #include <packet.h>
  58. #include <iostream>
  59. #include <float.h>
  60. #include <packet-stamp.h>
  61. #include <antenna.h>
  62. #include <mobilenode.h>
  63. #include <propagation.h>
  64. #include <wireless-phy.h>
  65. #include <ranvar.h>
  66. #include <nakagami.h>
  67. static class NakagamiClass: public TclClass {
  68. public: 
  69. NakagamiClass() : TclClass("Propagation/Nakagami") {}
  70. TclObject* create(int, const char*const*) {
  71. return (new Nakagami);
  72. }
  73. } class_nakagami;
  74. Nakagami::Nakagami()
  75. {
  76. bind("gamma0_", &gamma0);
  77. bind("gamma1_", &gamma1);
  78. bind("gamma2_", &gamma2);
  79. bind("d0_gamma_", &d0_gamma);                           
  80. bind("d1_gamma_", &d1_gamma);
  81. bind_bool ("use_nakagami_dist_" ,&use_nakagami_dist_); // Use random variation superimposed on the mean reception power or not
  82. bind("m0_",&m0);
  83. bind("m1_",&m1);
  84. bind("m2_",&m2);
  85. bind("d0_m_", &d0_m);
  86. bind("d1_m_", &d1_m);
  87. }
  88. Nakagami::Nakagami(double g0,double g1,double g2,double d0_g,double d1_g,double m_0,double m_1,double m_2,double d0m,double d1m, int use_distribution)
  89. {
  90. gamma0 =g0;
  91. gamma1 =g1;
  92. gamma2 =g2;
  93. d0_gamma=d0_g;
  94. d1_gamma= d1_g;
  95. m0= m_0;
  96. m1= m_1;
  97. m2= m_2;
  98. d0_m= d0m;
  99. d1_m= d1m;
  100. use_nakagami_dist_ = use_distribution;
  101. }
  102. Nakagami::~Nakagami()
  103. {
  104. //
  105. }
  106. double Nakagami::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp)
  107. {
  108. double L = ifp->getL();       // system loss
  109. double lambda = ifp->getLambda();   // wavelength
  110. double Xt, Yt, Zt;          // loc of transmitter
  111. double Xr, Yr, Zr;       // loc of receiver
  112. t->getNode()->getLoc(&Xt, &Yt, &Zt);
  113. r->getNode()->getLoc(&Xr, &Yr, &Zr);
  114. // Is antenna position relative to node position?
  115. Xr += r->getAntenna()->getX();
  116. Yr += r->getAntenna()->getY();
  117. Zr += r->getAntenna()->getZ();
  118. Xt += t->getAntenna()->getX();
  119. Yt += t->getAntenna()->getY();
  120. Zt += t->getAntenna()->getZ();
  121. double dX = Xr - Xt;
  122. double dY = Yr - Yt;
  123. double dZ = Zr - Zt;
  124. double dist = sqrt(dX * dX + dY * dY + dZ * dZ);
  125.  
  126. // get antenna gain
  127.   double Gt = t->getAntenna()->getTxGain(dX, dY, dZ, lambda);
  128.   double Gr = r->getAntenna()->getRxGain(dX, dY, dZ, lambda);
  129. double d_ref = 1.0;
  130. // calculate receiving power at reference distance
  131. double Pr0 = Friis(t->getTxPr(), Gt, Gr, lambda, L, d_ref);
  132. // calculate average power loss predicted by empirical loss model in dB
  133. // according to measurements, 
  134. // the default settings of gamma, m and d are stored in tcl/lib/ns-default.tcl
  135.    double path_loss_dB = 0.0;
  136.    if (dist > 0 && dist <= d0_gamma) {
  137. path_loss_dB = 10*gamma0*log10(dist/d_ref); 
  138.    }
  139. if (dist > d0_gamma && dist <= d1_gamma) {
  140. path_loss_dB = 10*gamma0*log10(d0_gamma/d_ref) + 10*gamma1*log10(dist/d0_gamma);
  141. if(dist > d1_gamma) { 
  142. path_loss_dB = 10*gamma0*log10(d0_gamma/d_ref) + 10*gamma1*log10(d1_gamma/d0_gamma)+10*gamma2*log10(dist/d1_gamma);
  143. }
  144.     // calculate the receiving power at distance dist
  145.   double Pr = Pr0 * pow(10.0, -path_loss_dB/10.0);
  146.   if (!use_nakagami_dist_) {
  147.   return Pr; 
  148.   } else {
  149.   double m;
  150.   if ( dist <= d0_m)
  151.   m = m0;
  152.   else if ( dist <= d1_m)
  153.   m = m1; 
  154.   else
  155.   m = m2;
  156.   unsigned int int_m = (unsigned int)(floor (m));
  157.  
  158.   double resultPower;
  159.  
  160.         if (int_m == m) {
  161.   resultPower = ErlangRandomVariable::ErlangRandomVariable(Pr/m, int_m).value();
  162.   } else {
  163.   resultPower = GammaRandomVariable::GammaRandomVariable(m, Pr/m).value();
  164.   }
  165.   return resultPower;
  166. }
  167. }
  168. int Nakagami::command(int argc, const char* const* argv)
  169. {
  170. return 0;
  171. }
  172. double Nakagami::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda) {
  173. return DBL_MAX;
  174. }