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