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 |
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... |
31 | namespace std { |
32 | |
33 | ostream& |
34 | operator << (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 | |
48 | namespace ns3 { |
49 | |
50 | NS_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 | */ |
57 | static 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 | |
100 | double |
101 | LteSpectrumValueHelper::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 | |
116 | double |
117 | LteSpectrumValueHelper::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 | |
133 | double |
134 | LteSpectrumValueHelper::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 | |
150 | double |
151 | LteSpectrumValueHelper::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 | |
176 | struct LteSpectrumModelId |
177 | { |
178 | LteSpectrumModelId (uint32_t f, uint8_t b); |
179 | uint32_t earfcn; |
180 | uint8_t bandwidth; |
181 | }; |
182 | |
183 | LteSpectrumModelId::LteSpectrumModelId (uint32_t f, uint8_t b) |
184 | : earfcn (f), |
185 | bandwidth (b) |
186 | { |
187 | } |
188 | |
189 | bool |
190 | operator < (const LteSpectrumModelId& a, const LteSpectrumModelId& b) |
191 | { |
192 | return ( (a.earfcn < b.earfcn) || ( (a.earfcn == b.earfcn) && (a.bandwidth < b.bandwidth) ) ); |
193 | } |
194 | |
195 | |
196 | static std::map<LteSpectrumModelId, Ptr<SpectrumModel> > g_lteSpectrumModelMap; |
197 | |
198 | |
199 | Ptr<SpectrumModel> |
200 | LteSpectrumValueHelper::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 | |
234 | Ptr<SpectrumValue> |
235 | LteSpectrumValueHelper::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 | |
258 | Ptr<SpectrumValue> |
259 | LteSpectrumValueHelper::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 | |
298 | Ptr<SpectrumValue> |
299 | LteSpectrumValueHelper::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 | |
306 | Ptr<SpectrumValue> |
307 | LteSpectrumValueHelper::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 |