satellite-residual-interference-elimination.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2018 CNES
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathias Ettinger <mettinger@toulouse.viveris.com>
19  */
20 
22 
24 #include "satellite-utils.h"
25 
26 #include <ns3/double.h>
27 #include <ns3/log.h>
28 #include <ns3/simulator.h>
29 
30 NS_LOG_COMPONENT_DEFINE("SatResidualInterferenceElimination");
31 
32 namespace ns3
33 {
34 
35 NS_OBJECT_ENSURE_REGISTERED(SatResidualInterferenceElimination);
36 
37 TypeId
39 {
40  static TypeId tid =
41  TypeId("ns3::SatResidualInterferenceElimination")
42  .SetParent<SatInterferenceElimination>()
43  .AddConstructor<SatResidualInterferenceElimination>()
44  .AddAttribute(
45  "SamplingError",
46  "Residual sampling error corresponding to E[g(τ)]/g(0) for the simulation",
47  DoubleValue(0.99),
49  MakeDoubleChecker<double>());
50 
51  return tid;
52 }
53 
54 TypeId
56 {
57  return GetTypeId();
58 }
59 
62  m_waveformConf(0),
63  m_samplingError(0.99)
64 {
65  NS_LOG_FUNCTION(this);
66 
67  NS_FATAL_ERROR("SatPhy default constructor is not allowed to use");
68 }
69 
71  Ptr<SatWaveformConf> waveformConf)
73  m_waveformConf(waveformConf),
74  m_samplingError(0.99)
75 {
76  NS_LOG_FUNCTION(this);
77 }
78 
80 {
81  NS_LOG_FUNCTION(this);
82 }
83 
84 void
86  Ptr<SatSignalParameters> packetInterferedWith,
87  Ptr<SatSignalParameters> processedPacket,
88  double EsNo,
89  bool isRegenerative)
90 {
91  NS_LOG_FUNCTION(this);
92 
93  return EliminateInterferences(packetInterferedWith,
94  processedPacket,
95  EsNo,
96  isRegenerative,
97  0.0,
98  1.0);
99 }
100 
101 void
103  Ptr<SatSignalParameters> packetInterferedWith,
104  Ptr<SatSignalParameters> processedPacket,
105  double EsNo,
106  bool isRegenerative,
107  double startTime,
108  double endTime)
109 {
110  NS_LOG_FUNCTION(this);
111 
112  NS_LOG_INFO("Removing interference power of packet from Beam[Carrier] "
113  << processedPacket->m_beamId << "[" << processedPacket->m_carrierId << "] between "
114  << startTime << " and " << endTime);
115  double oldIfPower;
116  double ifPowerToRemove;
119  double residualPower = GetResidualPower(processedPacket, EsNo);
120  double normalizedTime = 0.0;
121  std::vector<std::pair<double, double>> ifPowerPerFragment;
122 
123  if (isRegenerative)
124  {
125  oldIfPower = packetInterferedWith->GetInterferencePower();
126  ifPowerToRemove = processedPacket->m_rxPower_W;
127  ifPowerPerFragment = packetInterferedWith->GetInterferencePowerPerFragment();
128  }
129  else
130  {
131  oldIfPower = packetInterferedWith->GetInterferencePowerInSatellite();
132  ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
133  ifPowerPerFragment = packetInterferedWith->GetInterferencePowerInSatellitePerFragment();
134  }
135 
136  for (std::pair<double, double>& ifPower : ifPowerPerFragment)
137  {
138  normalizedTime += ifPower.first;
139  if (startTime >= normalizedTime)
140  {
141  continue;
142  }
143  else if (endTime < normalizedTime)
144  {
145  break;
146  }
147 
148  ifPower.second -= ifPowerToRemove;
149  ifPower.second += residualPower;
150  if (std::abs(ifPower.second) < 1.0e-30) // std::numeric_limits<double>::epsilon ())
151  {
152  ifPower.second = 0.0;
153  }
154 
155  if (ifPower.second < 0)
156  {
157  NS_FATAL_ERROR("Negative interference");
158  }
159  }
160 
161  if (isRegenerative)
162  {
163  packetInterferedWith->SetInterferencePower(ifPowerPerFragment);
164  }
165  else
166  {
167  packetInterferedWith->SetInterferencePowerInSatellite(ifPowerPerFragment);
168  }
169 
170  NS_LOG_INFO("Interfered packet ifPower went from "
171  << oldIfPower << " to " << SatUtils::ScalarProduct(ifPowerPerFragment));
172 }
173 
174 double
175 SatResidualInterferenceElimination::GetResidualPower(Ptr<SatSignalParameters> processedPacket,
176  double EsNo)
177 {
178  NS_LOG_FUNCTION(this);
179 
180  NS_LOG_INFO("SatResidualInterferenceElimination::GetResidualPower");
181 
182  double ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
183  uint32_t L = GetBurstLengthInSymbols(processedPacket->m_txInfo.waveformId);
184  double sigma_lambda_2 = 1.0 / (8.0 * L * EsNo);
185  double sigma_phy_2 = 1.0 / (2.0 * L * EsNo);
186  return (2.0 + sigma_lambda_2 - (2.0 * m_samplingError * std::exp(-sigma_phy_2 / 2.0))) *
187  ifPowerToRemove;
188 }
189 
190 } // namespace ns3
Abstract class defining interface for interference elimination calculation objects.
void EliminateInterferences(Ptr< SatSignalParameters > packetInterferedWith, Ptr< SatSignalParameters > processedPacket, double EsNo, bool isRegenerative)
Eliminate the residual power of interference for the given packets.
double GetResidualPower(Ptr< SatSignalParameters > processedPacket, double EsNo)
Calculate the residual power of interference for a given packet.
static double ScalarProduct(const std::vector< std::pair< double, double >> &vector)
Scalar product.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.