INET Framework for OMNeT++/OMNEST
inet::physicallayer::ScalarAnalogModelBase Class Reference

#include <ScalarAnalogModelBase.h>

Inheritance diagram for inet::physicallayer::ScalarAnalogModelBase:
inet::physicallayer::AnalogModelBase inet::physicallayer::IAnalogModel inet::IPrintableObject inet::physicallayer::LayeredScalarAnalogModel inet::physicallayer::ScalarAnalogModel

Public Member Functions

virtual W computeReceptionPower (const IRadio *radio, const ITransmission *transmission, const IArrival *arrival) const
 
virtual const INoisecomputeNoise (const IListening *listening, const IInterference *interference) const override
 Returns the total noise summing up all the interfering receptions and noises. More...
 
virtual const INoisecomputeNoise (const IReception *reception, const INoise *noise) const override
 Returns the total noise summing up all the reception and the noise. More...
 
virtual const ISnircomputeSNIR (const IReception *reception, const INoise *noise) const override
 Returns the signal to noise and interference ratio. More...
 
- Public Member Functions inherited from inet::physicallayer::IAnalogModel
virtual const IReceptioncomputeReception (const IRadio *receiver, const ITransmission *transmission, const IArrival *arrival) const =0
 Returns the reception for the provided transmission at the receiver. More...
 
- Public Member Functions inherited from inet::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const
 Prints this object to the provided output stream. More...
 
virtual std::string printToString () const
 
virtual std::string printToString (int level, int evFlags=0) const
 
virtual std::string getInfoStringRepresentation (int evFlags=0) const
 
virtual std::string getDetailStringRepresentation (int evFlags=0) const
 
virtual std::string getDebugStringRepresentation (int evFlags=0) const
 
virtual std::string getTraceStringRepresentation (int evFlags=0) const
 
virtual std::string getCompleteStringRepresentation (int evFlags=0) const
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual bool areOverlappingBands (Hz centerFrequency1, Hz bandwidth1, Hz centerFrequency2, Hz bandwidth2) const
 
virtual void addReception (const IReception *reception, simtime_t &noiseStartTime, simtime_t &noiseEndTime, std::map< simtime_t, W > *powerChanges) const
 
virtual void addNoise (const ScalarNoise *noise, simtime_t &noiseStartTime, simtime_t &noiseEndTime, std::map< simtime_t, W > *powerChanges) const
 
- Protected Member Functions inherited from inet::physicallayer::AnalogModelBase
virtual double computeAntennaGain (const IAntennaGain *antenna, const Coord &startPosition, const Coord &endPosition, const Quaternion &startOrientation) const
 

Protected Attributes

bool ignorePartialInterference
 

Additional Inherited Members

- Public Types inherited from inet::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 
enum  PrintFlag { PRINT_FLAG_FORMATTED = (1 << 0), PRINT_FLAG_MULTILINE = (1 << 1) }
 

Member Function Documentation

◆ addNoise()

void inet::physicallayer::ScalarAnalogModelBase::addNoise ( const ScalarNoise noise,
simtime_t &  noiseStartTime,
simtime_t &  noiseEndTime,
std::map< simtime_t, W > *  powerChanges 
) const
protectedvirtual
78 {
79  const std::map<simtime_t, W> *noisePowerChanges = noise->getPowerChanges();
80  for (const auto& noisePowerChange : *noisePowerChanges) {
81  auto jt = powerChanges->find(noisePowerChange.first);
82  if (jt != powerChanges->end())
83  jt->second += noisePowerChange.second;
84  else
85  powerChanges->insert(std::pair<simtime_t, W>(noisePowerChange.first, noisePowerChange.second));
86  }
87  if (noise->getStartTime() < noiseStartTime)
88  noiseStartTime = noise->getStartTime();
89  if (noise->getEndTime() > noiseEndTime)
90  noiseEndTime = noise->getEndTime();
91 }

Referenced by computeNoise().

◆ addReception()

void inet::physicallayer::ScalarAnalogModelBase::addReception ( const IReception reception,
simtime_t &  noiseStartTime,
simtime_t &  noiseEndTime,
std::map< simtime_t, W > *  powerChanges 
) const
protectedvirtual
57 {
58  W power = check_and_cast<const IScalarSignal *>(reception->getAnalogModel())->getPower();
59  simtime_t startTime = reception->getStartTime();
60  simtime_t endTime = reception->getEndTime();
61  auto itStartTime = powerChanges->find(startTime);
62  if (itStartTime != powerChanges->end())
63  itStartTime->second += power;
64  else
65  powerChanges->insert(std::pair<simtime_t, W>(startTime, power));
66  auto itEndTime = powerChanges->find(endTime);
67  if (itEndTime != powerChanges->end())
68  itEndTime->second -= power;
69  else
70  powerChanges->insert(std::pair<simtime_t, W>(endTime, -power));
71  if (reception->getStartTime() < noiseStartTime)
72  noiseStartTime = reception->getStartTime();
73  if (reception->getEndTime() > noiseEndTime)
74  noiseEndTime = reception->getEndTime();
75 }

