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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  * 
  34.  propagation.cc
  35.  $Id: propagation.cc,v 1.8 2006/01/24 00:36:43 sallyfloyd Exp $
  36. */
  37. #include <stdio.h>
  38. #include <topography.h>
  39. #include <propagation.h>
  40. #include <wireless-phy.h>
  41. class PacketStamp;
  42. int
  43. Propagation::command(int argc, const char*const* argv)
  44. {
  45.   TclObject *obj;  
  46.   if(argc == 3) 
  47.     {
  48.       if( (obj = TclObject::lookup(argv[2])) == 0) 
  49. {
  50.   fprintf(stderr, "Propagation: %s lookup of %s failedn", argv[1],
  51.   argv[2]);
  52.   return TCL_ERROR;
  53. }
  54.       if (strcasecmp(argv[1], "topography") == 0) 
  55. {
  56.   topo = (Topography*) obj;
  57.   return TCL_OK;
  58. }
  59.     }
  60.   return TclObject::command(argc,argv);
  61. }
  62.  
  63. /* As new network-intefaces are added, add a default method here */
  64. double
  65. Propagation::Pr(PacketStamp *, PacketStamp *, Phy *)
  66. {
  67. fprintf(stderr,"Propagation model %s not implemented for generic NetIFn",
  68.   name);
  69. abort();
  70. return 0; // Make msvc happy
  71. }
  72. double
  73. Propagation::Pr(PacketStamp *, PacketStamp *, WirelessPhy *)
  74. {
  75. fprintf(stderr,
  76. "Propagation model %s not implemented for SharedMedia interfacen",
  77. name);
  78. abort();
  79. return 0; // Make msvc happy
  80. }
  81. double
  82. Propagation::getDist(double Pr, double Pt, double Gt, double Gr, double hr,
  83.      double ht, double L, double lambda)
  84. {
  85. fprintf(stderr,
  86. "Propagtion model %s not implemented for generic usen", name);
  87. abort();
  88. return 0;
  89. }
  90. double
  91. Propagation::Friis(double Pt, double Gt, double Gr, double lambda, double L, double d)
  92. {
  93.         /*
  94.          * Friis free space equation:
  95.          *
  96.          *       Pt * Gt * Gr * (lambda^2)
  97.          *   P = --------------------------
  98.          *       (4 * pi * d)^2 * L
  99.          */
  100. if (d == 0.0) //XXX probably better check < MIN_DISTANCE or some such
  101. return Pt;
  102.   double M = lambda / (4 * PI * d);
  103.   return (Pt * Gt * Gr * (M * M)) / L;
  104. }
  105. // methods for free space model
  106. static class FreeSpaceClass: public TclClass {
  107. public:
  108. FreeSpaceClass() : TclClass("Propagation/FreeSpace") {}
  109. TclObject* create(int, const char*const*) {
  110. return (new FreeSpace);
  111. }
  112. } class_freespace;
  113. double FreeSpace::Pr(PacketStamp *t, PacketStamp *r, WirelessPhy *ifp)
  114. {
  115. double L = ifp->getL(); // system loss
  116. double lambda = ifp->getLambda();   // wavelength
  117. double Xt, Yt, Zt; // location of transmitter
  118. double Xr, Yr, Zr; // location of receiver
  119. t->getNode()->getLoc(&Xt, &Yt, &Zt);
  120. r->getNode()->getLoc(&Xr, &Yr, &Zr);
  121. // Is antenna position relative to node position?
  122. Xr += r->getAntenna()->getX();
  123. Yr += r->getAntenna()->getY();
  124. Zr += r->getAntenna()->getZ();
  125. Xt += t->getAntenna()->getX();
  126. Yt += t->getAntenna()->getY();
  127. Zt += t->getAntenna()->getZ();
  128. double dX = Xr - Xt;
  129. double dY = Yr - Yt;
  130. double dZ = Zr - Zt;
  131. double d = sqrt(dX * dX + dY * dY + dZ * dZ);
  132. // get antenna gain
  133. double Gt = t->getAntenna()->getTxGain(dX, dY, dZ, lambda);
  134. double Gr = r->getAntenna()->getRxGain(dX, dY, dZ, lambda);
  135. // calculate receiving power at distance
  136. double Pr = Friis(t->getTxPr(), Gt, Gr, lambda, L, d);
  137. // warning: use of `l' length character with `f' type character
  138. //  - Sally Floyd, FreeBSD.
  139. printf("%lf: d: %lf, Pr: %en", Scheduler::instance().clock(), d, Pr);
  140. return Pr;
  141. }
  142. double
  143. FreeSpace::getDist(double Pr, double Pt, double Gt, double Gr, double hr, double ht, double L, double lambda)
  144. {
  145.         return sqrt((Pt * Gt * Gr * lambda * lambda) / (L * Pr)) /
  146.                 (4 * PI);
  147. }