Skip to content

Commit 359a48a

Browse files
Ieee80211: scale sub-band noise in ScalarSnir and decouple primary backoff from secondary-only energy
1 parent 2399a63 commit 359a48a

2 files changed

Lines changed: 19 additions & 4 deletions

File tree

  • src/inet

src/inet/linklayer/ieee80211/mac/Rx.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ void Rx::recomputeMediumFree()
159159
{
160160
bool oldMediumFree = mediumFree;
161161
// note: the duration of mode switching (rx-to-tx or tx-to-rx) should also count as busy
162-
bool primaryPhysicallyIdle = (receptionState == IRadio::RECEPTION_STATE_IDLE) && (!ht40Cca || !primaryCcaBusy);
162+
bool primaryPhysicallyIdle = (receptionState != IRadio::RECEPTION_STATE_RECEIVING) &&
163+
(!ht40Cca ? (receptionState == IRadio::RECEPTION_STATE_IDLE) : !primaryCcaBusy);
163164
mediumFree = primaryPhysicallyIdle && transmissionState == IRadio::TRANSMISSION_STATE_UNDEFINED && !endNavTimer->isScheduled();
164165
if (mediumFree != oldMediumFree) {
165166
for (auto contention : contentions)

src/inet/physicallayer/wireless/common/analogmodel/scalar/ScalarSnir.cc

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3544
double 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

4253
double 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

4962
double 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

Comments
 (0)