Referenced by computeNoise().

◆ areOverlappingBands()

bool inet::physicallayer::ScalarAnalogModelBase::areOverlappingBands ( Hz  centerFrequency1,
Hz  bandwidth1,
Hz  centerFrequency2,
Hz  bandwidth2 
) const
protectedvirtual
29 {
30  return centerFrequency1 + bandwidth1 / 2 >= centerFrequency2 - bandwidth2 / 2 &&
31  centerFrequency1 - bandwidth1 / 2 <= centerFrequency2 + bandwidth2 / 2;
32 }

Referenced by computeNoise().

◆ computeNoise() [1/2]

const INoise * inet::physicallayer::ScalarAnalogModelBase::computeNoise ( const IListening listening,
const IInterference interference 
) const
overridevirtual

Returns the total noise summing up all the interfering receptions and noises.

This function never returns nullptr.

Implements inet::physicallayer::IAnalogModel.

94 {
95  const BandListening *bandListening = check_and_cast<const BandListening *>(listening);
96  Hz commonCenterFrequency = bandListening->getCenterFrequency();
97  Hz commonBandwidth = bandListening->getBandwidth();
98  simtime_t noiseStartTime = SimTime::getMaxTime();
99  simtime_t noiseEndTime = 0;
100  std::map<simtime_t, W> *powerChanges = new std::map<simtime_t, W>();
101  const std::vector<const IReception *> *interferingReceptions = interference->getInterferingReceptions();
102  for (auto reception : *interferingReceptions) {
103  const ISignalAnalogModel *signalAnalogModel = reception->getAnalogModel();
104  const INarrowbandSignal *narrowbandSignalAnalogModel = check_and_cast<const INarrowbandSignal *>(signalAnalogModel);
105  Hz signalCenterFrequency = narrowbandSignalAnalogModel->getCenterFrequency();
106  Hz signalBandwidth = narrowbandSignalAnalogModel->getBandwidth();
107  if (commonCenterFrequency == signalCenterFrequency && commonBandwidth >= signalBandwidth)
108  addReception(reception, noiseStartTime, noiseEndTime, powerChanges);
109  else if (!ignorePartialInterference && areOverlappingBands(commonCenterFrequency, commonBandwidth, narrowbandSignalAnalogModel->getCenterFrequency(), narrowbandSignalAnalogModel->getBandwidth()))
110  throw cRuntimeError("Partially interfering signals are not supported by ScalarAnalogModel, enable ignorePartialInterference to avoid this error!");
111  }
112  const ScalarNoise *scalarBackgroundNoise = dynamic_cast<const ScalarNoise *>(interference->getBackgroundNoise());
113  if (scalarBackgroundNoise) {
114  if (commonCenterFrequency == scalarBackgroundNoise->getCenterFrequency() && commonBandwidth >= scalarBackgroundNoise->getBandwidth())
115  addNoise(scalarBackgroundNoise, noiseStartTime, noiseEndTime, powerChanges);
116  else if (!ignorePartialInterference && areOverlappingBands(commonCenterFrequency, commonBandwidth, scalarBackgroundNoise->getCenterFrequency(), scalarBackgroundNoise->getBandwidth()))
117  throw cRuntimeError("Partially interfering background noise is not supported by ScalarAnalogModel, enable ignorePartialInterference to avoid this error!");
118  }
119  EV_TRACE << "Noise power begin " << endl;
120  W noise = W(0);
121  for (std::map<simtime_t, W>::const_iterator it = powerChanges->begin(); it != powerChanges->end(); it++) {
122  noise += it->second;
123  EV_TRACE << "Noise at " << it->first << " = " << noise << endl;
124  }
125  EV_TRACE << "Noise power end" << endl;
126  return new ScalarNoise(noiseStartTime, noiseEndTime, commonCenterFrequency, commonBandwidth, powerChanges);
127 }

◆ computeNoise() [2/2]

const INoise * inet::physicallayer::ScalarAnalogModelBase::computeNoise ( const IReception reception,
const INoise noise 
) const
overridevirtual

Returns the total noise summing up all the reception and the noise.

This function never returns nullptr.

Implements inet::physicallayer::IAnalogModel.

130 {
131  auto scalarNoise = check_and_cast<const ScalarNoise *>(noise);
132  simtime_t noiseStartTime = SimTime::getMaxTime();
133  simtime_t noiseEndTime = 0;
134  std::map<simtime_t, W> *powerChanges = new std::map<simtime_t, W>();
135  addReception(reception, noiseStartTime, noiseEndTime, powerChanges);
136  addNoise(scalarNoise, noiseStartTime, noiseEndTime, powerChanges);
137  return new ScalarNoise(noiseStartTime, noiseEndTime, scalarNoise->getCenterFrequency(), scalarNoise->getBandwidth(), powerChanges);
138 }

