5G-LENA nr-v4.0
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-error-model.cc
1// Copyright (c) 2018 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
2//
3// SPDX-License-Identifier: GPL-2.0-only
4
5#include "nr-error-model.h"
6
7#include "ns3/log.h"
8
9namespace ns3
10{
11
12NS_LOG_COMPONENT_DEFINE("NrErrorModel");
13NS_OBJECT_ENSURE_REGISTERED(NrErrorModel);
14
16 : Object()
17{
18 NS_LOG_FUNCTION(this);
19}
20
24
25TypeId
27{
28 static TypeId tid = TypeId("ns3::NrErrorModel").SetParent<Object>();
29 return tid;
30}
31
32Ptr<NrErrorModelOutput>
33NrErrorModel::GetTbDecodificationStatsMimo(const std::vector<MimoSinrChunk>& sinrChunks,
34 const std::vector<int>& map,
35 uint32_t size,
36 uint8_t mcs,
37 uint8_t rank,
38 const NrErrorModelHistory& history)
39{
40 NS_ASSERT_MSG(!sinrChunks.empty(), "At least one SINR value is required");
41
42 // Compute time-domain average of the SINR matrix
43 auto avgSinrMat = ComputeAvgSinrMimo(sinrChunks);
44 NS_ASSERT(avgSinrMat.GetNumRows() == rank);
45
46 // Vectorize SINR matrix and convert to SpectrumValue
51 auto vectorizedSinr = avgSinrMat.GetVectorizedSpecVal();
52
53 // Create a new RB map that fits the vectorized SINR values
54 auto vectorizedMap = CreateVectorizedRbMap(map, rank);
55
56 return GetTbDecodificationStats(vectorizedSinr, vectorizedMap, size, mcs, history);
57}
58
60NrErrorModel::ComputeAvgSinrMimo(const std::vector<MimoSinrChunk>& sinrChunks)
61{
62 NS_ASSERT(!sinrChunks.empty());
63 if (sinrChunks.size() == 1)
64 {
65 return sinrChunks[0].mimoSinr; // Single value, no need to compute an average
66 }
67 auto nRbs = sinrChunks[0].mimoSinr.GetNumCols();
68 auto rank = sinrChunks[0].mimoSinr.GetNumRows();
69 auto totDur = double{0.0};
70 auto avgSinrMat = DoubleMatrixArray{rank, nRbs};
71 for (const auto& chunk : sinrChunks)
72 {
73 const auto& sinrMat = chunk.mimoSinr;
74 NS_ASSERT(sinrMat.GetNumRows() == avgSinrMat.GetNumRows());
75 NS_ASSERT(sinrMat.GetNumCols() == avgSinrMat.GetNumCols());
76 avgSinrMat += sinrMat * chunk.dur.GetDouble();
77 totDur += chunk.dur.GetDouble();
78 }
79 return NrSinrMatrix{avgSinrMat * (1.0 / totDur)};
80}
81
82std::vector<int>
83NrErrorModel::CreateVectorizedRbMap(std::vector<int> map, uint8_t rank)
84{
85 auto vectorizedMap = std::vector<int>{};
86 for (int iRb : map)
87 {
88 for (size_t layer = 0; layer < rank; layer++)
89 {
90 vectorizedMap.emplace_back(iRb * rank + layer);
91 }
92 }
93 return vectorizedMap;
94}
95
96} // namespace ns3
virtual Ptr< NrErrorModelOutput > GetTbDecodificationStatsMimo(const std::vector< MimoSinrChunk > &mimoChunks, const std::vector< int > &map, uint32_t size, uint8_t mcs, uint8_t rank, const NrErrorModelHistory &history)
Get an output for the decoding error probability of a given transport block. This method is not purel...
std::vector< Ptr< NrErrorModelOutput > > NrErrorModelHistory
Vector of previous output.
std::vector< int > CreateVectorizedRbMap(std::vector< int > map, uint8_t rank)
Create an equivalent RB index map for vectorized SINR values Matches layer-to-codeword mapping in TR ...
NrErrorModel()
NrErrorModel default constructor.
static TypeId GetTypeId()
GetTypeId.
virtual Ptr< NrErrorModelOutput > GetTbDecodificationStats(const SpectrumValue &sinr, const std::vector< int > &map, uint32_t size, uint8_t mcs, const NrErrorModelHistory &history)=0
Get an output for the decodification error probability of a given transport block.
virtual NrSinrMatrix ComputeAvgSinrMimo(const std::vector< MimoSinrChunk > &sinrChunks)
Compute an average SINR matrix.
~NrErrorModel() override
deconstructor
NrSinrMatrix stores the MIMO SINR matrix, with dimension rank x nRbs.