first commit
This commit is contained in:
62
include/platform/container/smart_median_average.h
Normal file
62
include/platform/container/smart_median_average.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
GSFramework
|
||||
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
||||
----------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
#ifndef __SMARTMEDIANAVG__
|
||||
#define __SMARTMEDIANAVG__
|
||||
|
||||
|
||||
#include "sort/sort.h"
|
||||
|
||||
|
||||
namespace GS {
|
||||
|
||||
//
|
||||
template <class T, int Size = 16, int SafeGuard = 4> class SmartMedianAverage
|
||||
{
|
||||
T history[Size];
|
||||
int count;
|
||||
|
||||
public:
|
||||
|
||||
void LogValue(T v)
|
||||
{
|
||||
if (count < Size)
|
||||
count++; // fill up
|
||||
else
|
||||
for (int n = 1; n < Size; ++n) // scroll
|
||||
history[n - 1] = history[n];
|
||||
|
||||
history[count - 1] = v;
|
||||
}
|
||||
T GetMedian() const
|
||||
{
|
||||
if (count == 0)
|
||||
return 0;
|
||||
if (count < Size)
|
||||
return history[0]; // unfiltered
|
||||
|
||||
// Sort current histogram values.
|
||||
typename Sort <T, int> ::Entry entries[Size];
|
||||
for (int n = 0; n < Size; ++n)
|
||||
entries[n].v = history[n];
|
||||
Sort <T, int> ::QuickSort(Size, entries);
|
||||
|
||||
// Compute average of the safe values.
|
||||
T avg = 0;
|
||||
for (int n = (Size / SafeGuard); n < (Size - Size / SafeGuard); ++n)
|
||||
avg += entries[n].v;
|
||||
|
||||
return avg / (Size - (Size / SafeGuard) * 2);
|
||||
}
|
||||
void Reset() { count = 0; }
|
||||
|
||||
SmartMedianAverage() : count(0) {}
|
||||
};
|
||||
|
||||
} // GS
|
||||
|
||||
|
||||
#endif // __SMARTMEDIANAVG__
|
||||
Reference in New Issue
Block a user