/* ************************************************** */ void medium_compute_rxdBm(packet_t *packet, call_t *c) { call_t c0 = {packet->antenna, packet->node, -1}; double rxdBm = packet->txdBm; position_t *pos_tx = get_node_position(packet->node); position_t *pos_rx = get_node_position(c->node); /* antenna tx white noise */ rxdBm += antenna_get_loss(&c0); /* antenna tx gain (TODO: angle au moment de l'?mission) */ rxdBm += antenna_gain_tx(&c0, pos_rx); /* propagation */ c0.entity = propagation_entity->id; if (c->node != packet->node) { rxdBm = propagation_entity->methods->propagation.propagation(&c0, packet, packet->node, c->node, rxdBm); } /* TODO: add shadowing & fading only if > MIN_DBM */ /* antenna rx gain */ rxdBm += antenna_gain_rx(c, pos_tx); /* antenna rx white noise */ rxdBm += antenna_get_loss(c); /* rx power */ packet->rxdBm = rxdBm; packet->rxmW = dBm2mW(rxdBm); }
/* ************************************************** */ double compute_logdistance_pathloss(struct entitydata *entitydata, nodeid_t src, nodeid_t dst, double rxdBm) { /* * Pr_dBm(d) = Pr_dBm(d0) - 10 * beta * log10(d/d0) * * Note: rxdBm = [Pt + Gt + Gr]_dBm, and L = 1 * * cf p102-104 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996. * */ double dist; if (rxdBm != entitydata->last_rxdBm) { entitydata->Pr0 = freespace(entitydata, entitydata->dist0, dBm2mW(rxdBm)); entitydata->last_rxdBm = rxdBm; } dist = distance(get_node_position(src), get_node_position(dst)); return mW2dBm(entitydata->Pr0) - 10.0 * entitydata->pathloss * log10(dist/entitydata->dist0); }
/* ************************************************** */ double propagation(call_t *c, packet_t *packet, nodeid_t src, nodeid_t dst, double rxdBm) { struct entitydata *entitydata = get_entity_private_data(c); double dist, powerloss_dbm; /* * Pr_dBm(d) = Pr_dBm(d0) - 10 * beta * log10(d/d0) + X * * Note: rxdBm = [Pt + Gt + Gr]_dBm, L = 1, and X a normal distributed RV (in dBm) * * cf p104-105 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996. * */ if (rxdBm != entitydata->last_rxdBm) { entitydata->Pr0 = freespace(c, packet, entitydata->dist0, dBm2mW(rxdBm)); entitydata->last_rxdBm = rxdBm; } dist = distance(get_node_position(src), get_node_position(dst)); powerloss_dbm = -10.0 * entitydata->pathloss * log10(dist/entitydata->dist0) + normal(0.0, entitydata->deviation); return mW2dBm(entitydata->Pr0) + powerloss_dbm; }