#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) { if (distance <= 1) {return txPower;} return (txPower - (10 * pathLoss * std::log10(distance))); } }; #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