summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2023-09-15 16:58:40 +0100
committerJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-09-16 17:33:44 +0200
commitcd940f7fd3a0636c79bfcb2ebb462e17f92cb987 (patch)
treeec5480aaaa2637aa621de28e6b45e99235464127
parente5f0846695908ff162206ec120c0614df0eca3f8 (diff)
ipa: rpi: histogram: Add interBinMean()
Add a new helper function Histogram::interBinMean() that essentially replaces the existing Histogram::interQuantileMean() logic but working on bins instead. Rework the interQuantileMean() to call into interBinMean() with the appropriate convertion from quatiles to bins. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
-rw-r--r--src/ipa/rpi/controller/histogram.cpp22
-rw-r--r--src/ipa/rpi/controller/histogram.h2
2 files changed, 16 insertions, 8 deletions
diff --git a/src/ipa/rpi/controller/histogram.cpp b/src/ipa/rpi/controller/histogram.cpp
index 16a9207f..0a27ba2c 100644
--- a/src/ipa/rpi/controller/histogram.cpp
+++ b/src/ipa/rpi/controller/histogram.cpp
@@ -45,20 +45,26 @@ double Histogram::quantile(double q, int first, int last) const
return first + frac;
}
-double Histogram::interQuantileMean(double qLo, double qHi) const
+double Histogram::interBinMean(double binLo, double binHi) const
{
- assert(qHi > qLo);
- double pLo = quantile(qLo);
- double pHi = quantile(qHi, (int)pLo);
+ assert(binHi > binLo);
double sumBinFreq = 0, cumulFreq = 0;
- for (double pNext = floor(pLo) + 1.0; pNext <= ceil(pHi);
- pLo = pNext, pNext += 1.0) {
- int bin = floor(pLo);
+ for (double binNext = floor(binLo) + 1.0; binNext <= ceil(binHi);
+ binLo = binNext, binNext += 1.0) {
+ int bin = floor(binLo);
double freq = (cumulative_[bin + 1] - cumulative_[bin]) *
- (std::min(pNext, pHi) - pLo);
+ (std::min(binNext, binHi) - binLo);
sumBinFreq += bin * freq;
cumulFreq += freq;
}
/* add 0.5 to give an average for bin mid-points */
return sumBinFreq / cumulFreq + 0.5;
}
+
+double Histogram::interQuantileMean(double qLo, double qHi) const
+{
+ assert(qHi > qLo);
+ double pLo = quantile(qLo);
+ double pHi = quantile(qHi, (int)pLo);
+ return interBinMean(pLo, pHi);
+}
diff --git a/src/ipa/rpi/controller/histogram.h b/src/ipa/rpi/controller/histogram.h
index 6b3e3a9e..e2c5509b 100644
--- a/src/ipa/rpi/controller/histogram.h
+++ b/src/ipa/rpi/controller/histogram.h
@@ -38,6 +38,8 @@ public:
uint64_t total() const { return cumulative_[cumulative_.size() - 1]; }
/* Cumulative frequency up to a (fractional) point in a bin. */
uint64_t cumulativeFreq(double bin) const;
+ /* Return the mean value between two (fractional) bins. */
+ double interBinMean(double binLo, double binHi) const;
/*
* Return the (fractional) bin of the point q (0 <= q <= 1) through the
* histogram. Optionally provide limits to help.