spike detection
Revision 0:75ea240e0059, committed 2016-09-28
- Comitter:
- otis22894
- Date:
- Wed Sep 28 00:12:53 2016 +0000
- Commit message:
- initial commit
Changed in this revision
diff -r 000000000000 -r 75ea240e0059 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Sep 28 00:12:53 2016 +0000 @@ -0,0 +1,44 @@ +#include "mbed.h" +#include "BMP085.h" +#include "uLCD_4DGL.h" +#include "statistics.h" +#include "spikes.h" + +#define SHORT_SAMPLE 5 +#define LONG_SAMPLE 20 + +BMP085 barometer(p9, p10); +uLCD_4DGL uLCD(p28, p27, p29); +AnalogIn ain(p17); +Ticker ticker; +//SpikeFinder s = SpikeFinder(30, 6, 4.0); +// For wind sensor: +//SpikeFinder s = SpikeFinder(40, 10, 7.0); +// For pressure sensor: +SpikeFinder s = SpikeFinder(4, 4, 3.0); + +void tick() { + __disable_irq(); + barometer.update(); + s.addSample(barometer.get_pressure()); + __enable_irq(); +} + +int main() { + while(1) { + //ticker.attach(&tick, 0.04); + ticker.attach(&tick, .1); + wait(1); + float f = ain; + uLCD.printf("Low: %s, High : %s\n", s.lowSpikeFound() ? "true":"false", s.highSpikeFound() ? "true":"false"); + wait(1); + uLCD.printf("Low: %s, High : %s\n", s.lowSpikeFound() ? "true":"false", s.highSpikeFound() ? "true":"false"); + wait(1); + ticker.detach(); + s.reset(); + wait(1); + uLCD.cls(); + } + return 0; +} +
diff -r 000000000000 -r 75ea240e0059 spikes.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spikes.cpp Wed Sep 28 00:12:53 2016 +0000 @@ -0,0 +1,53 @@ +#include "spikes.h" +#include "statistics.h" +#include "mbed.h" +#include "math.h" +volatile bool lowSpike; +volatile bool highSpike; + +RunningStatistics *oldValues; +RunningStatistics *newValues; + +int numOld, numNew, stdDevs, capacity; +volatile int count = 0; + +SpikeFinder :: SpikeFinder(int numOld, int numNew, float stdDevs) { + oldValues = new RunningStatistics(numOld); + newValues = new RunningStatistics(numNew); + this->numOld = numOld; + this->numNew = numNew; + this->stdDevs = stdDevs; + capacity = numNew + numOld; +} + +bool SpikeFinder :: lowSpikeFound() { + return lowSpike; +} + +bool SpikeFinder :: highSpikeFound() { + return highSpike; +} + +void SpikeFinder :: addSample(double newSample) { + oldValues->addSample(newValues->addSample(newSample)); + if(count < capacity) { + count++; + } else { + double oldAvg = oldValues->getAverage(); + double newAvg = newValues->getAverage(); + double newStdDev = newValues->getStandardDeviation(); + double dist = newStdDev * stdDevs; + if (newAvg >= (oldAvg + dist)) { + highSpike = true; + } + else if (newAvg <= (oldAvg - dist)) { + lowSpike = true; + } + } +} + +void SpikeFinder :: reset() { + count = 0; + highSpike = false; + lowSpike = false; +} \ No newline at end of file
diff -r 000000000000 -r 75ea240e0059 spikes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spikes.h Wed Sep 28 00:12:53 2016 +0000 @@ -0,0 +1,13 @@ +#include "mbed.h" + +class SpikeFinder { + public: + int numOld; + int numNew; + float stdDevs; + SpikeFinder(int numOld, int numNew, float stdDevs); + void addSample(double newSample); + bool lowSpikeFound(); + bool highSpikeFound(); + void reset(); +}; \ No newline at end of file
diff -r 000000000000 -r 75ea240e0059 statistics.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/statistics.cpp Wed Sep 28 00:12:53 2016 +0000 @@ -0,0 +1,63 @@ +#include "statistics.h" + +RunningStatistics :: RunningStatistics(int numSamples) { + sum = 0; + sumSquares = 0; + average = 0; + count = 0; + samples = new double [numSamples]; + currentNdx = 0; + sampleSize = numSamples; +} + + +double RunningStatistics :: addSample(double newSample) { + double temp; + + if (count == sampleSize) { + temp = samples[(currentNdx) % sampleSize]; + sum -= temp; + sumSquares -= (temp * temp); + } + sum += newSample; + sumSquares += (newSample * newSample); + samples[currentNdx % sampleSize] = newSample; + + + if (count < sampleSize) { + ++count; + } + average = (sum / count); + + ++currentNdx; + if (currentNdx >= sampleSize) { + currentNdx = currentNdx % sampleSize; + } + return temp; +} + +double RunningStatistics :: getAverage() { + return average; +} + +double RunningStatistics :: getStandardDeviation() { + return sqrt((sumSquares - (count * average * average)) / (count - 1)); +} + +int RunningStatistics :: getCount() { + return count; +} + +double RunningStatistics :: getSum() { + return sum; +} + +void RunningStatistics :: reset() { + delete [] samples; + sum = 0; + sumSquares = 0; + average = 0; + count = 0; + samples = new double[sampleSize]; + currentNdx = 0; +} \ No newline at end of file
diff -r 000000000000 -r 75ea240e0059 statistics.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/statistics.h Wed Sep 28 00:12:53 2016 +0000 @@ -0,0 +1,22 @@ +#include "mbed.h" + +class RunningStatistics { + public: + + RunningStatistics(int numSamples); + double addSample(double newSample); + double getAverage(); + double getStandardDeviation(); + void reset(); + int getCount(); + double getSum(); + + double sum; + double sumSquares; + double average; + double *samples; + + int sampleSize; + int currentNdx; + int count; +}; \ No newline at end of file