src/lte/model/lte-spectrum-value-helper.cc
changeset 8148 09e2d03022a2
parent 8106 65bf071cf610
child 8253 6faee3d1d1d0
equal deleted inserted replaced
8147:f1ac70457c42 8148:09e2d03022a2
    36  * The table was converted to C syntax doing a cut & paste from TS 36.101 and running the following filter:
    36  * The table was converted to C syntax doing a cut & paste from TS 36.101 and running the following filter:
    37  * awk '{if ((NR % 7) == 1) printf("{"); printf ("%s",$0); if ((NR % 7) == 0) printf("},\n"); else printf(", ");}' | sed 's/ – /, /g' 
    37  * awk '{if ((NR % 7) == 1) printf("{"); printf ("%s",$0); if ((NR % 7) == 0) printf("},\n"); else printf(", ");}' | sed 's/ – /, /g' 
    38  */
    38  */
    39 struct EutraChannelNumbers
    39 struct EutraChannelNumbers
    40 {
    40 {
    41   uint8_t band;  
    41   uint8_t band;
    42   double fDlLow;    
    42   double fDlLow;
    43   uint16_t nOffsDl; 
    43   uint16_t nOffsDl; 
    44   uint16_t rangeNdl1;
    44   uint16_t rangeNdl1;
    45   uint16_t rangeNdl2;
    45   uint16_t rangeNdl2;
    46   double fUlLow;    
    46   double fUlLow;
    47   uint16_t nOffsUl; 
    47   uint16_t nOffsUl; 
    48   uint16_t rangeNul1;
    48   uint16_t rangeNul1;
    49   uint16_t rangeNul2;  
    49   uint16_t rangeNul2;
    50 } g_eutraChannelNumbers[] = {
    50 } g_eutraChannelNumbers[] = {
    51   {1, 2110, 0, 0, 599, 1920, 18000, 18000, 18599},
    51   { 1, 2110, 0, 0, 599, 1920, 18000, 18000, 18599},
    52   {2, 1930, 600, 600, 1199, 1850, 18600, 18600, 19199},
    52   { 2, 1930, 600, 600, 1199, 1850, 18600, 18600, 19199},
    53   {3, 1805, 1200, 1200, 1949, 1710, 19200, 19200, 19949},
    53   { 3, 1805, 1200, 1200, 1949, 1710, 19200, 19200, 19949},
    54   {4, 2110, 1950, 1950, 2399, 1710, 19950, 19950, 20399},
    54   { 4, 2110, 1950, 1950, 2399, 1710, 19950, 19950, 20399},
    55   {5, 869, 2400, 2400, 2649, 824, 20400, 20400, 20649},
    55   { 5, 869, 2400, 2400, 2649, 824, 20400, 20400, 20649},
    56   {6, 875, 2650, 2650, 2749, 830, 20650, 20650, 20749},
    56   { 6, 875, 2650, 2650, 2749, 830, 20650, 20650, 20749},
    57   {7, 2620, 2750, 2750, 3449, 2500, 20750, 20750, 21449},
    57   { 7, 2620, 2750, 2750, 3449, 2500, 20750, 20750, 21449},
    58   {8, 925, 3450, 3450, 3799, 880, 21450, 21450, 21799},
    58   { 8, 925, 3450, 3450, 3799, 880, 21450, 21450, 21799},
    59   {9, 1844.9, 3800, 3800, 4149, 1749.9, 21800, 21800, 22149},
    59   { 9, 1844.9, 3800, 3800, 4149, 1749.9, 21800, 21800, 22149},
    60   {10, 2110, 4150, 4150, 4749, 1710, 22150, 22150, 22749},
    60   { 10, 2110, 4150, 4150, 4749, 1710, 22150, 22150, 22749},
    61   {11, 1475.9, 4750, 4750, 4949, 1427.9, 22750, 22750, 22949},
    61   { 11, 1475.9, 4750, 4750, 4949, 1427.9, 22750, 22750, 22949},
    62   {12, 728, 5000, 5000, 5179, 698, 23000, 23000, 23179},
    62   { 12, 728, 5000, 5000, 5179, 698, 23000, 23000, 23179},
    63   {13, 746, 5180, 5180, 5279, 777, 23180, 23180, 23279},
    63   { 13, 746, 5180, 5180, 5279, 777, 23180, 23180, 23279},
    64   {14, 758, 5280, 5280, 5379, 788, 23280, 23280, 23379},
    64   { 14, 758, 5280, 5280, 5379, 788, 23280, 23280, 23379},
    65   {17, 734, 5730, 5730, 5849, 704, 23730, 23730, 23849},
    65   { 17, 734, 5730, 5730, 5849, 704, 23730, 23730, 23849},
    66   {18, 860, 5850, 5850, 5999, 815, 23850, 23850, 23999},
    66   { 18, 860, 5850, 5850, 5999, 815, 23850, 23850, 23999},
    67   {19, 875, 6000, 6000, 6149, 830, 24000, 24000, 24149},
    67   { 19, 875, 6000, 6000, 6149, 830, 24000, 24000, 24149},
    68   {20, 791, 6150, 6150, 6449, 832, 24150, 24150 - 24449},
    68   { 20, 791, 6150, 6150, 6449, 832, 24150, 24150 - 24449},
    69   {21, 1495.9, 6450, 6450, 6599, 1447.9, 24450, 24450, 24599},
    69   { 21, 1495.9, 6450, 6450, 6599, 1447.9, 24450, 24450, 24599},
    70   {33, 1900, 36000, 36000, 36199, 1900, 36000, 36000, 36199},
    70   { 33, 1900, 36000, 36000, 36199, 1900, 36000, 36000, 36199},
    71   {34, 2010, 36200, 36200, 36349, 2010, 36200, 36200, 36349},
    71   { 34, 2010, 36200, 36200, 36349, 2010, 36200, 36200, 36349},
    72   {35, 1850, 36350, 36350, 36949, 1850, 36350, 36350, 36949},
    72   { 35, 1850, 36350, 36350, 36949, 1850, 36350, 36350, 36949},
    73   {36, 1930, 36950, 36950, 37549, 1930, 36950, 36950, 37549},
    73   { 36, 1930, 36950, 36950, 37549, 1930, 36950, 36950, 37549},
    74   {37, 1910, 37550, 37550, 37749, 1910, 37550, 37550, 37749},
    74   { 37, 1910, 37550, 37550, 37749, 1910, 37550, 37550, 37749},
    75   {38, 2570, 37750, 37750, 38249, 2570, 37750, 37750, 38249},
    75   { 38, 2570, 37750, 37750, 38249, 2570, 37750, 37750, 38249},
    76   {39, 1880, 38250, 38250, 38649, 1880, 38250, 38250, 38649},
    76   { 39, 1880, 38250, 38250, 38649, 1880, 38250, 38250, 38649},
    77   {40, 2300, 38650, 38650, 39649, 2300, 38650, 38650, 39649}
    77   { 40, 2300, 38650, 38650, 39649, 2300, 38650, 38650, 39649}
    78 };
    78 };
    79 
    79 
    80 #define NUM_EUTRA_BANDS (sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers))
    80 #define NUM_EUTRA_BANDS (sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers))
    81 
    81 
    82 double 
    82 double 
    89       return GetDownlinkCarrierFrequency (earfcn);
    89       return GetDownlinkCarrierFrequency (earfcn);
    90     }
    90     }
    91   else 
    91   else 
    92     {
    92     {
    93       // either FDD uplink or TDD (for which uplink & downlink have same frequency)
    93       // either FDD uplink or TDD (for which uplink & downlink have same frequency)
    94       return GetUplinkCarrierFrequency (earfcn);      
    94       return GetUplinkCarrierFrequency (earfcn);
    95     }
    95     }
    96 }
    96 }
    97 
    97 
    98 double 
    98 double 
    99 LteSpectrumValueHelper::GetDownlinkCarrierFrequency (uint16_t nDl)
    99 LteSpectrumValueHelper::GetDownlinkCarrierFrequency (uint16_t nDl)
   100 {
   100 {
   101   NS_LOG_FUNCTION (nDl);
   101   NS_LOG_FUNCTION (nDl);
   102   for (uint16_t i = 0; i < NUM_EUTRA_BANDS; ++i)
   102   for (uint16_t i = 0; i < NUM_EUTRA_BANDS; ++i)
   103     {
   103     {
   104       if ((g_eutraChannelNumbers[i].rangeNdl1 <= nDl) && 
   104       if ((g_eutraChannelNumbers[i].rangeNdl1 <= nDl)
   105           (g_eutraChannelNumbers[i].rangeNdl2 >= nDl))
   105           && (g_eutraChannelNumbers[i].rangeNdl2 >= nDl))
   106         {
   106         {
   107           NS_LOG_LOGIC ("entry " << i << " fDlLow=" << g_eutraChannelNumbers[i].fDlLow);
   107           NS_LOG_LOGIC ("entry " << i << " fDlLow=" << g_eutraChannelNumbers[i].fDlLow);
   108           return 1.0e6 * (g_eutraChannelNumbers[i].fDlLow + 0.1 * (nDl - g_eutraChannelNumbers[i].nOffsDl));
   108           return 1.0e6 * (g_eutraChannelNumbers[i].fDlLow + 0.1 * (nDl - g_eutraChannelNumbers[i].nOffsDl));
   109         }
   109         }
   110     }
   110     }
   116 LteSpectrumValueHelper::GetUplinkCarrierFrequency (uint16_t nUl)
   116 LteSpectrumValueHelper::GetUplinkCarrierFrequency (uint16_t nUl)
   117 {
   117 {
   118   NS_LOG_FUNCTION (nUl);
   118   NS_LOG_FUNCTION (nUl);
   119   for (uint16_t i = 0; i < NUM_EUTRA_BANDS; ++i)
   119   for (uint16_t i = 0; i < NUM_EUTRA_BANDS; ++i)
   120     {
   120     {
   121       if ((g_eutraChannelNumbers[i].rangeNul1 <= nUl) && 
   121       if ((g_eutraChannelNumbers[i].rangeNul1 <= nUl)
   122           (g_eutraChannelNumbers[i].rangeNul2 >= nUl))
   122           && (g_eutraChannelNumbers[i].rangeNul2 >= nUl))
   123         {
   123         {
   124           NS_LOG_LOGIC ("entry " << i << " fUlLow=" << g_eutraChannelNumbers[i].fUlLow);
   124           NS_LOG_LOGIC ("entry " << i << " fUlLow=" << g_eutraChannelNumbers[i].fUlLow);
   125           return 1.0e6 * (g_eutraChannelNumbers[i].fUlLow + 0.1 * (nUl - g_eutraChannelNumbers[i].nOffsUl));
   125           return 1.0e6 * (g_eutraChannelNumbers[i].fUlLow + 0.1 * (nUl - g_eutraChannelNumbers[i].nOffsUl));
   126         }
   126         }
   127     }
   127     }
   143       return 5.0e6;
   143       return 5.0e6;
   144     case 50:
   144     case 50:
   145       return 10.0e6;
   145       return 10.0e6;
   146     case 75:
   146     case 75:
   147       return 15.0e6;
   147       return 15.0e6;
   148     case 100:   
   148     case 100:
   149       return 20.0e6;        
   149       return 20.0e6;
   150     default:
   150     default:
   151       NS_FATAL_ERROR ("invalid bandwidth value " << (uint16_t) transmissionBandwidth);
   151       NS_FATAL_ERROR ("invalid bandwidth value " << (uint16_t) transmissionBandwidth);
   152     }
   152     }
   153 }
   153 }
   154 
   154 
   165 LteSpectrumModelId::LteSpectrumModelId (uint16_t f, uint8_t b)
   165 LteSpectrumModelId::LteSpectrumModelId (uint16_t f, uint8_t b)
   166   : earfcn (f), 
   166   : earfcn (f), 
   167     bandwidth (b)
   167     bandwidth (b)
   168 {
   168 {
   169 }
   169 }
   170   
   170 
   171 bool
   171 bool
   172 operator < (const LteSpectrumModelId& a, const LteSpectrumModelId& b)
   172 operator < (const LteSpectrumModelId& a, const LteSpectrumModelId& b)
   173 {
   173 {
   174   return ( (a.earfcn < b.earfcn) || ( (a.earfcn == b.earfcn) && (a.bandwidth < b.bandwidth) ) );
   174   return ( (a.earfcn < b.earfcn) || ( (a.earfcn == b.earfcn) && (a.bandwidth < b.bandwidth) ) );
   175 }
   175 }
   201           BandInfo rb; 
   201           BandInfo rb; 
   202           rb.fl = f;
   202           rb.fl = f;
   203           f += 90e3;
   203           f += 90e3;
   204           rb.fc = f;
   204           rb.fc = f;
   205           f += 90e3;
   205           f += 90e3;
   206           rb.fh = f;          
   206           rb.fh = f;
   207           rbs.push_back (rb);
   207           rbs.push_back (rb);
   208         }            
   208         }
   209       ret = Create<SpectrumModel> (rbs);
   209       ret = Create<SpectrumModel> (rbs);
   210       g_lteSpectrumModelMap.insert (std::pair<LteSpectrumModelId, Ptr<SpectrumModel> > (key, ret));
   210       g_lteSpectrumModelMap.insert (std::pair<LteSpectrumModelId, Ptr<SpectrumModel> > (key, ret));
   211     }
   211     }
   212   NS_LOG_LOGIC ("returning SpectrumModel::GetUid () == " << ret->GetUid ());
   212   NS_LOG_LOGIC ("returning SpectrumModel::GetUid () == " << ret->GetUid ());
   213   return ret;
   213   return ret;
   230 
   230 
   231 Ptr<SpectrumValue> 
   231 Ptr<SpectrumValue> 
   232 LteSpectrumValueHelper::CreateTxPowerSpectralDensity (uint16_t earfcn, uint8_t txBandwidthConfiguration, double powerTx, std::vector <int> activeRbs)
   232 LteSpectrumValueHelper::CreateTxPowerSpectralDensity (uint16_t earfcn, uint8_t txBandwidthConfiguration, double powerTx, std::vector <int> activeRbs)
   233 {
   233 {
   234   NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << powerTx << activeRbs);
   234   NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << powerTx << activeRbs);
   235   
   235 
   236   Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);  
   236   Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
   237   Ptr<SpectrumValue> txPsd = Create <SpectrumValue> (model);
   237   Ptr<SpectrumValue> txPsd = Create <SpectrumValue> (model);
   238 
   238 
   239   // powerTx is expressed in dBm. We must convert it into natural unit.
   239   // powerTx is expressed in dBm. We must convert it into natural unit.
   240   double powerTxW = pow (10., (powerTx - 30) / 10);
   240   double powerTxW = pow (10., (powerTx - 30) / 10);
   241 
   241 
   256 Ptr<SpectrumValue>
   256 Ptr<SpectrumValue>
   257 LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (uint16_t earfcn, uint8_t txBandwidthConfiguration, double noiseFigure)
   257 LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (uint16_t earfcn, uint8_t txBandwidthConfiguration, double noiseFigure)
   258 {
   258 {
   259   NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << noiseFigure);
   259   NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << noiseFigure);
   260   Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
   260   Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
   261   return  CreateNoisePowerSpectralDensity (noiseFigure, model);
   261   return CreateNoisePowerSpectralDensity (noiseFigure, model);
   262 }
   262 }
   263 
   263 
   264 Ptr<SpectrumValue>
   264 Ptr<SpectrumValue>
   265 LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (double noiseFigureDb, Ptr<SpectrumModel> spectrumModel)
   265 LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (double noiseFigureDb, Ptr<SpectrumModel> spectrumModel)
   266 {
   266 {
   268 
   268 
   269 
   269 
   270   // see "LTE - From theory to practice"
   270   // see "LTE - From theory to practice"
   271   // Section 22.4.4.2 Thermal Noise and Receiver Noise Figure
   271   // Section 22.4.4.2 Thermal Noise and Receiver Noise Figure
   272   const double kT_dBm_Hz = -174.0;  // dBm/Hz
   272   const double kT_dBm_Hz = -174.0;  // dBm/Hz
   273   double kT_W_Hz = pow (10.0, (kT_dBm_Hz - 30)/10.0);
   273   double kT_W_Hz = pow (10.0, (kT_dBm_Hz - 30) / 10.0);
   274   double noiseFigureLinear = pow (10.0, noiseFigureDb / 10.0);  
   274   double noiseFigureLinear = pow (10.0, noiseFigureDb / 10.0);
   275   double noisePowerSpectralDensity =  kT_W_Hz * noiseFigureLinear;
   275   double noisePowerSpectralDensity =  kT_W_Hz * noiseFigureLinear;
   276 
   276 
   277   Ptr<SpectrumValue> noisePsd = Create <SpectrumValue> (spectrumModel);
   277   Ptr<SpectrumValue> noisePsd = Create <SpectrumValue> (spectrumModel);
   278   (*noisePsd) = noisePowerSpectralDensity;
   278   (*noisePsd) = noisePowerSpectralDensity;
   279   return noisePsd;
   279   return noisePsd;