26 #include <ns3/double.h>
28 #include <ns3/simulator.h>
30 NS_LOG_COMPONENT_DEFINE(
"SatResidualInterferenceElimination");
35 NS_OBJECT_ENSURE_REGISTERED(SatResidualInterferenceElimination);
41 TypeId(
"ns3::SatResidualInterferenceElimination")
43 .AddConstructor<SatResidualInterferenceElimination>()
46 "Residual sampling error corresponding to E[g(τ)]/g(0) for the simulation",
49 MakeDoubleChecker<double>());
65 NS_LOG_FUNCTION(
this);
67 NS_FATAL_ERROR(
"SatPhy default constructor is not allowed to use");
71 Ptr<SatWaveformConf> waveformConf)
73 m_waveformConf(waveformConf),
76 NS_LOG_FUNCTION(
this);
81 NS_LOG_FUNCTION(
this);
86 Ptr<SatSignalParameters> packetInterferedWith,
87 Ptr<SatSignalParameters> processedPacket,
91 NS_LOG_FUNCTION(
this);
103 Ptr<SatSignalParameters> packetInterferedWith,
104 Ptr<SatSignalParameters> processedPacket,
110 NS_LOG_FUNCTION(
this);
112 NS_LOG_INFO(
"Removing interference power of packet from Beam[Carrier] "
113 << processedPacket->m_beamId <<
"[" << processedPacket->m_carrierId <<
"] between "
114 << startTime <<
" and " << endTime);
116 double ifPowerToRemove;
120 double normalizedTime = 0.0;
121 std::vector<std::pair<double, double>> ifPowerPerFragment;
125 oldIfPower = packetInterferedWith->GetInterferencePower();
126 ifPowerToRemove = processedPacket->m_rxPower_W;
127 ifPowerPerFragment = packetInterferedWith->GetInterferencePowerPerFragment();
131 oldIfPower = packetInterferedWith->GetInterferencePowerInSatellite();
132 ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
133 ifPowerPerFragment = packetInterferedWith->GetInterferencePowerInSatellitePerFragment();
136 for (std::pair<double, double>& ifPower : ifPowerPerFragment)
138 normalizedTime += ifPower.first;
139 if (startTime >= normalizedTime)
143 else if (endTime < normalizedTime)
148 ifPower.second -= ifPowerToRemove;
149 ifPower.second += residualPower;
150 if (std::abs(ifPower.second) < 1.0e-30)
152 ifPower.second = 0.0;
155 if (ifPower.second < 0)
157 NS_FATAL_ERROR(
"Negative interference");
163 packetInterferedWith->SetInterferencePower(ifPowerPerFragment);
167 packetInterferedWith->SetInterferencePowerInSatellite(ifPowerPerFragment);
170 NS_LOG_INFO(
"Interfered packet ifPower went from "
178 NS_LOG_FUNCTION(
this);
180 NS_LOG_INFO(
"SatResidualInterferenceElimination::GetResidualPower");
182 double ifPowerToRemove = processedPacket->GetRxPowerInSatellite();
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))) *
Abstract class defining interface for interference elimination calculation objects.
~SatResidualInterferenceElimination()
Destructor.
void EliminateInterferences(Ptr< SatSignalParameters > packetInterferedWith, Ptr< SatSignalParameters > processedPacket, double EsNo, bool isRegenerative)
Eliminate the residual power of interference for the given packets.
uint32_t GetBurstLengthInSymbols(uint32_t waveformId) const
SatResidualInterferenceElimination()
Default constructor.
TypeId GetInstanceTypeId(void) const
Derived from Object.
double GetResidualPower(Ptr< SatSignalParameters > processedPacket, double EsNo)
Calculate the residual power of interference for a given packet.
static TypeId GetTypeId(void)
Derived from Object.
static double ScalarProduct(const std::vector< std::pair< double, double >> &vector)
Scalar product.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.