diff --git a/Filter/approxRunningAverage.cpp b/Filter/approxRunningAverage.cpp new file mode 100644 index 0000000..e56e14a --- /dev/null +++ b/Filter/approxRunningAverage.cpp @@ -0,0 +1,61 @@ +// Arduino Signal Filtering Library +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#include +#include + +/// Constructor +approxRunningAverage::approxRunningAverage() +{ +} + +/// Begin function: set default filter options +void approxRunningAverage::begin(int order) +{ + _sum = 0; + _index=0; + _average=0; + _order=order; + for(byte i=0;i++;i<_order) + { + _samples[i]=0; + } + switch (_order) { + case 4: + _shift = 2; + break; + case 8: + _shift = 3; + break; + case 16: + _shift = 4; + break; + case 32: + _shift = 5; + break; + case 64: + _shift = 6; + break; + case 128: + _shift = 7; + break; + case 256: + _shift = 8; + break; + } +} + +/// Calculate the average without saving the previous 'order' values +int approxRunningAverage::run(int sample) +{ + _sum = _sum - _average; // remove the average from the sum -> 'similar' to removing the oldest sample + _sum = _sum + sample; // add new sample to the running sum + _average = _sum >> _shift; // calculate the new running average + return (_average); // return the new running average +} + +/// printSamples: Print out some samples (for debugging) +// TODO: remove this from parent class? +void approxRunningAverage::printSamples() +{ +} diff --git a/Filter/approxRunningAverage.h b/Filter/approxRunningAverage.h new file mode 100644 index 0000000..026e8fa --- /dev/null +++ b/Filter/approxRunningAverage.h @@ -0,0 +1,33 @@ +// Arduino Signal Filtering Library +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#ifndef firFilter_h +#define firFilter_h +#include +#include + +//#define ORDER 4 +#define ORDER 8 +//#define ORDER 16 +//#define ORDER 32 +//#define ORDER 64 +//#define ORDER 128 +//#define ORDER 256 + +class approxRunningAverage : public Filter +{ + public: + approxRunningAverage(); + void begin(int order); + + int run(int sample); + void printSamples(); + private: + int _samples[ORDER]; // TODO: use malloc() and make it dynamic (vs .ino file) + int _index; + int _average; + int _sum; + byte _shift; + byte _order; +}; +#endif diff --git a/Filter/examples/approxRunningAverage/approxRunningAverage.ino b/Filter/examples/approxRunningAverage/approxRunningAverage.ino new file mode 100644 index 0000000..e428249 --- /dev/null +++ b/Filter/examples/approxRunningAverage/approxRunningAverage.ino @@ -0,0 +1,28 @@ +// Arduino Signal Filtering Library: approx. running average example +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#include + +approxRunningAverage Filter; + +int value; +int filtered; + +int order = 8; + +void setup() +{ + Serial.begin(9600); + Filter.begin(order); +} + +void loop() +{ + value = analogRead(A0); + filtered= Filter.run(value); + Serial.print("In: "); + Serial.print(value); + Serial.print(" - Out: "); + Serial.println(filtered); + delay(500); //make it readable +} diff --git a/Filter/examples/runningAverage/runningAverage.ino b/Filter/examples/runningAverage/runningAverage.ino new file mode 100644 index 0000000..9a8b996 --- /dev/null +++ b/Filter/examples/runningAverage/runningAverage.ino @@ -0,0 +1,28 @@ +// Arduino Signal Filtering Library: running average example +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#include + +runningAverage Filter; + +int value; +int filtered; + +int order = 8; + +void setup() +{ + Serial.begin(9600); + Filter.begin(order); +} + +void loop() +{ + value = analogRead(A0); + filtered= Filter.run(value); + Serial.print("In: "); + Serial.print(value); + Serial.print(" - Out: "); + Serial.println(filtered); + delay(500); //make it readable +} diff --git a/Filter/runningAverage.cpp b/Filter/runningAverage.cpp new file mode 100644 index 0000000..9d710dc --- /dev/null +++ b/Filter/runningAverage.cpp @@ -0,0 +1,64 @@ +// Arduino Signal Filtering Library +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#include +#include + +/// Constructor +runningAverage::runningAverage() +{ +} + +/// Begin function: set default filter options +void runningAverage::begin(int order) +{ + _sum = 0; + _index=0; + _order=order; + for(byte i=0;i++;i<_order) + { + _samples[i]=0; + } + switch (_order) { + case 4: + _shift = 2; + break; + case 8: + _shift = 3; + break; + case 16: + _shift = 4; + break; + case 32: + _shift = 5; + break; + case 64: + _shift = 6; + break; + case 128: + _shift = 7; + break; + case 256: + _shift = 8; + break; + } +} + +/// Calculate the average while saving the previous 'order' values +int runningAverage::run(int sample) +{ + _sum = _sum - _samples[_index]; // remove oldest sample from running sum + _samples[_index] = sample; // add new sample to the buffer + _sum = _sum + sample; // add new sample to the running sum + + _index++; // change the index to the next location + if(_index == _order) _index = 0; // move the index to the first location + + return (_sum >> _shift); // calculate & return the new running average +} + +/// printSamples: Print out some samples (for debugging) +// TODO: remove this from parent class? +void runningAverage::printSamples() +{ +} diff --git a/Filter/runningAverage.h b/Filter/runningAverage.h new file mode 100644 index 0000000..df397da --- /dev/null +++ b/Filter/runningAverage.h @@ -0,0 +1,32 @@ +// Arduino Signal Filtering Library +// Copyright 2012-2015 Jeroen Doggen (jeroendoggen@gmail.com) + +#ifndef firFilter_h +#define firFilter_h +#include +#include + +//#define ORDER 4 +#define ORDER 8 +//#define ORDER 16 +//#define ORDER 32 +//#define ORDER 64 +//#define ORDER 128 +//#define ORDER 256 + +class runningAverage : public Filter +{ + public: + runningAverage(); + void begin(int order); + + int run(int sample); + void printSamples(); + private: + int _samples[ORDER]; // TODO: use malloc() and make it dynamic (vs .ino file) + int _index; + int _sum; + byte _shift; + byte _order; +}; +#endif