INET Framework for OMNeT++/OMNEST
|
#include <GenericRadioModel.h>
Public Member Functions | |
GenericRadioModel () | |
virtual | ~GenericRadioModel () |
virtual void | initializeFrom (cModule *radioModule) |
virtual double | calculateDuration (AirFrame *airframe) |
virtual bool | isReceivedCorrectly (AirFrame *airframe, const SnrList &receivedList) |
Protected Member Functions | |
virtual bool | isPacketOK (double snirMin, int length, double bitrate) |
virtual double | dB2fraction (double dB) |
Protected Attributes | |
double | snirThreshold |
long | headerLengthBits |
double | bandwidth |
IModulation * | modulation |
Generic radio model. Frame duration is calculated from the bitrate and the packet length plus a physical header length. Bit error rate is calculated from the modulation scheme, signal bandwidth, bitrate and the frame length.
GenericRadioModel::GenericRadioModel | ( | ) |
{ modulation = NULL; }
GenericRadioModel::~GenericRadioModel | ( | ) | [virtual] |
{ delete modulation; }
double GenericRadioModel::calculateDuration | ( | AirFrame * | ) | [virtual] |
Should be defined to calculate the duration of the AirFrame. Usually the duration is just the frame length divided by the bitrate. However, in some cases, notably IEEE 802.11, the header has a different modulation (and thus a different bitrate) than the rest of the message.
Implements IRadioModel.
{ return (airframe->getBitLength()+headerLengthBits) / airframe->getBitrate(); }
double GenericRadioModel::dB2fraction | ( | double | dB | ) | [protected, virtual] |
Referenced by initializeFrom().
{
return pow(10.0, (dB / 10));
}
void GenericRadioModel::initializeFrom | ( | cModule * | radioModule | ) | [virtual] |
Allows parameters to be read from the module parameters of a module that contains this object.
Implements IRadioModel.
{ snirThreshold = dB2fraction(radioModule->par("snirThreshold")); headerLengthBits = radioModule->par("headerLengthBits"); bandwidth = radioModule->par("bandwidth"); const char *modulationName = radioModule->par("modulation"); if (strcmp(modulationName, "null")==0) modulation = new NullModulation(); else if (strcmp(modulationName, "BPSK")==0) modulation = new BPSKModulation(); else if (strcmp(modulationName, "16-QAM")==0) modulation = new QAM16Modulation(); else if (strcmp(modulationName, "256-QAM")==0) modulation = new QAM256Modulation(); else opp_error("unrecognized modulation '%s'", modulationName); }
bool GenericRadioModel::isPacketOK | ( | double | snirMin, |
int | length, | ||
double | bitrate | ||
) | [protected, virtual] |
Referenced by isReceivedCorrectly().
{ double ber = modulation->calculateBER(snirMin, bandwidth, bitrate); if (ber==0.0) return true; double probNoError = pow(1.0 - ber, length); // probability of no bit error if (dblrand() > probNoError) return false; // error in MPDU else return true; // no error }
bool GenericRadioModel::isReceivedCorrectly | ( | AirFrame * | airframe, |
const SnrList & | receivedList | ||
) | [virtual] |
Should be defined to calculate whether the frame has been received correctly. Input is the signal-noise ratio over the duration of the frame. The calculation may take into account the modulation scheme, possible error correction code, etc.
Implements IRadioModel.
{ // calculate snirMin double snirMin = receivedList.begin()->snr; for (SnrList::const_iterator iter = receivedList.begin(); iter != receivedList.end(); iter++) if (iter->snr < snirMin) snirMin = iter->snr; if (snirMin <= snirThreshold) { // if snir is too low for the packet to be recognized EV << "COLLISION! Packet got lost\n"; return false; } else if (isPacketOK(snirMin, airframe->getBitLength()+headerLengthBits, airframe->getBitrate())) { EV << "packet was received correctly, it is now handed to upper layer...\n"; return true; } else { EV << "Packet has BIT ERRORS! It is lost!\n"; return false; } }
double GenericRadioModel::bandwidth [protected] |
Referenced by initializeFrom(), and isPacketOK().
long GenericRadioModel::headerLengthBits [protected] |
Referenced by calculateDuration(), initializeFrom(), and isReceivedCorrectly().
IModulation* GenericRadioModel::modulation [protected] |
Referenced by GenericRadioModel(), initializeFrom(), isPacketOK(), and ~GenericRadioModel().
double GenericRadioModel::snirThreshold [protected] |
Referenced by initializeFrom(), and isReceivedCorrectly().