#ifndef LOGDISTANCEMODEL_H #define LOGDISTANCEMODEL_H #include class LogDistanceModel { public: /** convert from RSSI to a distance (in meter) */ static float rssiToDistance(const float txPower, const float pathLoss, const float rssi) { return pow(10, (txPower - rssi) / (10 * pathLoss)); } /** convert from a distance (in meter) to the expected RSSI */ static float distanceToRssi(const float txPower, const float pathLoss, const float distance_m) { if (distance_m <= 1) {return txPower;} return (txPower - (10 * pathLoss * std::log10(distance_m))); } // static float distanceAndRssiToPathLoss(const float txPower, const float rssi, const float distance_m) { // const float delta = txPower - rssi; // const float log = std::log10(distance_m) * 10.0f; // const float res = delta/log; // // sanity check // const float err = std::abs(rssi - distanceToRssi(txPower, res, distance_m)); // if (err > 0.01) {throw Exception("error too high!");} // return res; // } }; #include class LogDistFastModel { private: std::vector lut; public: LogDistFastModel() { lut.resize(2000); for (int i = 0; i < 2000; ++i) { lut[i] = std::log10(i/10.0f); } } float distanceToRssi(const float txPower, const float pathLoss, const float distance) const { if (distance <= 1) {return txPower;} return (txPower - (10 * pathLoss * lut[ (int) (distance*10) ])); } }; #endif // LOGDISTANCEMODEL_H