@@ -32,18 +32,31 @@ std::ostream& ScalarSnir::printToStream(std::ostream& stream, int level, int evF
3232 return stream;
3333}
3434
35+ static double computeBandwidthScale (const ScalarReceptionAnalogModel *signalModel, const ScalarNoise *scalarNoise)
36+ {
37+ Hz signalBw = signalModel->getBandwidth ();
38+ Hz noiseBw = scalarNoise->getBandwidth ();
39+ if (signalBw > Hz (0 ) && noiseBw > signalBw)
40+ return (signalBw / noiseBw).get <unit>();
41+ return 1.0 ;
42+ }
43+
3544double ScalarSnir::computeMin () const
3645{
3746 auto scalarSignalAnalogModel = check_and_cast<const ScalarReceptionAnalogModel *>(reception->getAnalogModel ());
3847 const ScalarNoise *scalarNoise = check_and_cast<const ScalarNoise *>(noise);
39- return (scalarSignalAnalogModel->getPower () / scalarNoise->computeMaxPower (reception->getStartTime (), reception->getEndTime ())).get <unit>();
48+ double bwScale = computeBandwidthScale (scalarSignalAnalogModel, scalarNoise);
49+ W effectiveNoise = scalarNoise->computeMaxPower (reception->getStartTime (), reception->getEndTime ()) * bwScale;
50+ return (scalarSignalAnalogModel->getPower () / effectiveNoise).get <unit>();
4051}
4152
4253double ScalarSnir::computeMax () const
4354{
4455 auto scalarSignalAnalogModel = check_and_cast<const ScalarReceptionAnalogModel *>(reception->getAnalogModel ());
4556 const ScalarNoise *scalarNoise = check_and_cast<const ScalarNoise *>(noise);
46- return (scalarSignalAnalogModel->getPower () / scalarNoise->computeMinPower (reception->getStartTime (), reception->getEndTime ())).get <unit>();
57+ double bwScale = computeBandwidthScale (scalarSignalAnalogModel, scalarNoise);
58+ W effectiveNoise = scalarNoise->computeMinPower (reception->getStartTime (), reception->getEndTime ()) * bwScale;
59+ return (scalarSignalAnalogModel->getPower () / effectiveNoise).get <unit>();
4760}
4861
4962double ScalarSnir::getMin () const
@@ -71,12 +84,13 @@ double ScalarSnir::computeMean(simtime_t startTime, simtime_t endTime) const
7184{
7285 auto scalarSignalAnalogModel = check_and_cast<const ScalarReceptionAnalogModel *>(reception->getAnalogModel ());
7386 const ScalarNoise *scalarNoise = check_and_cast<const ScalarNoise *>(noise);
87+ double bwScale = computeBandwidthScale (scalarSignalAnalogModel, scalarNoise);
7488 const auto & signalPowerFunction = makeShared<math::ConstantFunction<W, math::Domain<simtime_t >>>(scalarSignalAnalogModel->getPower ());
7589 const auto & snirFunction = signalPowerFunction->divide (scalarNoise->getPower ());
7690 math::Point<simtime_t > startPoint (startTime);
7791 math::Point<simtime_t > endPoint (endTime);
7892 math::Interval<simtime_t > interval (startPoint, endPoint, 0b1 , 0b0 , 0b0 );
79- return snirFunction->getMean (interval);
93+ return snirFunction->getMean (interval) / bwScale ;
8094}
8195
8296} // namespace physicallayer
0 commit comments