Bug Summary

File:/tmp/asd-nat/home/nat/Work/ns-3-dev-git/build/../src/lte/model/lte-spectrum-value-helper.cc
Location:line 270, column 10
Description:Value stored to 'txPowerDensity' during its initialization is never read

Annotated Source Code

1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Giuseppe Piro <g.piro@poliba.it>
19 * Nicola Baldo <nbaldo@cttc.es>
20 */
21
22#include <map>
23#include <cmath>
24
25#include <ns3/log.h>
26#include <ns3/fatal-error.h>
27
28#include "lte-spectrum-value-helper.h"
29
30// just needed to log a std::vector<int> properly...
31namespace std {
32
33ostream&
34operator << (ostream& os, const vector<int>& v)
35{
36 vector<int>::const_iterator it = v.begin ();
37 while (it != v.end ())
38 {
39 os << *it << " ";
40 ++it;
41 }
42 os << endl;
43 return os;
44}
45
46}
47
48namespace ns3 {
49
50NS_LOG_COMPONENT_DEFINE ("LteSpectrumValueHelper")static ns3::LogComponent g_log = ns3::LogComponent ("LteSpectrumValueHelper"
, "../src/lte/model/lte-spectrum-value-helper.cc")
;
51
52/**
53 * Table 5.7.3-1 "E-UTRA channel numbers" from 3GPP TS 36.101
54 * The table was converted to C syntax doing a cut & paste from TS 36.101 and running the following filter:
55 * awk '{if ((NR % 7) == 1) printf("{"); printf ("%s",$0); if ((NR % 7) == 0) printf("},\n"); else printf(", ");}' | sed 's/ – /, /g'
56 */
57static const struct EutraChannelNumbers
58{
59 uint8_t band;
60 double fDlLow;
61 uint32_t nOffsDl;
62 uint32_t rangeNdl1;
63 uint32_t rangeNdl2;
64 double fUlLow;
65 uint32_t nOffsUl;
66 uint32_t rangeNul1;
67 uint32_t rangeNul2;
68} g_eutraChannelNumbers[] = {
69 { 1, 2110, 0, 0, 599, 1920, 18000, 18000, 18599},
70 { 2, 1930, 600, 600, 1199, 1850, 18600, 18600, 19199},
71 { 3, 1805, 1200, 1200, 1949, 1710, 19200, 19200, 19949},
72 { 4, 2110, 1950, 1950, 2399, 1710, 19950, 19950, 20399},
73 { 5, 869, 2400, 2400, 2649, 824, 20400, 20400, 20649},
74 { 6, 875, 2650, 2650, 2749, 830, 20650, 20650, 20749},
75 { 7, 2620, 2750, 2750, 3449, 2500, 20750, 20750, 21449},
76 { 8, 925, 3450, 3450, 3799, 880, 21450, 21450, 21799},
77 { 9, 1844.9, 3800, 3800, 4149, 1749.9, 21800, 21800, 22149},
78 { 10, 2110, 4150, 4150, 4749, 1710, 22150, 22150, 22749},
79 { 11, 1475.9, 4750, 4750, 4949, 1427.9, 22750, 22750, 22949},
80 { 12, 728, 5000, 5000, 5179, 698, 23000, 23000, 23179},
81 { 13, 746, 5180, 5180, 5279, 777, 23180, 23180, 23279},
82 { 14, 758, 5280, 5280, 5379, 788, 23280, 23280, 23379},
83 { 17, 734, 5730, 5730, 5849, 704, 23730, 23730, 23849},
84 { 18, 860, 5850, 5850, 5999, 815, 23850, 23850, 23999},
85 { 19, 875, 6000, 6000, 6149, 830, 24000, 24000, 24149},
86 { 20, 791, 6150, 6150, 6449, 832, 24150, 24150, 24449},
87 { 21, 1495.9, 6450, 6450, 6599, 1447.9, 24450, 24450, 24599},
88 { 33, 1900, 36000, 36000, 36199, 1900, 36000, 36000, 36199},
89 { 34, 2010, 36200, 36200, 36349, 2010, 36200, 36200, 36349},
90 { 35, 1850, 36350, 36350, 36949, 1850, 36350, 36350, 36949},
91 { 36, 1930, 36950, 36950, 37549, 1930, 36950, 36950, 37549},
92 { 37, 1910, 37550, 37550, 37749, 1910, 37550, 37550, 37749},
93 { 38, 2570, 37750, 37750, 38249, 2570, 37750, 37750, 38249},
94 { 39, 1880, 38250, 38250, 38649, 1880, 38250, 38250, 38649},
95 { 40, 2300, 38650, 38650, 39649, 2300, 38650, 38650, 39649}
96};
97
98#define NUM_EUTRA_BANDS(sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers
))
(sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers))
99
100double
101LteSpectrumValueHelper::GetCarrierFrequency (uint32_t earfcn)
102{
103 NS_LOG_FUNCTION (earfcn)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
earfcn; std::clog << ")" << std::endl; } } while
(false)
;
104 if (earfcn < 7000)
105 {
106 // FDD downlink
107 return GetDownlinkCarrierFrequency (earfcn);
108 }
109 else
110 {
111 // either FDD uplink or TDD (for which uplink & downlink have same frequency)
112 return GetUplinkCarrierFrequency (earfcn);
113 }
114}
115
116double
117LteSpectrumValueHelper::GetDownlinkCarrierFrequency (uint32_t nDl)
118{
119 NS_LOG_FUNCTION (nDl)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
nDl; std::clog << ")" << std::endl; } } while (false
)
;
120 for (uint16_t i = 0; i < NUM_EUTRA_BANDS(sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers
))
; ++i)
121 {
122 if ((g_eutraChannelNumbers[i].rangeNdl1 <= nDl)
123 && (g_eutraChannelNumbers[i].rangeNdl2 >= nDl))
124 {
125 NS_LOG_LOGIC ("entry " << i << " fDlLow=" << g_eutraChannelNumbers[i].fDlLow)do { if (g_log.IsEnabled (ns3::LOG_LOGIC)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_LOGIC) << "] "; }; std::clog << "entry " <<
i << " fDlLow=" << g_eutraChannelNumbers[i].fDlLow
<< std::endl; } } while (false)
;
126 return 1.0e6 * (g_eutraChannelNumbers[i].fDlLow + 0.1 * (nDl - g_eutraChannelNumbers[i].nOffsDl));
127 }
128 }
129 NS_LOG_ERROR ("invalid EARFCN " << nDl)do { if (g_log.IsEnabled (ns3::LOG_ERROR)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_ERROR) << "] "; }; std::clog << "invalid EARFCN "
<< nDl << std::endl; } } while (false)
;
130 return 0.0;
131}
132
133double
134LteSpectrumValueHelper::GetUplinkCarrierFrequency (uint32_t nUl)
135{
136 NS_LOG_FUNCTION (nUl)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
nUl; std::clog << ")" << std::endl; } } while (false
)
;
137 for (uint16_t i = 0; i < NUM_EUTRA_BANDS(sizeof (g_eutraChannelNumbers) / sizeof (EutraChannelNumbers
))
; ++i)
138 {
139 if ((g_eutraChannelNumbers[i].rangeNul1 <= nUl)
140 && (g_eutraChannelNumbers[i].rangeNul2 >= nUl))
141 {
142 NS_LOG_LOGIC ("entry " << i << " fUlLow=" << g_eutraChannelNumbers[i].fUlLow)do { if (g_log.IsEnabled (ns3::LOG_LOGIC)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_LOGIC) << "] "; }; std::clog << "entry " <<
i << " fUlLow=" << g_eutraChannelNumbers[i].fUlLow
<< std::endl; } } while (false)
;
143 return 1.0e6 * (g_eutraChannelNumbers[i].fUlLow + 0.1 * (nUl - g_eutraChannelNumbers[i].nOffsUl));
144 }
145 }
146 NS_LOG_ERROR ("invalid EARFCN " << nUl)do { if (g_log.IsEnabled (ns3::LOG_ERROR)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_ERROR) << "] "; }; std::clog << "invalid EARFCN "
<< nUl << std::endl; } } while (false)
;
147 return 0.0;
148}
149
150double
151LteSpectrumValueHelper::GetChannelBandwidth (uint8_t transmissionBandwidth)
152{
153 NS_LOG_FUNCTION ((uint16_t) transmissionBandwidth)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
(uint16_t) transmissionBandwidth; std::clog << ")" <<
std::endl; } } while (false)
;
154 switch (transmissionBandwidth)
155 {
156 case 6:
157 return 1.4e6;
158 case 15:
159 return 3.0e6;
160 case 25:
161 return 5.0e6;
162 case 50:
163 return 10.0e6;
164 case 75:
165 return 15.0e6;
166 case 100:
167 return 20.0e6;
168 default:
169 NS_FATAL_ERROR ("invalid bandwidth value " << (uint16_t) transmissionBandwidth)do { std::cerr << "msg=\"" << "invalid bandwidth value "
<< (uint16_t) transmissionBandwidth << "\", "; do
{ std::cerr << "file=" << "../src/lte/model/lte-spectrum-value-helper.cc"
<< ", line=" << 169 << std::endl; ::ns3::FatalImpl
::FlushStreams (); if (true) std::terminate (); } while (false
); } while (false)
;
170 }
171}
172
173
174
175
176struct LteSpectrumModelId
177{
178 LteSpectrumModelId (uint32_t f, uint8_t b);
179 uint32_t earfcn;
180 uint8_t bandwidth;
181};
182
183LteSpectrumModelId::LteSpectrumModelId (uint32_t f, uint8_t b)
184 : earfcn (f),
185 bandwidth (b)
186{
187}
188
189bool
190operator < (const LteSpectrumModelId& a, const LteSpectrumModelId& b)
191{
192 return ( (a.earfcn < b.earfcn) || ( (a.earfcn == b.earfcn) && (a.bandwidth < b.bandwidth) ) );
193}
194
195
196static std::map<LteSpectrumModelId, Ptr<SpectrumModel> > g_lteSpectrumModelMap;
197
198
199Ptr<SpectrumModel>
200LteSpectrumValueHelper::GetSpectrumModel (uint32_t earfcn, uint8_t txBandwidthConfiguration)
201{
202 NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
earfcn << (uint16_t) txBandwidthConfiguration; std::clog
<< ")" << std::endl; } } while (false)
;
203 Ptr<SpectrumModel> ret;
204 LteSpectrumModelId key (earfcn, txBandwidthConfiguration);
205 std::map<LteSpectrumModelId, Ptr<SpectrumModel> >::iterator it = g_lteSpectrumModelMap.find (key);
206 if (it != g_lteSpectrumModelMap.end ())
207 {
208 ret = it->second;
209 }
210 else
211 {
212 double fc = GetCarrierFrequency (earfcn);
213 NS_ASSERT_MSG (fc != 0, "invalid EARFCN=" << earfcn)do { if (!(fc != 0)) { std::cerr << "assert failed. cond=\""
<< "fc != 0" << "\", "; do { std::cerr << "msg=\""
<< "invalid EARFCN=" << earfcn << "\", "; do
{ std::cerr << "file=" << "../src/lte/model/lte-spectrum-value-helper.cc"
<< ", line=" << 213 << std::endl; ::ns3::FatalImpl
::FlushStreams (); if (true) std::terminate (); } while (false
); } while (false); } } while (false)
;
214
215 double f = fc - (txBandwidthConfiguration * 180e3 / 2.0);
216 Bands rbs;
217 for (uint8_t numrb = 0; numrb < txBandwidthConfiguration; ++numrb)
218 {
219 BandInfo rb;
220 rb.fl = f;
221 f += 90e3;
222 rb.fc = f;
223 f += 90e3;
224 rb.fh = f;
225 rbs.push_back (rb);
226 }
227 ret = Create<SpectrumModel> (rbs);
228 g_lteSpectrumModelMap.insert (std::pair<LteSpectrumModelId, Ptr<SpectrumModel> > (key, ret));
229 }
230 NS_LOG_LOGIC ("returning SpectrumModel::GetUid () == " << ret->GetUid ())do { if (g_log.IsEnabled (ns3::LOG_LOGIC)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_LOGIC) << "] "; }; std::clog << "returning SpectrumModel::GetUid () == "
<< ret->GetUid () << std::endl; } } while (false
)
;
231 return ret;
232}
233
234Ptr<SpectrumValue>
235LteSpectrumValueHelper::CreateTxPowerSpectralDensity (uint32_t earfcn, uint8_t txBandwidthConfiguration, double powerTx, std::vector <int> activeRbs)
236{
237 NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << powerTx << activeRbs)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
earfcn << (uint16_t) txBandwidthConfiguration <<
powerTx << activeRbs; std::clog << ")" << std
::endl; } } while (false)
;
238
239 Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
240 Ptr<SpectrumValue> txPsd = Create <SpectrumValue> (model);
241
242 // powerTx is expressed in dBm. We must convert it into natural unit.
243 double powerTxW = std::pow (10., (powerTx - 30) / 10);
244
245 double txPowerDensity = (powerTxW / (txBandwidthConfiguration * 180000));
246
247 for (std::vector <int>::iterator it = activeRbs.begin (); it != activeRbs.end (); it++)
248 {
249 int rbId = (*it);
250 (*txPsd)[rbId] = txPowerDensity;
251 }
252
253 NS_LOG_LOGIC (*txPsd)do { if (g_log.IsEnabled (ns3::LOG_LOGIC)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_LOGIC) << "] "; }; std::clog << *txPsd <<
std::endl; } } while (false)
;
254
255 return txPsd;
256}
257
258Ptr<SpectrumValue>
259LteSpectrumValueHelper::CreateTxPowerSpectralDensity (uint32_t earfcn, uint8_t txBandwidthConfiguration, double powerTx, std::map<int, double> powerTxMap, std::vector <int> activeRbs)
260{
261 NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << activeRbs)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
earfcn << (uint16_t) txBandwidthConfiguration <<
activeRbs; std::clog << ")" << std::endl; } } while
(false)
;
262
263 Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
264 Ptr<SpectrumValue> txPsd = Create <SpectrumValue> (model);
265
266 // powerTx is expressed in dBm. We must convert it into natural unit.
267 double powerTxW = std::pow (10., (powerTx - 30) / 10);
268 double basicPowerTxW = std::pow (10., (powerTx - 30) / 10);
269
270 double txPowerDensity = (powerTxW / (txBandwidthConfiguration * 180000));
Value stored to 'txPowerDensity' during its initialization is never read
271
272 for (std::vector <int>::iterator it = activeRbs.begin (); it != activeRbs.end (); it++)
273 {
274 int rbId = (*it);
275
276 std::map<int, double>::iterator powerIt = powerTxMap.find (rbId);
277
278 if (powerIt != powerTxMap.end ())
279 {
280 powerTxW = std::pow (10., (powerIt->second - 30) / 10);
281 txPowerDensity = (powerTxW / (txBandwidthConfiguration * 180000));
282 }
283 else
284 {
285 txPowerDensity = (basicPowerTxW / (txBandwidthConfiguration * 180000));
286 }
287
288 (*txPsd)[rbId] = txPowerDensity;
289 }
290
291 NS_LOG_LOGIC (*txPsd)do { if (g_log.IsEnabled (ns3::LOG_LOGIC)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) { std
::clog << g_log.Name () << ":" << __FUNCTION__
<< "(): "; }; if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL
)) { std::clog << "[" << g_log.GetLevelLabel (ns3
::LOG_LOGIC) << "] "; }; std::clog << *txPsd <<
std::endl; } } while (false)
;
292
293 return txPsd;
294}
295
296
297
298Ptr<SpectrumValue>
299LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (uint32_t earfcn, uint8_t txBandwidthConfiguration, double noiseFigure)
300{
301 NS_LOG_FUNCTION (earfcn << (uint16_t) txBandwidthConfiguration << noiseFigure)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
earfcn << (uint16_t) txBandwidthConfiguration <<
noiseFigure; std::clog << ")" << std::endl; } } while
(false)
;
302 Ptr<SpectrumModel> model = GetSpectrumModel (earfcn, txBandwidthConfiguration);
303 return CreateNoisePowerSpectralDensity (noiseFigure, model);
304}
305
306Ptr<SpectrumValue>
307LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (double noiseFigureDb, Ptr<SpectrumModel> spectrumModel)
308{
309 NS_LOG_FUNCTION (noiseFigureDb << spectrumModel)do { if (g_log.IsEnabled (ns3::LOG_FUNCTION)) { if (g_log.IsEnabled
(ns3::LOG_PREFIX_TIME)) { ns3::LogTimePrinter printer = ns3::
LogGetTimePrinter (); if (printer != 0) { (*printer)(std::clog
); std::clog << " "; } }; if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE
)) { ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();
if (printer != 0) { (*printer)(std::clog); std::clog <<
" "; } }; ; std::clog << g_log.Name () << ":" <<
__FUNCTION__ << "("; ns3::ParameterLogger (std::clog) <<
noiseFigureDb << spectrumModel; std::clog << ")"
<< std::endl; } } while (false)
;
310
311
312 // see "LTE - From theory to practice"
313 // Section 22.4.4.2 Thermal Noise and Receiver Noise Figure
314 const double kT_dBm_Hz = -174.0; // dBm/Hz
315 double kT_W_Hz = std::pow (10.0, (kT_dBm_Hz - 30) / 10.0);
316 double noiseFigureLinear = std::pow (10.0, noiseFigureDb / 10.0);
317 double noisePowerSpectralDensity = kT_W_Hz * noiseFigureLinear;
318
319 Ptr<SpectrumValue> noisePsd = Create <SpectrumValue> (spectrumModel);
320 (*noisePsd) = noisePowerSpectralDensity;
321 return noisePsd;
322}
323
324} // namespace ns3