◆ computeReceptionPower()

W inet::physicallayer::ScalarAnalogModelBase::computeReceptionPower ( const IRadio radio,
const ITransmission transmission,
const IArrival arrival 
) const
virtual
35 {
36  const IRadioMedium *radioMedium = receiverRadio->getMedium();
37  const INarrowbandSignal *narrowbandSignalAnalogModel = check_and_cast<const INarrowbandSignal *>(transmission->getAnalogModel());
38  const IScalarSignal *scalarSignalAnalogModel = check_and_cast<const IScalarSignal *>(transmission->getAnalogModel());
39  const Coord& receptionStartPosition = arrival->getStartPosition();
40  // TODO could be used for doppler shift? const Coord& receptionEndPosition = arrival->getEndPosition();
41  double transmitterAntennaGain = computeAntennaGain(transmission->getTransmitterAntennaGain(), transmission->getStartPosition(), arrival->getStartPosition(), transmission->getStartOrientation());
42  double receiverAntennaGain = computeAntennaGain(receiverRadio->getAntenna()->getGain().get(), arrival->getStartPosition(), transmission->getStartPosition(), arrival->getStartOrientation());
43  double pathLoss = radioMedium->getPathLoss()->computePathLoss(transmission, arrival);
44  double obstacleLoss = radioMedium->getObstacleLoss() ? radioMedium->getObstacleLoss()->computeObstacleLoss(narrowbandSignalAnalogModel->getCenterFrequency(), transmission->getStartPosition(), receptionStartPosition) : 1;
45  W transmissionPower = scalarSignalAnalogModel->getPower();
46  ASSERT(!std::isnan(transmissionPower.get()));
47  double gain = transmitterAntennaGain * receiverAntennaGain * pathLoss * obstacleLoss;
48  ASSERT(!std::isnan(gain));
49  if (gain > 1.0) {
50  EV_WARN << "Signal power attenuation is zero.\n";
51  gain = 1.0;
52  }
53  return transmissionPower * gain;
54 }

Referenced by inet::physicallayer::ScalarAnalogModel::computeReception(), and inet::physicallayer::LayeredScalarAnalogModel::computeReception().

◆ computeSNIR()

const ISnir * inet::physicallayer::ScalarAnalogModelBase::computeSNIR ( const IReception reception,
const INoise noise 
) const
overridevirtual

Returns the signal to noise and interference ratio.

This function never returns nullptr.

Implements inet::physicallayer::IAnalogModel.

141 {
142  return new ScalarSnir(reception, noise);
143 }

◆ initialize()

void inet::physicallayer::ScalarAnalogModelBase::initialize ( int  stage)
overrideprotectedvirtual
21 {
22  AnalogModelBase::initialize(stage);
23  if (stage == INITSTAGE_LOCAL) {
24  ignorePartialInterference = par("ignorePartialInterference");
25  }
26 }

◆ numInitStages()

virtual int inet::physicallayer::ScalarAnalogModelBase::numInitStages ( ) const
inlineoverrideprotectedvirtual
25 { return NUM_INIT_STAGES; }

Member Data Documentation

◆ ignorePartialInterference

bool inet::physicallayer::ScalarAnalogModelBase::ignorePartialInterference
protected

Referenced by computeNoise(), and initialize().


The documentation for this class was generated from the following files:
inet::units::units::Hz
pow< s, -1 > Hz
Definition: Units.h:935
inet::physicallayer::ScalarAnalogModelBase::addReception
virtual void addReception(const IReception *reception, simtime_t &noiseStartTime, simtime_t &noiseEndTime, std::map< simtime_t, W > *powerChanges) const
Definition: ScalarAnalogModelBase.cc:56
inet::physicallayer::ScalarAnalogModelBase::addNoise
virtual void addNoise(const ScalarNoise *noise, simtime_t &noiseStartTime, simtime_t &noiseEndTime, std::map< simtime_t, W > *powerChanges) const
Definition: ScalarAnalogModelBase.cc:77
inet::units::units::W
compose< J, pow< s, -1 > > W
Definition: Units.h:939
inet::physicallayer::AnalogModelBase::computeAntennaGain
virtual double computeAntennaGain(const IAntennaGain *antenna, const Coord &startPosition, const Coord &endPosition, const Quaternion &startOrientation) const
Definition: AnalogModelBase.cc:16
inet::physicallayer::ScalarAnalogModelBase::areOverlappingBands
virtual bool areOverlappingBands(Hz centerFrequency1, Hz bandwidth1, Hz centerFrequency2, Hz bandwidth2) const
Definition: ScalarAnalogModelBase.cc:28
inet::physicallayer::ScalarAnalogModelBase::ignorePartialInterference
bool ignorePartialInterference
Definition: ScalarAnalogModelBase.h:22
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73