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