ofdmphy.h
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:5k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #ifndef OFDMPHY_H
  19. #define OFDMPHY_H
  20. #include <packet.h>
  21. #include "wireless-phy.h"
  22. /* Define subcarrier information */
  23. #define NFFT 256
  24. #define NUSED 200 //number of subcarrier used
  25. /** Status of physical layer */
  26. enum Ofdm_phy_state {
  27.   OFDM_IDLE,  /* Module is not doing anything */
  28.   OFDM_SEND,  /* Module is ready to send or sending */
  29.   OFDM_RECV,  /* Module is can receive or is receiving */
  30.   OFDM_RX2TX, /* Module is transitioning from receiving mode to sending mode */
  31.   OFDM_TX2RX  /* Module is transitioning from sending mode to receiving mode */
  32. };
  33. /** Definition of supported rate */
  34. enum Ofdm_mod_rate {
  35.   OFDM_BPSK_1_2,   /* Efficiency is 1 bps/Hz */
  36.   OFDM_QPSK_1_2,   /* Efficiency is 2 bps/Hz */
  37.   OFDM_QPSK_3_4,   /* Efficiency is 2 bps/Hz */
  38.   OFDM_16QAM_1_2,  /* Efficiency is 4 bps/Hz */
  39.   OFDM_16QAM_3_4,  /* Efficiency is 4 bps/Hz */
  40.   OFDM_64QAM_2_3,  /* Efficiency is 6 bps/Hz */
  41.   OFDM_64QAM_3_4,  /* Efficiency is 6 bps/Hz */
  42. };
  43. /**
  44.  * How to compute the number of information bit per symbol:
  45.  * - Each symbol has 192 data subcarrier (200-8 for pilots)
  46.  * - A modulation has a coding rate (1/2, 2/3, or 3/4)
  47.  * - A modulation has an efficiency (1, 2, 4, or 6)
  48.  * - There is a 0x00 tail byte at the end of each OFDM symbol
  49.  * So for BPSK, 192*1*1/2-8=88
  50.  */
  51. enum Ofdm_bit_per_symbol {
  52.   OFDM_BPSK_1_2_bpsymb = 88,   
  53.   OFDM_QPSK_1_2_bpsymb = 184,   
  54.   OFDM_QPSK_3_4_bpsymb = 280,   
  55.   OFDM_16QAM_1_2_bpsymb = 376,  
  56.   OFDM_16QAM_3_4_bpsymb = 578,  
  57.   OFDM_64QAM_2_3_bpsymb = 760,  
  58.   OFDM_64QAM_3_4_bpsymb = 856,  
  59. };
  60. /** 
  61.  * Class OFDMPhy
  62.  * Physical layer implementing OFDM
  63.  */ 
  64. class OFDMPhy : public WirelessPhy {
  65. public:
  66.   OFDMPhy();
  67.   /**
  68.    * Change the frequency at which the phy is operating
  69.    * @param freq The new frequency
  70.    */
  71.   void setFrequency (double freq);
  72.   /**
  73.    * Set the new modulation for the physical layer
  74.    * @param modulation The new physical modulation
  75.    */
  76.   void  setModulation (Ofdm_mod_rate modulation);    
  77.   
  78.   /**
  79.    * Return the current modulation
  80.    */
  81.   Ofdm_mod_rate  getModulation ();
  82.     
  83.   /**
  84.    * Set the new transmitting power
  85.    * @param power The new transmitting power
  86.    */
  87.   void  setTxPower (double power);
  88.   
  89.   /**
  90.    * Return the current transmitting power
  91.    */
  92.   double  getTxPower ();
  93.   
  94.   /**
  95.    * Return the duration of a PS (physical slot), unit for allocation time.
  96.    * Use Frame duration / PS to find the number of available slot per frame
  97.    */
  98.   inline double  getPS () { return (4/fs_); }
  99.     
  100.   /**
  101.    * Return the OFDM symbol duration time
  102.    */
  103.   double getSymbolTime ();
  104.   /**
  105.    * Compute the transmission time for a packet of size sdusize and
  106.    * using the given modulation
  107.    */
  108.   double getTrxTime (int, Ofdm_mod_rate);
  109.   /**
  110.    * Return the maximum size in bytes that can be sent for the given 
  111.    * nb of symbols and modulation
  112.    */
  113.   int getMaxPktSize (double nbsymbols, Ofdm_mod_rate);
  114.   /**
  115.    * Return the number of PS used by an OFDM symbol
  116.    */
  117.   inline int getSymbolPS () { return (int) (ceil (getSymbolTime() / getPS())); }
  118.   /** 
  119.    * Set the mode for physical layer
  120.    */
  121.   void setMode (Ofdm_phy_state mode);
  122.   /**
  123.    * Activate node
  124.    */
  125.   void node_on ();
  126.   
  127.   /**
  128.    * Deactivate node
  129.    */
  130.   void node_off ();
  131. protected:
  132.   /**
  133.    * Update the sampling frequency. Called after changing frequency BW
  134.    */
  135.   void updateFs ();
  136.   /* 
  137.    * Return the delay required for switching for Rx to Tx mode
  138.    */
  139.   //inline double getRx2TxDelay () { return getPS () * rtg_; }
  140.   /* 
  141.    * Return the delay required for switching for Tx to Rx mode
  142.    */
  143.   //inline double getTx2RxDelay () { return getPS () * ttg_; }
  144.   /* Overwritten methods for handling packets */
  145.   void sendDown(Packet *p);
  146.   int sendUp(Packet *p);
  147. private:
  148.   /**
  149.    * The current modulation
  150.    */
  151.    Ofdm_mod_rate modulation_;
  152.   /**
  153.    * The current transmitting power
  154.    */
  155.    int tx_power_;
  156.   /**
  157.    * Ratio of CP time over useful time
  158.    */
  159.    double g_;
  160.   /**
  161.    * The number of PS required to switch from Receiver to Transmitter
  162.    */
  163.    //int rtg_;
  164.   /**
  165.    * The number of PS required to switch from Transmitter to Receiver
  166.    */
  167.    //int ttg_;
  168.    /**
  169.     * The sampling frequency 
  170.     */
  171.    double fs_;
  172.    
  173.    /**
  174.     * The frequency bandwidth (Hz)
  175.     */
  176.    double fbandwidth_;
  177.    
  178.    /**
  179.     * The state of the OFDM
  180.     */
  181.    Ofdm_phy_state state_;
  182.    
  183.    /**
  184.     * Indicates if the node is activated
  185.     */
  186.    bool activated_;
  187.       
  188. };
  189. #endif //OFDMPHY_H