changeset 8148 | 09e2d03022a2 |
parent 8106 | 65bf071cf610 |
child 8253 | 6faee3d1d1d0 |
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; |