spike detection

Files at this revision

API Documentation at this revision

Comitter:
otis22894
Date:
Wed Sep 28 00:12:53 2016 +0000
Commit message:
initial commit

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
spikes.cpp Show annotated file Show diff for this revision Revisions of this file
spikes.h Show annotated file Show diff for this revision Revisions of this file
statistics.cpp Show annotated file Show diff for this revision Revisions of this file
statistics.h Show annotated file Show diff for this revision Revisions of this file
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