spike detection

Committer:
otis22894
Date:
Wed Sep 28 00:12:53 2016 +0000
Revision:
0:75ea240e0059
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
otis22894 0:75ea240e0059 1 #include "spikes.h"
otis22894 0:75ea240e0059 2 #include "statistics.h"
otis22894 0:75ea240e0059 3 #include "mbed.h"
otis22894 0:75ea240e0059 4 #include "math.h"
otis22894 0:75ea240e0059 5 volatile bool lowSpike;
otis22894 0:75ea240e0059 6 volatile bool highSpike;
otis22894 0:75ea240e0059 7
otis22894 0:75ea240e0059 8 RunningStatistics *oldValues;
otis22894 0:75ea240e0059 9 RunningStatistics *newValues;
otis22894 0:75ea240e0059 10
otis22894 0:75ea240e0059 11 int numOld, numNew, stdDevs, capacity;
otis22894 0:75ea240e0059 12 volatile int count = 0;
otis22894 0:75ea240e0059 13
otis22894 0:75ea240e0059 14 SpikeFinder :: SpikeFinder(int numOld, int numNew, float stdDevs) {
otis22894 0:75ea240e0059 15 oldValues = new RunningStatistics(numOld);
otis22894 0:75ea240e0059 16 newValues = new RunningStatistics(numNew);
otis22894 0:75ea240e0059 17 this->numOld = numOld;
otis22894 0:75ea240e0059 18 this->numNew = numNew;
otis22894 0:75ea240e0059 19 this->stdDevs = stdDevs;
otis22894 0:75ea240e0059 20 capacity = numNew + numOld;
otis22894 0:75ea240e0059 21 }
otis22894 0:75ea240e0059 22
otis22894 0:75ea240e0059 23 bool SpikeFinder :: lowSpikeFound() {
otis22894 0:75ea240e0059 24 return lowSpike;
otis22894 0:75ea240e0059 25 }
otis22894 0:75ea240e0059 26
otis22894 0:75ea240e0059 27 bool SpikeFinder :: highSpikeFound() {
otis22894 0:75ea240e0059 28 return highSpike;
otis22894 0:75ea240e0059 29 }
otis22894 0:75ea240e0059 30
otis22894 0:75ea240e0059 31 void SpikeFinder :: addSample(double newSample) {
otis22894 0:75ea240e0059 32 oldValues->addSample(newValues->addSample(newSample));
otis22894 0:75ea240e0059 33 if(count < capacity) {
otis22894 0:75ea240e0059 34 count++;
otis22894 0:75ea240e0059 35 } else {
otis22894 0:75ea240e0059 36 double oldAvg = oldValues->getAverage();
otis22894 0:75ea240e0059 37 double newAvg = newValues->getAverage();
otis22894 0:75ea240e0059 38 double newStdDev = newValues->getStandardDeviation();
otis22894 0:75ea240e0059 39 double dist = newStdDev * stdDevs;
otis22894 0:75ea240e0059 40 if (newAvg >= (oldAvg + dist)) {
otis22894 0:75ea240e0059 41 highSpike = true;
otis22894 0:75ea240e0059 42 }
otis22894 0:75ea240e0059 43 else if (newAvg <= (oldAvg - dist)) {
otis22894 0:75ea240e0059 44 lowSpike = true;
otis22894 0:75ea240e0059 45 }
otis22894 0:75ea240e0059 46 }
otis22894 0:75ea240e0059 47 }
otis22894 0:75ea240e0059 48
otis22894 0:75ea240e0059 49 void SpikeFinder :: reset() {
otis22894 0:75ea240e0059 50 count = 0;
otis22894 0:75ea240e0059 51 highSpike = false;
otis22894 0:75ea240e0059 52 lowSpike = false;
otis22894 0:75ea240e0059 53 }