oculus1

annotate libovr/Src/OVR_SensorFilter.h @ 23:0c76f70fb7e9

merged
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 28 Sep 2013 04:13:33 +0300
parents
children
rev   line source
nuclear@1 1 /************************************************************************************
nuclear@1 2
nuclear@1 3 PublicHeader: OVR.h
nuclear@1 4 Filename : OVR_SensorFilter.h
nuclear@1 5 Content : Basic filtering of sensor data
nuclear@1 6 Created : March 7, 2013
nuclear@1 7 Authors : Steve LaValle, Anna Yershova
nuclear@1 8
nuclear@1 9 Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
nuclear@1 10
nuclear@1 11 Use of this software is subject to the terms of the Oculus license
nuclear@1 12 agreement provided at the time of installation or download, or which
nuclear@1 13 otherwise accompanies this software in either electronic or hard copy form.
nuclear@1 14
nuclear@1 15 *************************************************************************************/
nuclear@1 16
nuclear@1 17 #ifndef OVR_SensorFilter_h
nuclear@1 18 #define OVR_SensorFilter_h
nuclear@1 19
nuclear@1 20 #include "Kernel/OVR_Math.h"
nuclear@1 21
nuclear@1 22
nuclear@1 23 namespace OVR {
nuclear@1 24
nuclear@1 25 // This class maintains a sliding window of sensor data taken over time and implements
nuclear@1 26 // various simple filters, most of which are linear functions of the data history.
nuclear@1 27 class SensorFilter
nuclear@1 28 {
nuclear@1 29 enum
nuclear@1 30 {
nuclear@1 31 MaxFilterSize = 100,
nuclear@1 32 DefaultFilterSize = 20
nuclear@1 33 };
nuclear@1 34
nuclear@1 35 private:
nuclear@1 36 int LastIdx; // The index of the last element that was added to the array
nuclear@1 37 int Size; // The window size (number of elements)
nuclear@1 38 Vector3f Elements[MaxFilterSize];
nuclear@1 39
nuclear@1 40 public:
nuclear@1 41 // Create a new filter with default size
nuclear@1 42 SensorFilter()
nuclear@1 43 {
nuclear@1 44 LastIdx = -1;
nuclear@1 45 Size = DefaultFilterSize;
nuclear@1 46 };
nuclear@1 47
nuclear@1 48 // Create a new filter with size i
nuclear@1 49 SensorFilter(int i)
nuclear@1 50 {
nuclear@1 51 OVR_ASSERT(i <= MaxFilterSize);
nuclear@1 52 LastIdx = -1;
nuclear@1 53 Size = i;
nuclear@1 54 };
nuclear@1 55
nuclear@1 56
nuclear@1 57 // Create a new element to the filter
nuclear@1 58 void AddElement (const Vector3f &e)
nuclear@1 59 {
nuclear@1 60 if (LastIdx == Size - 1)
nuclear@1 61 LastIdx = 0;
nuclear@1 62 else
nuclear@1 63 LastIdx++;
nuclear@1 64
nuclear@1 65 Elements[LastIdx] = e;
nuclear@1 66 };
nuclear@1 67
nuclear@1 68 // Get element i. 0 is the most recent, 1 is one step ago, 2 is two steps ago, ...
nuclear@1 69 Vector3f GetPrev(int i) const
nuclear@1 70 {
nuclear@1 71 OVR_ASSERT(i >= 0); //
nuclear@1 72 int idx = (LastIdx - i);
nuclear@1 73 if (idx < 0) // Fix the wraparound case
nuclear@1 74 idx += Size;
nuclear@1 75 OVR_ASSERT(idx >= 0); // Multiple wraparounds not allowed
nuclear@1 76 return Elements[idx];
nuclear@1 77 };
nuclear@1 78
nuclear@1 79 // Simple statistics
nuclear@1 80 Vector3f Total() const;
nuclear@1 81 Vector3f Mean() const;
nuclear@1 82 Vector3f Median() const;
nuclear@1 83 Vector3f Variance() const; // The diagonal of covariance matrix
nuclear@1 84 Matrix4f Covariance() const;
nuclear@1 85 Vector3f PearsonCoefficient() const;
nuclear@1 86
nuclear@1 87 // A popular family of smoothing filters and smoothed derivatives
nuclear@1 88 Vector3f SavitzkyGolaySmooth8() const;
nuclear@1 89 Vector3f SavitzkyGolayDerivative4() const;
nuclear@1 90 Vector3f SavitzkyGolayDerivative5() const;
nuclear@1 91 Vector3f SavitzkyGolayDerivative12() const;
nuclear@1 92 Vector3f SavitzkyGolayDerivativeN(int n) const;
nuclear@1 93
nuclear@1 94 ~SensorFilter() {};
nuclear@1 95 };
nuclear@1 96
nuclear@1 97 } //namespace OVR
nuclear@1 98
nuclear@1 99 #endif // OVR_SensorFilter_h