DeciderResult* Decider802154Narrow::createResult(const airframe_ptr_t frame)
double rssi = calcChannelSenseRSSI(start, end);
rssi = calcChannelSenseRSSI(start, end).first;
rssilog.record(rssi);
tkenv-default-config =
*.**.coreDebug = false
*.**.debug = true
**.vector-recording=true
DeciderResult* Decider802154Narrow::createResult(const airframe_ptr_t frame) const
{
ConstMapping* snrMapping = calculateSnrMapping(frame);
const Signal& s = frame->getSignal();
simtime_t start = s.getReceptionStart();
simtime_t end = s.getReceptionEnd();
AirFrameVector channel;
getChannelInfo(start, end, channel);
calcChannelSenseRSSI(start, end);
double bitrate = s.getBitrate()->getValue(Argument(start));
double avgBER = 0;
double bestBER = 0.5;
double snirAvg = 0;
bool noErrors = true;
double ber;
double rssi;
double errorProbability;
double maxErrProb = 0.0;
simtime_t receivingStart = MappingUtils::post(start);
Argument argStart(receivingStart);
ConstMappingIterator* iter = snrMapping->createConstIterator(argStart);
double snirMin = iter->getValue();
//double rssi=10*log(snirAvg);
// Evaluate bit errors for each snr value
// and stops as soon as we have an error.
simtime_t curTime = iter->getPosition().getTime();
simtime_t snrDuration;
while(curTime < end) {
//get SNR for this interval
double snr = iter->getValue();
//determine end of this interval
simtime_t nextTime = end; //either the end of the signal...
if(iter->hasNext()) { //or the position of the next entry
const Argument& argNext = iter->getNextPosition();
nextTime = std::min(argNext.getTime(), nextTime);
iter->next(); //the iterator will already point to the next entry
}
if (noErrors) {
snrDuration = nextTime - curTime;
int nbBits = int (SIMTIME_DBL(snrDuration) * bitrate);
// non-coherent detection of m-ary orthogonal signals in an AWGN
// Channel
// Digital Communications, John G. Proakis, section 4.3.2
// p. 212, (4.3.32)
// Pm = sum(n=1,n=M-1){(-1)^(n+1)choose(M-1,n) 1/(n+1) exp(-nkgamma/(n+1))}
// Pb = 2^(k-1)/(2^k - 1) Pm
ber = getBERFromSNR(snr);
rssi = calcChannelSenseRSSI(start, end).first;
avgBER = ber*nbBits;
snirAvg = snirAvg + snr*SIMTIME_DBL(snrDuration);
if(recordStats) {
berlog.record(ber);
snrlog.record(MW2DBM(snr));
rssilog.record(rssi);
}
if(ber < bestBER) {
bestBER = ber;
}
errorProbability = 1.0 - pow((1.0 - ber), nbBits);
noErrors = errorProbability < uniform(0, 1);
if(errorProbability > maxErrProb)
maxErrProb = errorProbability;
}
if (snr < snirMin)
snirMin = snr;
curTime = nextTime;
}
delete iter;
delete snrMapping;
avgBER = avgBER / frame->getBitLength();
snirAvg = snirAvg / (end - start);
if(recordStats) {
snirReceived.record(MW2DBM(snirMin)); // in dB
}
return new DeciderResult802154Narrow(noErrors && !frame->hasBitError(), bitrate, snirMin, avgBER, calcChannelSenseRSSI(start, end).first, maxErrProb);
}
**.recordStats = true
**.recordVectors = true #(optional)
...<div st