Applicable versions | NetSim Standard | NetSim Pro |
The PHY Rate when rate adaptation is set to false is based on Received power (RSSI) and SINR.
Received_power (at receiver from any node) = Transmit_power - Propagation_Loss
Propagation loss (pathloss) is implemented in IEEE_802_11_Phy.c in the function
In NetSim v12:
dReceivedPower = GET_RX_POWER_dbm(packet-> nTransmitterId,
ifid,
pstruEventDetails->nDeviceId,
pstruEventDetails-> nInterfaceId,
packet->pstruPhyData-> dArrivalTime);
In NetSim v13:
double pdbm = GET_RX_POWER_dbm(packet-> nTransmitterId,
ifid,
pstruEventDetails->nDeviceId,
pstruEventDetails-> nInterfaceId,
packet->pstruPhyData-> dArrivalTime);
which is actually as a macro
#define GET_RX_POWER_dbm(tx, txi, rx, rxi, time) (propagation_get_received_ power_dbm(propagationHandle, tx, txi, rx, rxi, time))
The code for this is proprietary and is not part of our open-source codes.
Next,
SINR = Receiver_Power (from source) / (Thermal_Noise + Sum of (Received_power (from all nodes except source))
In IEEE_802_11_Phy.c in IEEE802_11 project the function
int fn_NetSim_IEEE802_11_OFDMPhy_ DataRate(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NETSIM_ID nReceiverId,NetSim_PACKET* packet,double time) is used for data rate calculation. In the structure
static struct stru_802_11_Phy_Parameters_ OFDM struPhyParameters_20MHz[8] =
{
//IEEE802.11-OFDM Phy
{1,-82,Modulation_BPSK,6, Coding_1_2,1,48,24},
{2,-79,Modulation_BPSK,9, Coding_3_4,1,48,36},
{3,-77,Modulation_QPSK,12, Coding_1_2,2,96,48},
{4,-74,Modulation_QPSK,18, Coding_3_4,2,96,72},
{5,-70,Modulation_16_QAM,24, Coding_1_2,4,192,96},
{6,-66,Modulation_16_QAM,36, Coding_3_4,4,192,144},
{7,-65,Modulation_64_QAM,48, Coding_2_3,6,288,192},
{8,-64,Modulation_64_QAM,54, Coding_3_4,6,288,216},
};
The second value is the Rx_Sensitivity and the fourth parameter is the data rate
In IEEE802.11_OFDMPhy.c the function
int fn_NetSim_IEEE802_11_OFDMPhy_DataRate(NETSIM_ID nDeviceId, NETSIM_ID nInterfaceId, NETSIM_ID nReceiverId,NetSim_PACKET* packet,double time)
contains the code
for(i=MAX_RATE_INDEX;i>=MIN_RATE_INDEX;i--)
{
double ber = calculate_BER(struPhyParameters[i].nModulation,power,pstruPhy->dChannelBandwidth);
if((ber<=TARGET_BER && power >= struPhyParameters[i].dRxSensitivity) || i==MIN_RATE_INDEX)
//if(power >= struPhyParameters[i].dRxSensitivity)
{
...
....
This means you start at the highest rate and work your way down to the MIN_RATE till the condition
ber<=TARGET_BER && power >= struPhyParameters[i].dRxSensitivity
is met. This means the BER must be <= TARGET_BER which is #defined as 1.0e-5 (in line 60) and RSSI is greater than Rx Sensitivity.
The SINR is used to look up an SNR-BER curve to find out the Bit Error Rate. This is inside the function call in the previous line
double ber = calculate_BER(struPhyParameters[i].nModulation,power,pstruPhy->dChannelBandwidth);
Hence it is a combination of SINR & RSSI that determines the rate.
NOTE: An alternate logic is to NOT use the SINR/BER and just compare RSSI against Rx_Sensitivity to determine the rate. This is the reason for the commented code
//if(power >= struPhyParameters[i].dRxSensitivity)
Related articles:
in-802-11-can-we-monitor-phy-rate-negotiation-between-access-point-and-wireless-nodes-