⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdmphy.cc

📁 This documentation is based on the following versions:- pre-release of the wimax model developed by
💻 CC
字号:
/* This software was developed at the National Institute of Standards and * Technology by employees of the Federal Government in the course of * their official duties. Pursuant to title 17 Section 105 of the United * States Code this software is not subject to copyright protection and * is in the public domain. * NIST assumes no responsibility whatsoever for its use by other parties, * and makes no guarantees, expressed or implied, about its quality, * reliability, or any other characteristic. * <BR> * We would appreciate acknowledgement if the software is used. * <BR> * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING * FROM THE USE OF THIS SOFTWARE. * </PRE></P> * @author  rouil */#include "ofdmphy.h"#include "mac802_16pkt.h"//#define DEBUG_WIMAX 1/** * Tcl hook for creating the physical layer */static class OFDMPhyClass: public TclClass {public:        OFDMPhyClass() : TclClass("Phy/WirelessPhy/OFDM") {}        TclObject* create(int, const char*const*) {                return (new OFDMPhy);        }} class_OfdmPhy;OFDMPhy::OFDMPhy() : WirelessPhy(){  //bind attributes  bind ("g_", &g_);  //bind ("rtg_", &rtg_);  //bind ("ttg_", &ttg_);  //bind ("fbandwidth_", &fbandwidth_);  //default modulation is BPSK  modulation_ = OFDM_BPSK_1_2;  Tcl& tcl = Tcl::instance();  tcl.evalf("Mac/802_16 set fbandwidth_");  fbandwidth_ = atof (tcl.result());   state_ = OFDM_IDLE;  activated_ = true;  updateFs ();}/* * Activate node */void OFDMPhy::node_on (){  activated_ = true;}/* * Deactivate node */void OFDMPhy::node_off (){  activated_ = false;}/** * Change the frequency at which the phy is operating * @param freq The new frequency */void OFDMPhy::setFrequency (double freq){  freq_ = freq;  lambda_ = SPEED_OF_LIGHT / freq_;}/** * Set the new modulation for the physical layer */void OFDMPhy::setModulation (Ofdm_mod_rate modulation) {  modulation_ = modulation;}/** * Return the current modulation */Ofdm_mod_rate OFDMPhy::getModulation () {  return modulation_;}/** * Set the new transmitting power */void OFDMPhy::setTxPower (double power) {  Pt_ = power;}/** * Return the current transmitting power */double OFDMPhy::getTxPower () {  return getPt();}/**  * Update the PS information */void OFDMPhy::updateFs () {  /* The PS=4*Fs with Fs=floor (n.BW/8000)*8000   * and n=8/7 is channel bandwidth multiple of 1.75Mhz   * n=86/75 is channel bandwidth multiple of 1.5Mhz   * n=144/125 is channel bandwidth multiple of 1.25Mhz   * n=316/275 is channel bandwidth multiple of 2.75Mhz   * n=57/50 is channel bandwidth multiple of 2.0Mhz   * n=8/7 for all other cases   */  double n;   if (((int) (fbandwidth_ / 1.75)) * 1.75 == fbandwidth_) {    n = 8.0/7;  } else if (((int) (fbandwidth_ / 1.5)) * 1.5 == fbandwidth_) {    n = 86.0/75;  } else if (((int) (fbandwidth_ / 1.25)) * 1.25 == fbandwidth_) {    n = 144.0/125;  } else if (((int) (fbandwidth_ / 2.75)) * 2.75 == fbandwidth_) {    n = 316.0/275;  } else if (((int) (fbandwidth_ / 2.0)) * 2.0 == fbandwidth_) {    n = 57.0/50;  } else {    n = 8.0/7;  }  fs_ = floor (n*fbandwidth_/8000) * 8000;#ifdef DEBUG_WIMAX  printf ("Fs updated. Bw=%f, n=%f, new value is %e\n", fbandwidth_, n, fs_);#endif}/* * Compute the transmission time for a packet of size sdusize and * using the given modulation * @param sdusize Size in bytes of the data to send * @param mod The modulation to use */double OFDMPhy::getTrxTime (int sdusize, Ofdm_mod_rate mod) {  //we compute the number of symbols required  int nb_symbols, bpsymb;  switch (mod) {  case OFDM_BPSK_1_2:    bpsymb = OFDM_BPSK_1_2_bpsymb;    break;  case OFDM_QPSK_1_2:    bpsymb = OFDM_QPSK_1_2_bpsymb;    break;  case OFDM_QPSK_3_4:    bpsymb = OFDM_QPSK_3_4_bpsymb;    break;  case OFDM_16QAM_1_2:    bpsymb = OFDM_16QAM_1_2_bpsymb;    break;  case OFDM_16QAM_3_4:    bpsymb = OFDM_16QAM_3_4_bpsymb;    break;  case OFDM_64QAM_2_3:    bpsymb = OFDM_64QAM_2_3_bpsymb;    break;  case OFDM_64QAM_3_4:    bpsymb = OFDM_64QAM_3_4_bpsymb;    break;  default:    printf ("Error: unknown modulation: method getTrxTime in file ofdmphy.cc\n");    exit (1);  }#ifdef DEBUG_WIMAX  printf ("Nb symbols=%d\n", (int) (ceil(((double)sdusize*8)/bpsymb)));#endif  nb_symbols = (int) (ceil(((double)sdusize*8)/bpsymb));  return (nb_symbols*getSymbolTime ());}/* * Return the maximum size in bytes that can be sent for the given  * nb symbols and modulation */int OFDMPhy::getMaxPktSize (double nbsymbols, Ofdm_mod_rate mod){  int bpsymb;  switch (mod) {  case OFDM_BPSK_1_2:    bpsymb = OFDM_BPSK_1_2_bpsymb;    break;  case OFDM_QPSK_1_2:    bpsymb = OFDM_QPSK_1_2_bpsymb;    break;  case OFDM_QPSK_3_4:    bpsymb = OFDM_QPSK_3_4_bpsymb;    break;  case OFDM_16QAM_1_2:    bpsymb = OFDM_16QAM_1_2_bpsymb;    break;  case OFDM_16QAM_3_4:    bpsymb = OFDM_16QAM_3_4_bpsymb;    break;  case OFDM_64QAM_2_3:    bpsymb = OFDM_64QAM_2_3_bpsymb;    break;  case OFDM_64QAM_3_4:    bpsymb = OFDM_64QAM_3_4_bpsymb;    break;  default:    printf ("Error: unknown modulation: method getTrxTime in file ofdmphy.cc\n");    exit (1);  }  return (int)(nbsymbols*bpsymb)/8;}/** * Return the OFDM symbol duration time */double OFDMPhy::getSymbolTime () {   //printf ("fs=%e, Subcarrier spacing=%e\n", fs_, fs_/((double)NFFT));  return (1+g_)*((double)NFFT)/fs_; }/* * Set the mode for physical layer * The Mac layer is in charge of know when to change the state by  * request the delay for the Rx2Tx and Tx2Rx */void OFDMPhy::setMode (Ofdm_phy_state mode){  state_ = mode;}/* Redefine the method for sending a packet * Add physical layer information * @param p The packet to be sent */void OFDMPhy::sendDown(Packet *p){  hdr_mac802_16* wph = HDR_MAC802_16(p);  /* Check phy status */  if (state_ != OFDM_SEND) {    printf ("Warning: OFDM not in sending state. Drop packet.\n");    Packet::free (p);    return;  }#ifdef DEBUG_WIMAX  printf ("OFDM phy sending packet. Modulation is %d, cyclic prefix is %f\n", 	  modulation_, g_);#endif   wph->phy_info.freq_ = freq_;  wph->phy_info.modulation_ = modulation_;  wph->phy_info.g_ = g_;  //the packet can be sent  WirelessPhy::sendDown (p);}/* Redefine the method for receiving a packet * Add physical layer information * @param p The packet to be sent */int OFDMPhy::sendUp(Packet *p){  hdr_mac802_16* wph = HDR_MAC802_16(p);  if (!activated_)    return 0;  if (freq_ != wph->phy_info.freq_) {#ifdef DEBUG_WIMAX    printf ("drop packet because frequency is different (%f, %f)\n", freq_,wph->phy_info.freq_);#endif     return 0;  }  /* Check phy status */  if (state_ != OFDM_RECV) {#ifdef DEBUG_WIMAX    printf ("Warning: OFDM phy not in receiving state. Drop packet.\n");#endif     return 0;  }#ifdef DEBUG_WIMAX  printf ("OFDM phy receiving packet with mod=%d and cp=%f\n", wph->phy_info.modulation_,wph->phy_info.g_);#endif     //the packet can be received  return WirelessPhy::sendUp (p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -