spike detection
spikes.cpp@0:75ea240e0059, 2016-09-28 (annotated)
- Committer:
- otis22894
- Date:
- Wed Sep 28 00:12:53 2016 +0000
- Revision:
- 0:75ea240e0059
initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |