A simple class to buffer data and compute some statistics on that data.
StatisticQueue.cpp@0:8c041d5d34b2, 2014-07-26 (annotated)
- Committer:
- WiredHome
- Date:
- Sat Jul 26 19:49:42 2014 +0000
- Revision:
- 0:8c041d5d34b2
Keeps track of some simple statistics.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WiredHome | 0:8c041d5d34b2 | 1 | |
WiredHome | 0:8c041d5d34b2 | 2 | #include "StatisticQueue.h" |
WiredHome | 0:8c041d5d34b2 | 3 | |
WiredHome | 0:8c041d5d34b2 | 4 | StatisticQueue::StatisticQueue(int numEntries) |
WiredHome | 0:8c041d5d34b2 | 5 | { |
WiredHome | 0:8c041d5d34b2 | 6 | items = (float *)malloc(numEntries * sizeof(float)); |
WiredHome | 0:8c041d5d34b2 | 7 | if (items) { |
WiredHome | 0:8c041d5d34b2 | 8 | queueSize = numEntries; |
WiredHome | 0:8c041d5d34b2 | 9 | Clear(); |
WiredHome | 0:8c041d5d34b2 | 10 | } else { |
WiredHome | 0:8c041d5d34b2 | 11 | // crash and burn |
WiredHome | 0:8c041d5d34b2 | 12 | printf("Can't get memory\r\n"); |
WiredHome | 0:8c041d5d34b2 | 13 | queueSize = -1; |
WiredHome | 0:8c041d5d34b2 | 14 | } |
WiredHome | 0:8c041d5d34b2 | 15 | } |
WiredHome | 0:8c041d5d34b2 | 16 | |
WiredHome | 0:8c041d5d34b2 | 17 | StatisticQueue::~StatisticQueue() |
WiredHome | 0:8c041d5d34b2 | 18 | { |
WiredHome | 0:8c041d5d34b2 | 19 | if (items) |
WiredHome | 0:8c041d5d34b2 | 20 | free(items); |
WiredHome | 0:8c041d5d34b2 | 21 | } |
WiredHome | 0:8c041d5d34b2 | 22 | |
WiredHome | 0:8c041d5d34b2 | 23 | void StatisticQueue::Clear(void) |
WiredHome | 0:8c041d5d34b2 | 24 | { |
WiredHome | 0:8c041d5d34b2 | 25 | for (int i=0; i<queueSize; i++) { |
WiredHome | 0:8c041d5d34b2 | 26 | items[i] = 0.0f; |
WiredHome | 0:8c041d5d34b2 | 27 | } |
WiredHome | 0:8c041d5d34b2 | 28 | currentCount = 0; |
WiredHome | 0:8c041d5d34b2 | 29 | nextIndex = 0; |
WiredHome | 0:8c041d5d34b2 | 30 | } |
WiredHome | 0:8c041d5d34b2 | 31 | |
WiredHome | 0:8c041d5d34b2 | 32 | void StatisticQueue::EnterItem(float value) |
WiredHome | 0:8c041d5d34b2 | 33 | { |
WiredHome | 0:8c041d5d34b2 | 34 | __disable_irq(); |
WiredHome | 0:8c041d5d34b2 | 35 | items[nextIndex++] = value; |
WiredHome | 0:8c041d5d34b2 | 36 | if (nextIndex >= queueSize) |
WiredHome | 0:8c041d5d34b2 | 37 | nextIndex = 0; |
WiredHome | 0:8c041d5d34b2 | 38 | currentCount++; |
WiredHome | 0:8c041d5d34b2 | 39 | if (currentCount > queueSize) |
WiredHome | 0:8c041d5d34b2 | 40 | currentCount = queueSize; |
WiredHome | 0:8c041d5d34b2 | 41 | __enable_irq(); |
WiredHome | 0:8c041d5d34b2 | 42 | } |
WiredHome | 0:8c041d5d34b2 | 43 | |
WiredHome | 0:8c041d5d34b2 | 44 | float StatisticQueue::Average(void) |
WiredHome | 0:8c041d5d34b2 | 45 | { |
WiredHome | 0:8c041d5d34b2 | 46 | float result = 0.0f; |
WiredHome | 0:8c041d5d34b2 | 47 | for (int i=0; i<currentCount; i++) { |
WiredHome | 0:8c041d5d34b2 | 48 | result += items[i]; |
WiredHome | 0:8c041d5d34b2 | 49 | } |
WiredHome | 0:8c041d5d34b2 | 50 | if (currentCount) |
WiredHome | 0:8c041d5d34b2 | 51 | result /= currentCount; |
WiredHome | 0:8c041d5d34b2 | 52 | return result; |
WiredHome | 0:8c041d5d34b2 | 53 | } |
WiredHome | 0:8c041d5d34b2 | 54 | |
WiredHome | 0:8c041d5d34b2 | 55 | float StatisticQueue::Max(void) |
WiredHome | 0:8c041d5d34b2 | 56 | { |
WiredHome | 0:8c041d5d34b2 | 57 | float result = items[0]; |
WiredHome | 0:8c041d5d34b2 | 58 | for (int i=1; i<currentCount; i++) { |
WiredHome | 0:8c041d5d34b2 | 59 | if (items[i] > result) { |
WiredHome | 0:8c041d5d34b2 | 60 | result = items[i]; |
WiredHome | 0:8c041d5d34b2 | 61 | } |
WiredHome | 0:8c041d5d34b2 | 62 | } |
WiredHome | 0:8c041d5d34b2 | 63 | return result; |
WiredHome | 0:8c041d5d34b2 | 64 | } |
WiredHome | 0:8c041d5d34b2 | 65 | |
WiredHome | 0:8c041d5d34b2 | 66 | float StatisticQueue::Min(void) |
WiredHome | 0:8c041d5d34b2 | 67 | { |
WiredHome | 0:8c041d5d34b2 | 68 | float result = items[0]; |
WiredHome | 0:8c041d5d34b2 | 69 | for (int i=1; i<currentCount; i++) { |
WiredHome | 0:8c041d5d34b2 | 70 | if (items[i] < result) { |
WiredHome | 0:8c041d5d34b2 | 71 | result = items[i]; |
WiredHome | 0:8c041d5d34b2 | 72 | } |
WiredHome | 0:8c041d5d34b2 | 73 | } |
WiredHome | 0:8c041d5d34b2 | 74 | return result; |
WiredHome | 0:8c041d5d34b2 | 75 | } |
WiredHome | 0:8c041d5d34b2 | 76 | |
WiredHome | 0:8c041d5d34b2 | 77 | float StatisticQueue::StdDev(void) |
WiredHome | 0:8c041d5d34b2 | 78 | { |
WiredHome | 0:8c041d5d34b2 | 79 | float summing = 0.0f; |
WiredHome | 0:8c041d5d34b2 | 80 | float avg = Average(); |
WiredHome | 0:8c041d5d34b2 | 81 | for (int i=0; i<currentCount; i++) { |
WiredHome | 0:8c041d5d34b2 | 82 | float temp = (items[i] - avg); |
WiredHome | 0:8c041d5d34b2 | 83 | summing += (temp * temp); |
WiredHome | 0:8c041d5d34b2 | 84 | } |
WiredHome | 0:8c041d5d34b2 | 85 | summing /= currentCount; |
WiredHome | 0:8c041d5d34b2 | 86 | return sqrt(summing); |
WiredHome | 0:8c041d5d34b2 | 87 | } |