Example #1
0
/* ************************************************** */
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);
}
Example #3
0
/* ************************************************** */
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;
}