A Discrete-Event Network Simulator
API
lte-amc.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Original Author: Giuseppe Piro <g.piro@poliba.it>
18 * Modified by: Marco Miozzo <mmiozzo@cttc.es>
19 * Nicola Baldo <nbaldo@cttc.es>
20 */
21
22#include "ns3/enum.h"
23#include <ns3/assert.h>
24#include <ns3/double.h>
25#include <ns3/log.h>
26#include <ns3/lte-amc.h>
27#include <ns3/lte-mi-error-model.h>
28#include <ns3/math.h>
29#include <ns3/spectrum-value.h>
30
31#include <vector>
32
33namespace ns3
34{
35
37
39
47static const double SpectralEfficiencyForCqi[16] = {0.0, // out of range
48 0.15,
49 0.23,
50 0.38,
51 0.6,
52 0.88,
53 1.18,
54 1.48,
55 1.91,
56 2.41,
57 2.73,
58 3.32,
59 3.9,
60 4.52,
61 5.12,
62 5.55};
63
64#if 0 // currently unused
73static const int ModulationSchemeForMcs[32] = {
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
75 4, 4, 4, 4, 4, 4, 4,
76 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
77 2, // reserved
78 4, // reserved
79 6, // reserved
80};
81#endif
82
92static const double SpectralEfficiencyForMcs[32] = {
93 0.15, 0.19, 0.23, 0.31, 0.38, 0.49, 0.6, 0.74, 0.88, 1.03, 1.18, 1.33, 1.48, 1.7, 1.91, 2.16,
94 2.41, 2.57, 2.73, 3.03, 3.32, 3.61, 3.9, 4.21, 4.52, 4.82, 5.12, 5.33, 5.55, 0, 0, 0};
95
101static const int McsToItbsDl[29] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13,
102 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
103
109static const int McsToItbsUl[29] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13,
110 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26};
111
120static const int TransportBlockSizeTable[110][27] = {
121 /* NPRB 001*/ {16, 24, 32, 40, 56, 72, 88, 104, 120, 136, 144, 176, 208, 224,
122 256, 280, 328, 336, 376, 408, 440, 488, 520, 552, 584, 616, 712},
123 /* NPRB 002*/ {32, 56, 72, 104, 120, 144, 176, 224, 256, 296, 328, 376, 440, 488,
124 552, 600, 632, 696, 776, 840, 904, 1000, 1064, 1128, 1192, 1256, 1480},
125 /* NPRB 003*/ {56, 88, 144, 176, 208, 224, 256, 328, 392, 456, 504, 584, 680, 744,
126 840, 904, 968, 1064, 1160, 1288, 1384, 1480, 1608, 1736, 1800, 1864, 2216},
127 /* NPRB 004*/ {88, 144, 176, 208, 256, 328, 392, 472, 536,
128 616, 680, 776, 904, 1000, 1128, 1224, 1288, 1416,
129 1544, 1736, 1864, 1992, 2152, 2280, 2408, 2536, 2984},
130 /* NPRB 005*/ {120, 176, 208, 256, 328, 424, 504, 584, 680,
131 776, 872, 1000, 1128, 1256, 1416, 1544, 1608, 1800,
132 1992, 2152, 2344, 2472, 2664, 2856, 2984, 3112, 3752},
133 /* NPRB 006*/ {152, 208, 256, 328, 408, 504, 600, 712, 808,
134 936, 1032, 1192, 1352, 1544, 1736, 1800, 1928, 2152,
135 2344, 2600, 2792, 2984, 3240, 3496, 3624, 3752, 4392},
136 /* NPRB 007*/ {176, 224, 296, 392, 488, 600, 712, 840, 968,
137 1096, 1224, 1384, 1608, 1800, 1992, 2152, 2280, 2536,
138 2792, 2984, 3240, 3496, 3752, 4008, 4264, 4392, 5160},
139 /* NPRB 008*/ {208, 256, 328, 440, 552, 680, 808, 968, 1096,
140 1256, 1384, 1608, 1800, 2024, 2280, 2472, 2600, 2856,
141 3112, 3496, 3752, 4008, 4264, 4584, 4968, 5160, 5992},
142 /* NPRB 009*/ {224, 328, 376, 504, 632, 776, 936, 1096, 1256,
143 1416, 1544, 1800, 2024, 2280, 2600, 2728, 2984, 3240,
144 3624, 3880, 4136, 4584, 4776, 5160, 5544, 5736, 6712},
145 /* NPRB 010*/ {256, 344, 424, 568, 696, 872, 1032, 1224, 1384,
146 1544, 1736, 2024, 2280, 2536, 2856, 3112, 3240, 3624,
147 4008, 4264, 4584, 4968, 5352, 5736, 5992, 6200, 7480},
148 /* NPRB 011*/ {288, 376, 472, 616, 776, 968, 1128, 1320, 1544,
149 1736, 1928, 2216, 2472, 2856, 3112, 3368, 3624, 4008,
150 4392, 4776, 5160, 5544, 5992, 6200, 6712, 6968, 8248},
151 /* NPRB 012*/ {328, 424, 520, 680, 840, 1032, 1224, 1480, 1672,
152 1864, 2088, 2408, 2728, 3112, 3496, 3624, 3880, 4392,
153 4776, 5160, 5544, 5992, 6456, 6968, 7224, 7480, 8760},
154 /* NPRB 013*/ {344, 456, 568, 744, 904, 1128, 1352, 1608, 1800,
155 2024, 2280, 2600, 2984, 3368, 3752, 4008, 4264, 4776,
156 5160, 5544, 5992, 6456, 6968, 7480, 7992, 8248, 9528},
157 /* NPRB 014*/ {376, 488, 616, 808, 1000, 1224, 1480, 1672, 1928,
158 2216, 2472, 2792, 3240, 3624, 4008, 4264, 4584, 5160,
159 5544, 5992, 6456, 6968, 7480, 7992, 8504, 8760, 10296},
160 /* NPRB 015*/ {392, 520, 648, 872, 1064, 1320, 1544, 1800, 2088,
161 2344, 2664, 2984, 3368, 3880, 4264, 4584, 4968, 5352,
162 5992, 6456, 6968, 7480, 7992, 8504, 9144, 9528, 11064},
163 /* NPRB 016*/ {424, 568, 696, 904, 1128, 1384, 1672, 1928, 2216,
164 2536, 2792, 3240, 3624, 4136, 4584, 4968, 5160, 5736,
165 6200, 6968, 7480, 7992, 8504, 9144, 9912, 10296, 11832},
166 /* NPRB 017*/ {456, 600, 744, 968, 1192, 1480, 1736, 2088, 2344,
167 2664, 2984, 3496, 3880, 4392, 4968, 5160, 5544, 6200,
168 6712, 7224, 7992, 8504, 9144, 9912, 10296, 10680, 12576},
169 /* NPRB 018*/ {488, 632, 776, 1032, 1288, 1544, 1864, 2216, 2536,
170 2856, 3112, 3624, 4136, 4584, 5160, 5544, 5992, 6456,
171 7224, 7736, 8248, 9144, 9528, 10296, 11064, 11448, 13536},
172 /* NPRB 019*/ {504, 680, 840, 1096, 1352, 1672, 1992, 2344, 2664,
173 2984, 3368, 3880, 4392, 4968, 5544, 5736, 6200, 6712,
174 7480, 8248, 8760, 9528, 10296, 11064, 11448, 12216, 14112},
175 /* NPRB 020*/ {536, 712, 872, 1160, 1416, 1736, 2088, 2472, 2792,
176 3112, 3496, 4008, 4584, 5160, 5736, 6200, 6456, 7224,
177 7992, 8504, 9144, 9912, 10680, 11448, 12216, 12576, 14688},
178 /* NPRB 021*/ {568, 744, 936, 1224, 1480, 1864, 2216, 2536, 2984,
179 3368, 3752, 4264, 4776, 5352, 5992, 6456, 6712, 7480,
180 8248, 9144, 9912, 10680, 11448, 12216, 12960, 13536, 15264},
181 /* NPRB 022*/ {600, 776, 968, 1256, 1544, 1928, 2280, 2664, 3112,
182 3496, 3880, 4392, 4968, 5736, 6200, 6712, 7224, 7992,
183 8760, 9528, 10296, 11064, 11832, 12576, 13536, 14112, 16416},
184 /* NPRB 023*/ {616, 808, 1000, 1320, 1608, 2024, 2408, 2792, 3240,
185 3624, 4008, 4584, 5352, 5992, 6456, 6968, 7480, 8248,
186 9144, 9912, 10680, 11448, 12576, 12960, 14112, 14688, 16992},
187 /* NPRB 024*/ {648, 872, 1064, 1384, 1736, 2088, 2472, 2984, 3368,
188 3752, 4264, 4776, 5544, 6200, 6968, 7224, 7736, 8760,
189 9528, 10296, 11064, 12216, 12960, 13536, 14688, 15264, 17568},
190 /* NPRB 025*/ {680, 904, 1096, 1416, 1800, 2216, 2600, 3112, 3496,
191 4008, 4392, 4968, 5736, 6456, 7224, 7736, 7992, 9144,
192 9912, 10680, 11448, 12576, 13536, 14112, 15264, 15840, 18336},
193 /* NPRB 026*/ {712, 936, 1160, 1480, 1864, 2280, 2728, 3240, 3624,
194 4136, 4584, 5352, 5992, 6712, 7480, 7992, 8504, 9528,
195 10296, 11064, 12216, 12960, 14112, 14688, 15840, 16416, 19080},
196 /* NPRB 027*/ {744, 968, 1192, 1544, 1928, 2344, 2792, 3368, 3752,
197 4264, 4776, 5544, 6200, 6968, 7736, 8248, 8760, 9912,
198 10680, 11448, 12576, 13536, 14688, 15264, 16416, 16992, 19848},
199 /* NPRB 028*/ {776, 1000, 1256, 1608, 1992, 2472, 2984, 3368, 3880,
200 4392, 4968, 5736, 6456, 7224, 7992, 8504, 9144, 10296,
201 11064, 12216, 12960, 14112, 15264, 15840, 16992, 17568, 20616},
202 /* NPRB 029*/ {776, 1032, 1288, 1672, 2088, 2536, 2984, 3496, 4008,
203 4584, 5160, 5992, 6712, 7480, 8248, 8760, 9528, 10296,
204 11448, 12576, 13536, 14688, 15840, 16416, 17568, 18336, 21384},
205 /* NPRB 030*/ {808, 1064, 1320, 1736, 2152, 2664, 3112, 3624, 4264,
206 4776, 5352, 5992, 6712, 7736, 8504, 9144, 9912, 10680,
207 11832, 12960, 14112, 15264, 16416, 16992, 18336, 19080, 22152},
208 /* NPRB 031*/ {840, 1128, 1384, 1800, 2216, 2728, 3240, 3752, 4392,
209 4968, 5544, 6200, 6968, 7992, 8760, 9528, 9912, 11064,
210 12216, 13536, 14688, 15840, 16992, 17568, 19080, 19848, 22920},
211 /* NPRB 032*/ {872, 1160, 1416, 1864, 2280, 2792, 3368, 3880, 4584,
212 5160, 5736, 6456, 7224, 8248, 9144, 9912, 10296, 11448,
213 12576, 13536, 14688, 15840, 16992, 18336, 19848, 20616, 23688},
214 /* NPRB 033*/ {904, 1192, 1480, 1928, 2344, 2856, 3496, 4008, 4584,
215 5160, 5736, 6712, 7480, 8504, 9528, 10296, 10680, 11832,
216 12960, 14112, 15264, 16416, 17568, 19080, 19848, 20616, 24496},
217 /* NPRB 034*/ {936, 1224, 1544, 1992, 2408, 2984, 3496, 4136, 4776,
218 5352, 5992, 6968, 7736, 8760, 9912, 10296, 11064, 12216,
219 13536, 14688, 15840, 16992, 18336, 19848, 20616, 21384, 25456},
220 /* NPRB 035*/ {968, 1256, 1544, 2024, 2472, 3112, 3624, 4264, 4968,
221 5544, 6200, 6968, 7992, 9144, 9912, 10680, 11448, 12576,
222 14112, 15264, 16416, 17568, 19080, 19848, 21384, 22152, 25456},
223 /* NPRB 036*/ {1000, 1288, 1608, 2088, 2600, 3112, 3752, 4392, 4968,
224 5736, 6200, 7224, 8248, 9144, 10296, 11064, 11832, 12960,
225 14112, 15264, 16992, 18336, 19080, 20616, 22152, 22920, 26416},
226 /* NPRB 037*/ {1032, 1352, 1672, 2152, 2664, 3240, 3880, 4584, 5160,
227 5736, 6456, 7480, 8504, 9528, 10680, 11448, 12216, 13536,
228 14688, 15840, 16992, 18336, 19848, 21384, 22920, 23688, 27376},
229 /* NPRB 038*/ {1032, 1384, 1672, 2216, 2728, 3368, 4008, 4584, 5352,
230 5992, 6712, 7736, 8760, 9912, 11064, 11832, 12216, 13536,
231 15264, 16416, 17568, 19080, 20616, 22152, 22920, 24496, 28336},
232 /* NPRB 039*/ {1064, 1416, 1736, 2280, 2792, 3496, 4136, 4776, 5544,
233 6200, 6712, 7736, 8760, 9912, 11064, 11832, 12576, 14112,
234 15264, 16992, 18336, 19848, 21384, 22152, 23688, 24496, 29296},
235 /* NPRB 040*/ {1096, 1416, 1800, 2344, 2856, 3496, 4136, 4968, 5544,
236 6200, 6968, 7992, 9144, 10296, 11448, 12216, 12960, 14688,
237 15840, 16992, 18336, 19848, 21384, 22920, 24496, 25456, 29296},
238 /* NPRB 041*/ {1128, 1480, 1800, 2408, 2984, 3624, 4264, 4968, 5736,
239 6456, 7224, 8248, 9528, 10680, 11832, 12576, 13536, 14688,
240 16416, 17568, 19080, 20616, 22152, 23688, 25456, 26416, 30576},
241 /* NPRB 042*/ {1160, 1544, 1864, 2472, 2984, 3752, 4392, 5160, 5992,
242 6712, 7480, 8504, 9528, 10680, 12216, 12960, 13536, 15264,
243 16416, 18336, 19848, 21384, 22920, 24496, 25456, 26416, 30576},
244 /* NPRB 043*/ {1192, 1544, 1928, 2536, 3112, 3752, 4584, 5352, 5992,
245 6712, 7480, 8760, 9912, 11064, 12216, 12960, 14112, 15264,
246 16992, 18336, 19848, 21384, 22920, 24496, 26416, 27376, 31704},
247 /* NPRB 044*/ {1224, 1608, 1992, 2536, 3112, 3880, 4584, 5352, 6200,
248 6968, 7736, 8760, 9912, 11448, 12576, 13536, 14112, 15840,
249 17568, 19080, 20616, 22152, 23688, 25456, 26416, 28336, 32856},
250 /* NPRB 045*/ {1256, 1608, 2024, 2600, 3240, 4008, 4776, 5544, 6200,
251 6968, 7992, 9144, 10296, 11448, 12960, 13536, 14688, 16416,
252 17568, 19080, 20616, 22920, 24496, 25456, 27376, 28336, 32856},
253 /* NPRB 046*/ {1256, 1672, 2088, 2664, 3240, 4008, 4776, 5736, 6456,
254 7224, 7992, 9144, 10680, 11832, 12960, 14112, 14688, 16416,
255 18336, 19848, 21384, 22920, 24496, 26416, 28336, 29296, 34008},
256 /* NPRB 047*/ {1288, 1736, 2088, 2728, 3368, 4136, 4968, 5736, 6456,
257 7480, 8248, 9528, 10680, 12216, 13536, 14688, 15264, 16992,
258 18336, 20616, 22152, 23688, 25456, 27376, 28336, 29296, 35160},
259 /* NPRB 048*/ {1320, 1736, 2152, 2792, 3496, 4264, 4968, 5992, 6712,
260 7480, 8504, 9528, 11064, 12216, 13536, 14688, 15840, 17568,
261 19080, 20616, 22152, 24496, 25456, 27376, 29296, 30576, 35160},
262 /* NPRB 049*/ {1352, 1800, 2216, 2856, 3496, 4392, 5160, 5992, 6968,
263 7736, 8504, 9912, 11064, 12576, 14112, 15264, 15840, 17568,
264 19080, 21384, 22920, 24496, 26416, 28336, 29296, 31704, 36696},
265 /* NPRB 050*/ {1384, 1800, 2216, 2856, 3624, 4392, 5160, 6200, 6968,
266 7992, 8760, 9912, 11448, 12960, 14112, 15264, 16416, 18336,
267 19848, 21384, 22920, 25456, 27376, 28336, 30576, 31704, 36696},
268 /* NPRB 051*/ {1416, 1864, 2280, 2984, 3624, 4584, 5352, 6200, 7224,
269 7992, 9144, 10296, 11832, 12960, 14688, 15840, 16416, 18336,
270 19848, 22152, 23688, 25456, 27376, 29296, 31704, 32856, 37888},
271 /* NPRB 052*/ {1416, 1864, 2344, 2984, 3752, 4584, 5352, 6456, 7224,
272 8248, 9144, 10680, 11832, 13536, 14688, 15840, 16992, 19080,
273 20616, 22152, 24496, 26416, 28336, 29296, 31704, 32856, 37888},
274 /* NPRB 053*/ {1480, 1928, 2344, 3112, 3752, 4776, 5544, 6456, 7480,
275 8248, 9144, 10680, 12216, 13536, 15264, 16416, 16992, 19080,
276 21384, 22920, 24496, 26416, 28336, 30576, 32856, 34008, 39232},
277 /* NPRB 054*/ {1480, 1992, 2408, 3112, 3880, 4776, 5736, 6712, 7480,
278 8504, 9528, 11064, 12216, 14112, 15264, 16416, 17568, 19848,
279 21384, 22920, 25456, 27376, 29296, 30576, 32856, 34008, 40576},
280 /* NPRB 055*/ {1544, 1992, 2472, 3240, 4008, 4776, 5736, 6712, 7736,
281 8760, 9528, 11064, 12576, 14112, 15840, 16992, 17568, 19848,
282 22152, 23688, 25456, 27376, 29296, 31704, 34008, 35160, 40576},
283 /* NPRB 056*/ {1544, 2024, 2536, 3240, 4008, 4968, 5992, 6712, 7736,
284 8760, 9912, 11448, 12576, 14688, 15840, 16992, 18336, 20616,
285 22152, 24496, 26416, 28336, 30576, 31704, 34008, 35160, 40576},
286 /* NPRB 057*/ {1608, 2088, 2536, 3368, 4136, 4968, 5992, 6968, 7992,
287 9144, 9912, 11448, 12960, 14688, 16416, 17568, 18336, 20616,
288 22920, 24496, 26416, 28336, 30576, 32856, 35160, 36696, 42368},
289 /* NPRB 058*/ {1608, 2088, 2600, 3368, 4136, 5160, 5992, 6968, 7992,
290 9144, 10296, 11832, 12960, 14688, 16416, 17568, 19080, 20616,
291 22920, 25456, 27376, 29296, 31704, 32856, 35160, 36696, 42368},
292 /* NPRB 059*/ {1608, 2152, 2664, 3496, 4264, 5160, 6200, 7224, 8248,
293 9144, 10296, 11832, 13536, 15264, 16992, 18336, 19080, 21384,
294 23688, 25456, 27376, 29296, 31704, 34008, 36696, 37888, 43816},
295 /* NPRB 060*/ {1672, 2152, 2664, 3496, 4264, 5352, 6200, 7224, 8504,
296 9528, 10680, 12216, 13536, 15264, 16992, 18336, 19848, 21384,
297 23688, 25456, 28336, 30576, 32856, 34008, 36696, 37888, 43816},
298 /* NPRB 061*/ {1672, 2216, 2728, 3624, 4392, 5352, 6456, 7480, 8504,
299 9528, 10680, 12216, 14112, 15840, 17568, 18336, 19848, 22152,
300 24496, 26416, 28336, 30576, 32856, 35160, 36696, 39232, 45352},
301 /* NPRB 062*/ {1736, 2280, 2792, 3624, 4392, 5544, 6456, 7480, 8760,
302 9912, 11064, 12576, 14112, 15840, 17568, 19080, 19848, 22152,
303 24496, 26416, 29296, 31704, 34008, 35160, 37888, 39232, 45352},
304 /* NPRB 063*/ {1736, 2280, 2856, 3624, 4584, 5544, 6456, 7736, 8760,
305 9912, 11064, 12576, 14112, 16416, 18336, 19080, 20616, 22920,
306 24496, 27376, 29296, 31704, 34008, 36696, 37888, 40576, 46888},
307 /* NPRB 064*/ {1800, 2344, 2856, 3752, 4584, 5736, 6712, 7736, 9144,
308 10296, 11448, 12960, 14688, 16416, 18336, 19848, 20616, 22920,
309 25456, 27376, 29296, 31704, 34008, 36696, 39232, 40576, 46888},
310 /* NPRB 065*/ {1800, 2344, 2856, 3752, 4584, 5736, 6712, 7992, 9144,
311 10296, 11448, 12960, 14688, 16992, 18336, 19848, 21384, 23688,
312 25456, 28336, 30576, 32856, 35160, 37888, 39232, 40576, 48936},
313 /* NPRB 066*/ {1800, 2408, 2984, 3880, 4776, 5736, 6968, 7992, 9144,
314 10296, 11448, 13536, 15264, 16992, 19080, 20616, 21384, 23688,
315 26416, 28336, 30576, 32856, 35160, 37888, 40576, 42368, 48936},
316 /* NPRB 067*/ {1864, 2472, 2984, 3880, 4776, 5992, 6968, 8248, 9528,
317 10680, 11832, 13536, 15264, 16992, 19080, 20616, 22152, 24496,
318 26416, 29296, 31704, 34008, 36696, 37888, 40576, 42368, 48936},
319 /* NPRB 068*/ {1864, 2472, 3112, 4008, 4968, 5992, 6968, 8248, 9528,
320 10680, 11832, 13536, 15264, 17568, 19848, 20616, 22152, 24496,
321 27376, 29296, 31704, 34008, 36696, 39232, 42368, 43816, 51024},
322 /* NPRB 069*/ {1928, 2536, 3112, 4008, 4968, 5992, 7224, 8504, 9528,
323 11064, 12216, 14112, 15840, 17568, 19848, 21384, 22152, 24496,
324 27376, 29296, 31704, 35160, 36696, 39232, 42368, 43816, 51024},
325 /* NPRB 070*/ {1928, 2536, 3112, 4136, 4968, 6200, 7224, 8504, 9912,
326 11064, 12216, 14112, 15840, 18336, 19848, 21384, 22920, 25456,
327 27376, 30576, 32856, 35160, 37888, 40576, 42368, 43816, 52752},
328 /* NPRB 071*/ {1992, 2600, 3240, 4136, 5160, 6200, 7480, 8760, 9912,
329 11064, 12576, 14112, 16416, 18336, 20616, 22152, 22920, 25456,
330 28336, 30576, 32856, 35160, 37888, 40576, 43816, 45352, 52752},
331 /* NPRB 072*/ {1992, 2600, 3240, 4264, 5160, 6200, 7480, 8760, 9912,
332 11448, 12576, 14688, 16416, 18336, 20616, 22152, 23688, 26416,
333 28336, 30576, 34008, 36696, 39232, 40576, 43816, 45352, 52752},
334 /* NPRB 073*/ {2024, 2664, 3240, 4264, 5160, 6456, 7736, 8760, 10296,
335 11448, 12960, 14688, 16416, 19080, 20616, 22152, 23688, 26416,
336 29296, 31704, 34008, 36696, 39232, 42368, 45352, 46888, 55056},
337 /* NPRB 074*/ {2088, 2728, 3368, 4392, 5352, 6456, 7736, 9144, 10296,
338 11832, 12960, 14688, 16992, 19080, 21384, 22920, 24496, 26416,
339 29296, 31704, 34008, 36696, 40576, 42368, 45352, 46888, 55056},
340 /* NPRB 075*/ {2088, 2728, 3368, 4392, 5352, 6712, 7736, 9144, 10680,
341 11832, 12960, 15264, 16992, 19080, 21384, 22920, 24496, 27376,
342 29296, 32856, 35160, 37888, 40576, 43816, 45352, 46888, 55056},
343 /* NPRB 076*/ {2088, 2792, 3368, 4392, 5544, 6712, 7992, 9144, 10680,
344 11832, 13536, 15264, 17568, 19848, 22152, 23688, 24496, 27376,
345 30576, 32856, 35160, 37888, 40576, 43816, 46888, 48936, 55056},
346 /* NPRB 077*/ {2152, 2792, 3496, 4584, 5544, 6712, 7992, 9528, 10680,
347 12216, 13536, 15840, 17568, 19848, 22152, 23688, 25456, 27376,
348 30576, 32856, 35160, 39232, 42368, 43816, 46888, 48936, 57336},
349 /* NPRB 078*/ {2152, 2856, 3496, 4584, 5544, 6968, 8248, 9528, 11064,
350 12216, 13536, 15840, 17568, 19848, 22152, 23688, 25456, 28336,
351 30576, 34008, 36696, 39232, 42368, 45352, 46888, 48936, 57336},
352 /* NPRB 079*/ {2216, 2856, 3496, 4584, 5736, 6968, 8248, 9528, 11064,
353 12576, 14112, 15840, 18336, 20616, 22920, 24496, 25456, 28336,
354 31704, 34008, 36696, 39232, 42368, 45352, 48936, 51024, 57336},
355 /* NPRB 080*/ {2216, 2856, 3624, 4776, 5736, 6968, 8248, 9912, 11064,
356 12576, 14112, 16416, 18336, 20616, 22920, 24496, 26416, 29296,
357 31704, 34008, 36696, 40576, 43816, 45352, 48936, 51024, 59256},
358 /* NPRB 081*/ {2280, 2984, 3624, 4776, 5736, 7224, 8504, 9912, 11448,
359 12960, 14112, 16416, 18336, 20616, 22920, 24496, 26416, 29296,
360 31704, 35160, 37888, 40576, 43816, 46888, 48936, 51024, 59256},
361 /* NPRB 082*/ {2280, 2984, 3624, 4776, 5992, 7224, 8504, 9912, 11448,
362 12960, 14688, 16416, 19080, 21384, 23688, 25456, 26416, 29296,
363 32856, 35160, 37888, 40576, 43816, 46888, 51024, 52752, 59256},
364 /* NPRB 083*/ {2280, 2984, 3752, 4776, 5992, 7224, 8760, 10296, 11448,
365 12960, 14688, 16992, 19080, 21384, 23688, 25456, 27376, 30576,
366 32856, 35160, 39232, 42368, 45352, 46888, 51024, 52752, 61664},
367 /* NPRB 084*/ {2344, 3112, 3752, 4968, 5992, 7480, 8760, 10296, 11832,
368 13536, 14688, 16992, 19080, 21384, 24496, 25456, 27376, 30576,
369 32856, 36696, 39232, 42368, 45352, 48936, 51024, 52752, 61664},
370 /* NPRB 085*/ {2344, 3112, 3880, 4968, 5992, 7480, 8760, 10296, 11832,
371 13536, 14688, 16992, 19080, 22152, 24496, 26416, 27376, 30576,
372 34008, 36696, 39232, 42368, 45352, 48936, 52752, 55056, 61664},
373 /* NPRB 086*/ {2408, 3112, 3880, 4968, 6200, 7480, 9144, 10680, 12216,
374 13536, 15264, 17568, 19848, 22152, 24496, 26416, 28336, 30576,
375 34008, 36696, 40576, 43816, 46888, 48936, 52752, 55056, 63776},
376 /* NPRB 087*/ {2408, 3240, 3880, 5160, 6200, 7736, 9144, 10680, 12216,
377 13536, 15264, 17568, 19848, 22152, 25456, 26416, 28336, 31704,
378 34008, 37888, 40576, 43816, 46888, 51024, 52752, 55056, 63776},
379 /* NPRB 088*/ {2472, 3240, 4008, 5160, 6200, 7736, 9144, 10680, 12216,
380 14112, 15264, 17568, 19848, 22920, 25456, 27376, 28336, 31704,
381 35160, 37888, 40576, 43816, 46888, 51024, 52752, 55056, 63776},
382 /* NPRB 089*/ {2472, 3240, 4008, 5160, 6456, 7736, 9144, 11064, 12576,
383 14112, 15840, 18336, 20616, 22920, 25456, 27376, 29296, 31704,
384 35160, 37888, 42368, 45352, 48936, 51024, 55056, 57336, 66592},
385 /* NPRB 090*/ {2536, 3240, 4008, 5352, 6456, 7992, 9528, 11064, 12576,
386 14112, 15840, 18336, 20616, 22920, 25456, 27376, 29296, 32856,
387 35160, 39232, 42368, 45352, 48936, 51024, 55056, 57336, 66592},
388 /* NPRB 091*/ {2536, 3368, 4136, 5352, 6456, 7992, 9528, 11064, 12576,
389 14112, 15840, 18336, 20616, 23688, 26416, 28336, 29296, 32856,
390 36696, 39232, 42368, 45352, 48936, 52752, 55056, 57336, 66592},
391 /* NPRB 092*/ {2536, 3368, 4136, 5352, 6456, 7992, 9528, 11448, 12960,
392 14688, 16416, 18336, 21384, 23688, 26416, 28336, 30576, 32856,
393 36696, 39232, 42368, 46888, 48936, 52752, 57336, 59256, 68808},
394 /* NPRB 093*/ {2600, 3368, 4136, 5352, 6712, 8248, 9528, 11448, 12960,
395 14688, 16416, 19080, 21384, 23688, 26416, 28336, 30576, 34008,
396 36696, 40576, 43816, 46888, 51024, 52752, 57336, 59256, 68808},
397 /* NPRB 094*/ {2600, 3496, 4264, 5544, 6712, 8248, 9912, 11448, 12960,
398 14688, 16416, 19080, 21384, 24496, 27376, 29296, 30576, 34008,
399 37888, 40576, 43816, 46888, 51024, 55056, 57336, 59256, 68808},
400 /* NPRB 095*/ {2664, 3496, 4264, 5544, 6712, 8248, 9912, 11448, 13536,
401 15264, 16992, 19080, 21384, 24496, 27376, 29296, 30576, 34008,
402 37888, 40576, 43816, 46888, 51024, 55056, 57336, 61664, 71112},
403 /* NPRB 096*/ {2664, 3496, 4264, 5544, 6968, 8504, 9912, 11832, 13536,
404 15264, 16992, 19080, 22152, 24496, 27376, 29296, 31704, 35160,
405 37888, 40576, 45352, 48936, 51024, 55056, 59256, 61664, 71112},
406 /* NPRB 097*/ {2728, 3496, 4392, 5736, 6968, 8504, 10296, 11832, 13536,
407 15264, 16992, 19848, 22152, 25456, 28336, 29296, 31704, 35160,
408 37888, 42368, 45352, 48936, 52752, 55056, 59256, 61664, 71112},
409 /* NPRB 098*/ {2728, 3624, 4392, 5736, 6968, 8760, 10296, 11832, 13536,
410 15264, 16992, 19848, 22152, 25456, 28336, 30576, 31704, 35160,
411 39232, 42368, 45352, 48936, 52752, 57336, 59256, 61664, 73712},
412 /* NPRB 099*/ {2728, 3624, 4392, 5736, 6968, 8760, 10296, 12216, 14112,
413 15840, 17568, 19848, 22920, 25456, 28336, 30576, 31704, 35160,
414 39232, 42368, 46888, 48936, 52752, 57336, 61664, 63776, 73712},
415 /* NPRB 100*/ {2792, 3624, 4584, 5736, 7224, 8760, 10296, 12216, 14112,
416 15840, 17568, 19848, 22920, 25456, 28336, 30576, 32856, 36696,
417 39232, 43816, 46888, 51024, 55056, 57336, 61664, 63776, 75376},
418 /* NPRB 101*/ {2792, 3752, 4584, 5992, 7224, 8760, 10680, 12216, 14112,
419 15840, 17568, 20616, 22920, 26416, 29296, 30576, 32856, 36696,
420 40576, 43816, 46888, 51024, 55056, 57336, 61664, 63776, 75376},
421 /* NPRB 102*/ {2856, 3752, 4584, 5992, 7224, 9144, 10680, 12576, 14112,
422 16416, 18336, 20616, 23688, 26416, 29296, 31704, 32856, 36696,
423 40576, 43816, 46888, 51024, 55056, 59256, 61664, 63776, 75376},
424 /* NPRB 103*/ {2856, 3752, 4584, 5992, 7480, 9144, 10680, 12576, 14688,
425 16416, 18336, 20616, 23688, 26416, 29296, 31704, 34008, 36696,
426 40576, 43816, 48936, 51024, 55056, 59256, 63776, 66592, 75376},
427 /* NPRB 104*/ {2856, 3752, 4584, 5992, 7480, 9144, 10680, 12576, 14688,
428 16416, 18336, 21384, 23688, 26416, 29296, 31704, 34008, 37888,
429 40576, 45352, 48936, 52752, 57336, 59256, 63776, 66592, 75376},
430 /* NPRB 105*/ {2984, 3880, 4776, 6200, 7480, 9144, 11064, 12960, 14688,
431 16416, 18336, 21384, 23688, 27376, 30576, 31704, 34008, 37888,
432 42368, 45352, 48936, 52752, 57336, 59256, 63776, 66592, 75376},
433 /* NPRB 106*/ {2984, 3880, 4776, 6200, 7480, 9528, 11064, 12960, 14688,
434 16992, 18336, 21384, 24496, 27376, 30576, 32856, 34008, 37888,
435 42368, 45352, 48936, 52752, 57336, 61664, 63776, 66592, 75376},
436 /* NPRB 107*/ {2984, 3880, 4776, 6200, 7736, 9528, 11064, 12960, 15264,
437 16992, 19080, 21384, 24496, 27376, 30576, 32856, 35160, 39232,
438 42368, 46888, 48936, 52752, 57336, 61664, 66592, 68808, 75376},
439 /* NPRB 108*/ {2984, 4008, 4776, 6200, 7736, 9528, 11448, 12960, 15264,
440 16992, 19080, 22152, 24496, 27376, 30576, 32856, 35160, 39232,
441 42368, 46888, 51024, 55056, 59256, 61664, 66592, 68808, 75376},
442 /* NPRB 109*/ {2984, 4008, 4968, 6456, 7736, 9528, 11448, 13536, 15264,
443 16992, 19080, 22152, 24496, 28336, 31704, 34008, 35160, 39232,
444 43816, 46888, 51024, 55056, 59256, 61664, 66592, 68808, 75376},
445 /* NPRB 110*/ {3112, 4008, 4968, 6456, 7992, 9528, 11448, 13536, 15264,
446 17568, 19080, 22152, 25456, 28336, 31704, 34008, 35160, 39232,
447 43816, 46888, 51024, 55056, 59256, 63776, 66592, 71112, 75376}
448
449};
450
451LteAmc::LteAmc()
452{
453}
454
455LteAmc::~LteAmc()
456{
457}
458
459TypeId
460LteAmc::GetTypeId()
461{
462 static TypeId tid =
463 TypeId("ns3::LteAmc")
464 .SetParent<Object>()
465 .SetGroupName("Lte")
466 .AddConstructor<LteAmc>()
467 .AddAttribute("Ber",
468 "The requested BER in assigning MCS (default is 0.00005).",
469 DoubleValue(0.00005),
470 MakeDoubleAccessor(&LteAmc::m_ber),
471 MakeDoubleChecker<double>())
472 .AddAttribute(
473 "AmcModel",
474 "AMC model used to assign CQI",
475 EnumValue(LteAmc::MiErrorModel),
476 MakeEnumAccessor(&LteAmc::m_amcModel),
477 MakeEnumChecker(LteAmc::MiErrorModel, "Vienna", LteAmc::PiroEW2010, "PiroEW2010"));
478 return tid;
479}
480
481int
482LteAmc::GetCqiFromSpectralEfficiency(double s)
483{
485 NS_ASSERT_MSG(s >= 0.0, "negative spectral efficiency = " << s);
486 int cqi = 0;
487 while ((cqi < 15) && (SpectralEfficiencyForCqi[cqi + 1] < s))
488 {
489 ++cqi;
490 }
491 NS_LOG_LOGIC("cqi = " << cqi);
492 return cqi;
493}
494
495int
496LteAmc::GetMcsFromCqi(int cqi)
497{
498 NS_LOG_FUNCTION(cqi);
499 NS_ASSERT_MSG(cqi >= 0 && cqi <= 15, "CQI must be in [0..15] = " << cqi);
500 double spectralEfficiency = SpectralEfficiencyForCqi[cqi];
501 int mcs = 0;
502 while ((mcs < 28) && (SpectralEfficiencyForMcs[mcs + 1] <= spectralEfficiency))
503 {
504 ++mcs;
505 }
506 NS_LOG_LOGIC("mcs = " << mcs);
507 return mcs;
508}
509
510int
511LteAmc::GetDlTbSizeFromMcs(int mcs, int nprb)
512{
513 NS_LOG_FUNCTION(mcs);
514
515 NS_ASSERT_MSG(mcs < 29, "MCS=" << mcs);
516 NS_ASSERT_MSG(nprb > 0 && nprb < 111, "NPRB=" << nprb);
517
518 int itbs = McsToItbsDl[mcs];
519 return (TransportBlockSizeTable[nprb - 1][itbs]);
520}
521
522int
523LteAmc::GetUlTbSizeFromMcs(int mcs, int nprb)
524{
525 NS_LOG_FUNCTION(mcs);
526
527 NS_ASSERT_MSG(mcs < 29, "MCS=" << mcs);
528 NS_ASSERT_MSG(nprb > 0 && nprb < 111, "NPRB=" << nprb);
529
530 int itbs = McsToItbsUl[mcs];
531 return (TransportBlockSizeTable[nprb - 1][itbs]);
532}
533
534double
535LteAmc::GetSpectralEfficiencyFromCqi(int cqi)
536{
537 NS_LOG_FUNCTION(cqi);
538 NS_ASSERT_MSG(cqi >= 0 && cqi <= 15, "CQI must be in [0..15] = " << cqi);
539 NS_LOG_LOGIC("Spectral efficiency = " << SpectralEfficiencyForCqi[cqi]);
540 return SpectralEfficiencyForCqi[cqi];
541}
542
543std::vector<int>
544LteAmc::CreateCqiFeedbacks(const SpectrumValue& sinr, uint8_t rbgSize)
545{
546 NS_LOG_FUNCTION(this);
547
548 std::vector<int> cqi;
549 Values::const_iterator it;
550
551 if (m_amcModel == PiroEW2010)
552 {
553 for (it = sinr.ConstValuesBegin(); it != sinr.ConstValuesEnd(); it++)
554 {
555 double sinr_ = (*it);
556 if (sinr_ == 0.0)
557 {
558 cqi.push_back(-1); // SINR == 0 (linear units) means no signal in this RB
559 }
560 else
561 {
562 /*
563 * Compute the spectral efficiency from the SINR
564 * SINR
565 * spectralEfficiency = log2 (1 + -------------------- )
566 * -ln(5*BER)/1.5
567 * NB: SINR must be expressed in linear units
568 */
569
570 double s = log2(1 + (sinr_ / ((-std::log(5.0 * m_ber)) / 1.5)));
571
572 int cqi_ = GetCqiFromSpectralEfficiency(s);
573
574 NS_LOG_LOGIC(" PRB =" << cqi.size() << ", sinr = " << sinr_
575 << " (=" << 10 * std::log10(sinr_) << " dB)"
576 << ", spectral efficiency =" << s << ", CQI = " << cqi_
577 << ", BER = " << m_ber);
578
579 cqi.push_back(cqi_);
580 }
581 }
582 }
583 else if (m_amcModel == MiErrorModel)
584 {
585 NS_LOG_DEBUG(this << " AMC-VIENNA RBG size " << (uint16_t)rbgSize);
586 NS_ASSERT_MSG(rbgSize > 0, " LteAmc-Vienna: RBG size must be greater than 0");
587 std::vector<int> rbgMap;
588 int rbId = 0;
589 for (it = sinr.ConstValuesBegin(); it != sinr.ConstValuesEnd(); it++)
590 {
591 rbgMap.push_back(rbId++);
592 if ((rbId % rbgSize == 0) || ((it + 1) == sinr.ConstValuesEnd()))
593 {
594 uint8_t mcs = 0;
595 TbStats_t tbStats;
596 while (mcs <= 28)
597 {
598 HarqProcessInfoList_t harqInfoList;
599 tbStats = LteMiErrorModel::GetTbDecodificationStats(
600 sinr,
601 rbgMap,
602 (uint16_t)GetDlTbSizeFromMcs(mcs, rbgSize) / 8,
603 mcs,
604 harqInfoList);
605 if (tbStats.tbler > 0.1)
606 {
607 break;
608 }
609 mcs++;
610 }
611 if (mcs > 0)
612 {
613 mcs--;
614 }
615 NS_LOG_DEBUG(this << "\t RBG " << rbId << " MCS " << (uint16_t)mcs << " TBLER "
616 << tbStats.tbler);
617 int rbgCqi = 0;
618 if ((tbStats.tbler > 0.1) && (mcs == 0))
619 {
620 rbgCqi = 0; // any MCS can guarantee the 10 % of BER
621 }
622 else if (mcs == 28)
623 {
624 rbgCqi = 15; // all MCSs can guarantee the 10 % of BER
625 }
626 else
627 {
628 double s = SpectralEfficiencyForMcs[mcs];
629 rbgCqi = 0;
630 while ((rbgCqi < 15) && (SpectralEfficiencyForCqi[rbgCqi + 1] < s))
631 {
632 ++rbgCqi;
633 }
634 }
635 NS_LOG_DEBUG(this << "\t MCS " << (uint16_t)mcs << "-> CQI " << rbgCqi);
636 // fill the cqi vector (per RB basis)
637 for (uint8_t j = 0; j < rbgSize; j++)
638 {
639 cqi.push_back(rbgCqi);
640 }
641 rbgMap.clear();
642 }
643 }
644 }
645
646 return cqi;
647}
648
649} // namespace ns3
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
Hold variables of type enum.
Definition: enum.h:56
Implements the Adaptive Modulation And Coding Scheme.
Definition: lte-amc.h:42
A base class which provides memory management and object aggregation.
Definition: object.h:89
Set of values corresponding to a given SpectrumModel.
Values::const_iterator ConstValuesBegin() const
Values::const_iterator ConstValuesEnd() const
a unique identifier for an interface.
Definition: type-id.h:60
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:86
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition: double.h:43
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Definition: enum.h:205
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static const int TransportBlockSizeTable[110][27]
Table of number of physical resource blocks (NPRB), TBS index (ITBS), and their associated transport ...
Definition: lte-amc.cc:120
static const int McsToItbsUl[29]
Table of MCS index (IMCS) and its TBS index (ITBS).
Definition: lte-amc.cc:109
std::vector< HarqProcessInfoElement_t > HarqProcessInfoList_t
HarqProcessInfoList_t typedef.
Definition: lte-harq-phy.h:44
static const double SpectralEfficiencyForCqi[16]
Table of CQI index and its spectral efficiency.
Definition: lte-amc.cc:47
static const double SpectralEfficiencyForMcs[32]
Table of MCS index and its spectral efficiency.
Definition: lte-amc.cc:92
static const int McsToItbsDl[29]
Table of MCS index (IMCS) and its TBS index (ITBS).
Definition: lte-amc.cc:101
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
Definition: enum.h:163
TbStats_t structure.
double tbler
Transport block BLER.