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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2007 Regents of the SIGNET lab, University of Padova.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. Neither the name of the University of Padova (SIGNET lab) nor the 
  14.  *    names of its contributors may be used to endorse or promote products 
  15.  *    derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
  18.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
  19.  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  20.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  21.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  22.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  23.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  24.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  25.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  26.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  27.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29. /* -*- Mode:C++; c-basic-offset:3; tab-width:3; indent-tabs-mode:t -*- */
  30. #ifndef _PER_
  31. #define _PER_
  32. #include <DLList.h>
  33. #include <iostream>
  34. #include <power_profile.h>
  35. #include <packet.h>
  36. #include <stdlib.h>
  37. #include <phymodes.h>
  38. // Packet error due to interference from other transmissions
  39. #define  PKT_ERROR_INTERFERENCE 2
  40. // Packet error due to noise only
  41. #define  PKT_ERROR_NOISE 1
  42. // Error-free packet 
  43. #define   PKT_OK 0  
  44. using namespace std;
  45. /**
  46.  * Struct used for output of data found in PER tables
  47.  * 
  48.  */
  49. struct per_set{
  50. int len[4];
  51. double snr[4];
  52. double per[4];
  53. };
  54. /**
  55.  * Packet Error Rate module to be used within NS Mac modules
  56.  * 
  57.  */
  58. class PER : public TclObject {
  59.  public:
  60.   
  61.   
  62.   DLList* PHYmod[NumPhyModes];
  63.   
  64.   PER();
  65.   ~PER();
  66.   /** 
  67.    * Method for issuing commands within TCL
  68.    * 
  69.    * @param argc 
  70.    * @param argv 
  71.    * 
  72.    * @return TCL_OK or TCL_ERROR
  73.    */  
  74.   int command(int argc, const char*const* argv);
  75.   
  76.   /** 
  77.    * Provides the Packet Error Probability for a given packet and PowerProfile
  78.    * 
  79.    * @param pp pointer to the PowerProfile to be used for noise and interference calculations
  80.    * @param pkt pointer to the packet under examination
  81. * @param snrptr (optional) location where packet SNR (in dB) will be stored
  82. * @param snirptr (optional) location where packet SNIR (in dB) will be stored
  83. * @param interfptr (optional) location where the interfering power (in dBW) will be stored
  84.    * 
  85.    * @return the packet error probability
  86.    */
  87. int get_err(PowerProfile* pp, Packet* pkt, double* snrptr = NULL,  double* snriptr = NULL, double* interfptr = NULL);
  88.   
  89.   /** 
  90.    * Adds a PER value to the inner table in an ascending ordered way
  91.    * 
  92.    * @param phy the PhyMode
  93.    * @param l the packet length in bytes
  94.    * @param snr the signal-to-noise ratio in dB 
  95.    * @param per the corresponding PER value
  96.    */
  97.   void set_per(PhyMode phy, int l , double snr, double per);
  98.   
  99.   /** 
  100.    * This routine take as inputs a PHYmode, a pkt len, 
  101.    * a target SNR and returns the 4 closest entries in the PER table. 
  102.    * Outcomes are set in the per_set struct
  103.    * 
  104.    * @param pm PHYmode
  105.    * @param tsnr target SNR in dB
  106.    * @param tlen pkt len in bytes
  107.    * @param ps_ the output per_set struct. 
  108.    * Each member of this struct is an array of 4 components. 
  109.    * Each component has the following meaning:
  110.    *   - greater or equal length than target one
  111.    *     - [0] greater or equal snr
  112.    *     - [1] smaller snr
  113.    *   - smaller length than target one
  114.    *     - [2] greater or equal snr
  115.    *  - [3] smaller snr
  116.    *
  117.    * 
  118.    * @return 0 on success, 1 if value is not found
  119.    */
  120.   int get_per(PhyMode pm, double tsnr, double tlen, per_set* ps_);
  121.   
  122.   /** 
  123.    * Returns the packet error rate for the given PhyMode, SNR and packet length.
  124.    * 
  125.    * This method retrieves from the PER table the PER values corresponding to the 
  126.    * nearest greater and smaller approximations of SNR and packet length, 
  127.    * and returns a PER value obtained by means of interpolation.
  128.    * 
  129.    * 
  130.    * @param pm the PhyMode
  131.    * @param tsnr the actual SNR
  132.    * @param tlen the actual packet length
  133.    * 
  134.    * @return the interpolated PER
  135.    */
  136.   double get_per(PhyMode pm, double tsnr, double tlen);
  137.   
  138.   /** 
  139.    * Computes the average power for the given time power profile and packet duration
  140.    * 
  141.    * @param pp the given PowerProfile
  142.    * @param duration the duration of the packet. 
  143.    * This is needed since packet transmission might extend over the time of the last
  144.    * sample contained in the PowerProfile.
  145.    * 
  146.    * @return 
  147.    */
  148. double avg(PowerProfile* pp, double duration);
  149.   /** 
  150.    * This routine take as inputs a PHYmode, a pkt len, 
  151.    * a target PER and returns the 4 closest entries in the PER table. 
  152.    * Outcomes are set in the per_set struct
  153.    * 
  154.    * @param pm PHYmode
  155.    * @param tper target PER in [0,1]
  156.    * @param tlen pkt len in bytes
  157.    * @param ps_ the output per_set struct. 
  158.    * Each member of this struct is an array of 4 components. 
  159.    * Each component has the following meaning:
  160.    *   - greater or equal length than target one
  161.    *     - [0] smaller PER
  162.    *     - [1] greater or equalPER
  163.    *   - smaller length than target one
  164.    *     - [2] smaller PER
  165.    *    - [3] greater or equal PER
  166.    *
  167.    * 
  168.    * @return 0 on success, 1 if value is not found
  169.    */
  170.   int get_snr(PhyMode pm, double tper, double tlen, per_set* ps_);
  171.   /** 
  172.    * Returns the SNR for the given PhyMode, PER and packet length.
  173.    * 
  174.    * This method retrieves from the PER table the SNR values corresponding to the 
  175.    * nearest greater and smaller approximations of PER and packet length, 
  176.    * and returns a SNR value obtained by means of interpolation.
  177.    * 
  178.    * 
  179.    * @param pm the PhyMode
  180.    * @param tper the target PER
  181.    * @param tlen the target packet length
  182.    * 
  183.    * @return the interpolated SNR
  184.    */
  185.   double get_snr(PhyMode pm, double tper, double tlen);
  186. void print_data();
  187.  
  188.  protected:
  189. /// Noise power in W (Bandwidth in Hz times No=kT in W/Hz) to be set via TCL
  190. double noise_;
  191.  
  192. /// Debug variable to be set within TCL
  193. int debug_;
  194.  
  195. };
  196. #endif