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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * threshold.cc
  4.  * Copyright (C) 2000 by the University of Southern California
  5.  * $Id: threshold.cc,v 1.3 2005/08/25 18:58:06 johnh Exp $
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License,
  9.  * version 2, as published by the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License along
  17.  * with this program; if not, write to the Free Software Foundation, Inc.,
  18.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *
  21.  * The copyright of this module includes the following
  22.  * linking-with-specific-other-licenses addition:
  23.  *
  24.  * In addition, as a special exception, the copyright holders of
  25.  * this module give you permission to combine (via static or
  26.  * dynamic linking) this module with free software programs or
  27.  * libraries that are released under the GNU LGPL and with code
  28.  * included in the standard release of ns-2 under the Apache 2.0
  29.  * license or under otherwise-compatible licenses with advertising
  30.  * requirements (or modified versions of such code, with unchanged
  31.  * license).  You may copy and distribute such a system following the
  32.  * terms of the GNU GPL for this module and the licenses of the
  33.  * other code concerned, provided that you include the source code of
  34.  * that other code when and as the GNU GPL requires distribution of
  35.  * source code.
  36.  *
  37.  * Note that people who make modified versions of this module
  38.  * are not obligated to grant this special exception for their
  39.  * modified versions; it is their choice whether to do so.  The GNU
  40.  * General Public License gives permission to release a modified
  41.  * version without this exception; this exception also makes it
  42.  * possible to release a modified version which carries forward this
  43.  * exception.
  44.  *
  45.  */
  46. /*
  47.  * Calculating the receiving threshold (RXThresh_ for Phy/Wireless)
  48.  * Wei Ye, weiye@isi.edu, 2000
  49.  */
  50. #include <math.h>
  51. #include <stdlib.h>
  52. #include <iostream.h>
  53. #ifndef M_PI
  54. #define M_PI 3.14159265359
  55. #endif
  56. double Friis(double Pt, double Gt, double Gr, double lambda, double L, double d)
  57. {
  58.         /*
  59.          * Friis free space propagation equation:
  60.          *
  61.          *       Pt * Gt * Gr * (lambda^2)
  62.          *   P = --------------------------
  63.          *       (4 *pi * d)^2 * L
  64.          */
  65.   double M = lambda / (4 * M_PI * d);
  66.   return (Pt * Gt * Gr * (M * M)) / L;
  67. }
  68. double TwoRay(double Pt, double Gt, double Gr, double ht, double hr, double L, double d, double lambda)
  69. {
  70.         /*
  71.          *  if d < crossover_dist, use Friis free space model
  72.          *  if d >= crossover_dist, use two ray model
  73.          *
  74.          *  Two-ray ground reflection model.
  75.          *
  76.          *      Pt * Gt * Gr * (ht^2 * hr^2)
  77.          *  Pr = ----------------------------
  78.          *           d^4 * L
  79.          *
  80.          * The original equation in Rappaport's book assumes L = 1.
  81.          * To be consistant with the free space equation, L is added here.
  82.          */
  83. double Pr;  // received power
  84. double crossover_dist = (4 * M_PI * ht * hr) / lambda;
  85. if (d < crossover_dist)
  86. Pr = Friis(Pt, Gt, Gr, lambda, L, d);
  87. else
  88. Pr = Pt * Gt * Gr * (hr * hr * ht * ht) / (d * d * d * d * L);
  89. return Pr;
  90. }
  91. // inverse of complementary error function
  92. // y = erfc(x) --> x = inv_erfc(y)
  93. double inv_erfc(double y)
  94. {
  95.     double s, t, u, w, x, z;
  96.     z = y;
  97.     if (y > 1) {
  98.         z = 2 - y;
  99.     }
  100.     w = 0.916461398268964 - log(z);
  101.     u = sqrt(w);
  102.     s = (log(u) + 0.488826640273108) / w;
  103.     t = 1 / (u + 0.231729200323405);
  104.     x = u * (1 - s * (s * 0.124610454613712 + 0.5)) -
  105.         ((((-0.0728846765585675 * t + 0.269999308670029) * t +
  106.         0.150689047360223) * t + 0.116065025341614) * t +
  107.         0.499999303439796) * t;
  108.     t = 3.97886080735226 / (x + 3.97886080735226);
  109.     u = t - 0.5;
  110.     s = (((((((((0.00112648096188977922 * u +
  111.         1.05739299623423047e-4) * u - 0.00351287146129100025) * u -
  112.         7.71708358954120939e-4) * u + 0.00685649426074558612) * u +
  113.         0.00339721910367775861) * u - 0.011274916933250487) * u -
  114.         0.0118598117047771104) * u + 0.0142961988697898018) * u +
  115.         0.0346494207789099922) * u + 0.00220995927012179067;
  116.     s = ((((((((((((s * u - 0.0743424357241784861) * u -
  117.         0.105872177941595488) * u + 0.0147297938331485121) * u +
  118.         0.316847638520135944) * u + 0.713657635868730364) * u +
  119.         1.05375024970847138) * u + 1.21448730779995237) * u +
  120.         1.16374581931560831) * u + 0.956464974744799006) * u +
  121.         0.686265948274097816) * u + 0.434397492331430115) * u +
  122.         0.244044510593190935) * t -
  123.         z * exp(x * x - 0.120782237635245222);
  124.     x += s * (x * s + 1);
  125.     if (y > 1) {
  126.         x = -x;
  127.     }
  128.     return x;
  129. }
  130. // Inverse of Q-function
  131. // y = Q(x) --> x = inv_Q(y)
  132. double inv_Q(double y)
  133. {
  134. double x;
  135. x = sqrt(2.0) * inv_erfc(2.0 * y);
  136. return x;
  137. }
  138. int main(int argc, char** argv)
  139. {
  140. // specify default values
  141. char** propModel = NULL;       // propagation model
  142. double Pt = 0.28183815;            // transmit power
  143. double Gt = 1.0;               // transmit antenna gain
  144. double Gr = 1.0;               // receive antenna
  145. double freq = 914.0e6;         // frequency
  146. double sysLoss = 1.0;          // system loss
  147. // for two-ray model
  148. double ht = 1.5;               // transmit antenna height
  149. double hr = 1.5;               // receive antenna height
  150. // for shadowing model
  151. double pathlossExp_ = 2.0;     // path loss exponent
  152. double std_db_ = 4.0;          // shadowing deviation
  153. double dist0_ = 1.0;           // reference distance
  154. double prob = 0.95;            // correct reception rate
  155. double rxThresh_;              // receiving threshold
  156. // check arguments
  157. if (argc < 4) {
  158. cout << "USAGE: find receiving threshold for certain communication range (distance)" << endl;
  159. cout << endl;
  160. cout << "SYNOPSIS: threshold -m <propagation-model> [other-options] distance" << endl;
  161. cout << endl;
  162. cout << "<propagation-model>: FreeSpace, TwoRayGround or Shadowing" << endl;
  163. cout << "[other-options]: set parameters other than default values:" << endl;
  164. cout << endl << "Common parameters:" << endl;
  165. cout << "-Pt <transmit-power>" << endl;
  166. cout << "-fr <frequency>" << endl;
  167. cout << "-Gt <transmit-antenna-gain>" << endl;
  168. cout << "-Gr <receive-antenna-gain>" << endl;
  169. cout << "-L <system-loss>" << endl;
  170. cout << endl << "For two-ray ground model:" << endl;
  171. cout << "-ht <transmit-antenna-height>" << endl;
  172. cout << "-hr <receive-antenna-height>" << endl;
  173. cout << endl << "For shadowing model:" << endl;
  174. cout << "-pl <path-loss-exponent>" << endl;
  175. cout << "-std <shadowing-deviation>" << endl;
  176. cout << "-d0 <reference-distance>" << endl;
  177. cout << "-r <receiving-rate>" << endl;
  178. return 0;
  179. }
  180. // parse arguments
  181. double dist = atof(argv[argc-1]);
  182. cout << "distance = " << dist << endl;
  183. int argCount = (argc - 2) / 2;   // number of parameters
  184. argv++;
  185. for (int i = 0; i < argCount; i++) {
  186.         if(!strcmp(*argv,"-m")) {          // propagation model
  187.      propModel = argv + 1;
  188.      cout << "propagation model: " << *propModel << endl;
  189.     }
  190.         if(!strcmp(*argv,"-Pt")) {        // transmit power
  191.             Pt = atof(*(argv + 1));
  192.         }
  193.         if(!strcmp(*argv,"-fr")) {        // frequency
  194.             freq = atof(*(argv + 1));
  195.         }
  196.         if(!strcmp(*argv,"-Gt")) {        // transmit antenna gain
  197.             Gt = atof(*(argv + 1));
  198.         }
  199.         if(!strcmp(*argv,"-Gr")) {        // receive antenna gain
  200.             Gr = atof(*(argv + 1));
  201.         }
  202.         if(!strcmp(*argv,"-L")) {        // system loss
  203.             sysLoss = atof(*(argv + 1));
  204.     }
  205.         if(!strcmp(*argv,"-ht")) {        // transmit antenna height (Two ray model)
  206.             ht = atof(*(argv + 1));
  207.     }
  208.         if(!strcmp(*argv,"-hr")) {        // receive antenna height (Two ray model)
  209.             hr = atof(*(argv + 1));
  210.     }
  211.         if(!strcmp(*argv,"-pl")) {        // path loss exponent (Shadowing model)
  212.             pathlossExp_ = atof(*(argv + 1));
  213.         }
  214.         if(!strcmp(*argv,"-std")) {        // shadowing deviation (Shadowing model)
  215.             std_db_ = atof(*(argv + 1));
  216.         }
  217.         if(!strcmp(*argv,"-d0")) {        // close-in reference distance (Shadowing model)
  218.             dist0_ = atof(*(argv + 1));
  219.     }
  220.         if(!strcmp(*argv,"-r")) {        // rate of correct reception (Shadowing model)
  221.             prob = atof(*(argv + 1));
  222.         }
  223.     argv += 2;
  224. }
  225. if (propModel == NULL) {
  226. cout << "Must specify propagation model: -m <propagation model>" << endl;
  227. return 0;
  228. }
  229. double lambda = 3.0e8/freq;
  230. // compute threshold
  231. if (!strcmp(*propModel, "FreeSpace")) {
  232. rxThresh_ = Friis(Pt, Gt, Gr, lambda, sysLoss, dist);
  233. cout << endl << "Selected parameters:" << endl;
  234.         cout << "transmit power: " << Pt << endl;
  235.         cout << "frequency: " << freq << endl;
  236.         cout << "transmit antenna gain: " << Gt << endl;
  237.         cout << "receive antenna gain: " << Gr << endl;
  238.         cout << "system loss: " << sysLoss << endl;
  239. } else if (!strcmp(*propModel, "TwoRayGround")) {
  240. rxThresh_ = TwoRay(Pt, Gt, Gr, ht, hr, sysLoss, dist, lambda);
  241. cout << endl << "Selected parameters:" << endl;
  242.         cout << "transmit power: " << Pt << endl;
  243.         cout << "frequency: " << freq << endl;
  244.         cout << "transmit antenna gain: " << Gt << endl;
  245.         cout << "receive antenna gain: " << Gr << endl;
  246.         cout << "system loss: " << sysLoss << endl;
  247.         cout << "transmit antenna height: " << ht << endl;
  248.         cout << "receive antenna height: " << hr << endl;
  249. } else if (!strcmp(*propModel, "Shadowing")) {
  250. // calculate receiving power at reference distance
  251. double Pr0 = Friis(Pt, Gt, Gr, lambda, sysLoss, dist0_);
  252. // calculate average power loss predicted by path loss model
  253. double avg_db = -10.0 * pathlossExp_ * log10(dist/dist0_);
  254. // calculate the the threshold
  255. double invq = inv_Q(prob);
  256. double threshdb = invq * std_db_ + avg_db;
  257. rxThresh_ = Pr0 * pow(10.0, threshdb/10.0);
  258. #ifdef DEBUG
  259. cout << "Pr0 = " << Pr0 << endl;
  260. cout << "avg_db = " << avg_db << endl;
  261. cout << "invq = " << invq << endl;
  262. cout << "threshdb = " << threshdb << endl;
  263. #endif
  264. cout << endl << "Selected parameters:" << endl;
  265.         cout << "transmit power: " << Pt << endl;
  266.         cout << "frequency: " << freq << endl;
  267.         cout << "transmit antenna gain: " << Gt << endl;
  268.         cout << "receive antenna gain: " << Gr << endl;
  269.         cout << "system loss: " << sysLoss << endl;
  270.         cout << "path loss exp.: " << pathlossExp_ << endl;
  271.         cout << "shadowing deviation: " << std_db_ << endl;
  272.         cout << "close-in reference distance: " << dist0_ << endl;
  273.         cout << "receiving rate: " << prob << endl;
  274.     } else {
  275.      cout << "Error: unknown propagation model." << endl;
  276.      cout << "Available model: FreeSpace, TwoRayGround, Shadowing" << endl;
  277.      return 0;
  278.     }
  279. cout << endl << "Receiving threshold RXThresh_ is: " << rxThresh_ << endl;
  280. }