Loading...
Searching...
No Matches
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#include <cmath>
31#include <limits>
32#include <utility>
33#include <vector>
34
35NS_LOG_COMPONENT_DEFINE("SatResidualInterferenceElimination");
36
37namespace ns3
38{
39
40NS_OBJECT_ENSURE_REGISTERED(SatResidualInterferenceElimination);
41
42TypeId
44{
45 static TypeId tid =
46 TypeId("ns3::SatResidualInterferenceElimination")
47 .SetParent<SatInterferenceElimination>()
48 .AddConstructor<SatResidualInterferenceElimination>()
49 .AddAttribute(
50 "SamplingError",
51 "Residual sampling error corresponding to E[g(τ)]/g(0) for the simulation",
52 DoubleValue(0.99),
54 MakeDoubleChecker<double>());
55
56 return tid;
57}
58
62 m_samplingError(0.99)
63{
64 NS_LOG_FUNCTION(this);
65
66 NS_FATAL_ERROR("SatPhy default constructor is not allowed to use");
67}
68
70 Ptr<SatWaveformConf> waveformConf)
72 m_waveformConf(waveformConf),
73 m_samplingError(0.99)
74{
75 NS_LOG_FUNCTION(this);
76}
77
82
83void
85 Ptr<SatSignalParameters> packetInterferedWith,
86 Ptr<SatSignalParameters> processedPacket,
87 double EsNo,
88 bool isRegenerative)
89{
90 NS_LOG_FUNCTION(this);
91
92 return EliminateInterferences(packetInterferedWith,
93 processedPacket,
94 EsNo,
95 isRegenerative,
96 0.0,
97 1.0);
98}
99
100void
102 Ptr<SatSignalParameters> packetInterferedWith,
103 Ptr<SatSignalParameters> processedPacket,
104 double EsNo,
105 bool isRegenerative,
106 double startTime,
107 double endTime)
108{
109 NS_LOG_FUNCTION(this);
110
111 NS_LOG_INFO("Removing interference power of packet from Beam[Carrier] "
112 << processedPacket->m_beamId << "[" << processedPacket->m_carrierId << "] between "
113 << startTime << " and " << endTime);
114 double oldIfPower;
115 double ifPowerToRemove;
118 double residualPower = GetResidualPower(processedPacket, EsNo);
119 double normalizedTime = 0.0;
120 std::vector<std::pair<double, double>> ifPowerPerFragment;
121
122 if (isRegenerative)
123 {
124 oldIfPower = packetInterferedWith->GetInterferencePower();
125 ifPowerToRemove = processedPacket->m_rxPower_W;
126 ifPowerPerFragment = packetInterferedWith->GetInterferencePowerPerFragment();
127 }
128 else
129 {
130 oldIfPower = packetInterferedWith->GetInterferencePowerInSatellite();
131 ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
132 ifPowerPerFragment = packetInterferedWith->GetInterferencePowerInSatellitePerFragment();
133 }
134
135 for (std::pair<double, double>& ifPower : ifPowerPerFragment)
136 {
137 normalizedTime += ifPower.first;
138 if (startTime >= normalizedTime)
139 {
140 continue;
141 }
142 else if (endTime < normalizedTime)
143 {
144 break;
145 }
146
147 ifPower.second -= ifPowerToRemove;
148 ifPower.second += residualPower;
149 if (std::abs(ifPower.second) < 1.0e-30) // std::numeric_limits<double>::epsilon ())
150 {
151 ifPower.second = 0.0;
152 }
153
154 if (ifPower.second < 0)
155 {
156 NS_FATAL_ERROR("Negative interference");
157 }
158 }
159
160 if (isRegenerative)
161 {
162 packetInterferedWith->SetInterferencePower(ifPowerPerFragment);
163 }
164 else
165 {
166 packetInterferedWith->SetInterferencePowerInSatellite(ifPowerPerFragment);
167 }
168
169 NS_LOG_INFO("Interfered packet ifPower went from "
170 << oldIfPower << " to " << SatUtils::ScalarProduct(ifPowerPerFragment));
171}
172
173double
174SatResidualInterferenceElimination::GetResidualPower(Ptr<SatSignalParameters> processedPacket,
175 double EsNo)
176{
177 NS_LOG_FUNCTION(this);
178
179 NS_LOG_INFO("SatResidualInterferenceElimination::GetResidualPower");
180
181 double ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
182 uint32_t L = GetBurstLengthInSymbols(processedPacket->m_txInfo.waveformId);
183 double sigma_lambda_2 = 1.0 / (8.0 * L * EsNo);
184 double sigma_phy_2 = 1.0 / (2.0 * L * EsNo);
185 return (2.0 + sigma_lambda_2 - (2.0 * m_samplingError * std::exp(-sigma_phy_2 / 2.0))) *
186 ifPowerToRemove;
187}
188
189} // namespace ns3
SatInterferenceElimination()
Constructor for Satellite interference elimination base class.
Satellite interference elimination with residual power.
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.