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 |