// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- // // This is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. // /// @file FilterWithBuffer.h /// @brief A filter with a buffer. /// This is implemented separately to the base Filter class to get around /// restrictions caused by the use of templates which makes different sizes essentially /// completely different classes #ifndef FilterWithBuffer_h #define FilterWithBuffer_h #include #include #include template class FilterWithBuffer : public Filter { public: // constructor FilterWithBuffer(); // apply - Add a new raw value to the filter, retrieve the filtered result virtual T apply(T sample); // reset - clear the filter virtual void reset(); // get filter size virtual uint8_t get_filter_size() { return FILTER_SIZE; }; protected: T samples[FILTER_SIZE]; // buffer of samples uint8_t sample_index; // pointer to the next empty slot in the buffer }; // Typedef for convenience typedef FilterWithBuffer FilterWithBufferInt16_Size2; typedef FilterWithBuffer FilterWithBufferInt16_Size3; typedef FilterWithBuffer FilterWithBufferInt16_Size4; typedef FilterWithBuffer FilterWithBufferInt16_Size5; typedef FilterWithBuffer FilterWithBufferInt16_Size6; typedef FilterWithBuffer FilterWithBufferInt16_Size7; typedef FilterWithBuffer FilterWithBufferUInt16_Size2; typedef FilterWithBuffer FilterWithBufferUInt16_Size3; typedef FilterWithBuffer FilterWithBufferUInt16_Size4; typedef FilterWithBuffer FilterWithBufferUInt16_Size5; typedef FilterWithBuffer FilterWithBufferUInt16_Size6; typedef FilterWithBuffer FilterWithBufferUInt16_Size7; typedef FilterWithBuffer FilterWithBufferInt32_Size2; typedef FilterWithBuffer FilterWithBufferInt32_Size3; typedef FilterWithBuffer FilterWithBufferInt32_Size4; typedef FilterWithBuffer FilterWithBufferInt32_Size5; typedef FilterWithBuffer FilterWithBufferInt32_Size6; typedef FilterWithBuffer FilterWithBufferInt32_Size7; typedef FilterWithBuffer FilterWithBufferUInt32_Size2; typedef FilterWithBuffer FilterWithBufferUInt32_Size3; typedef FilterWithBuffer FilterWithBufferUInt32_Size4; typedef FilterWithBuffer FilterWithBufferUInt32_Size5; typedef FilterWithBuffer FilterWithBufferUInt32_Size6; typedef FilterWithBuffer FilterWithBufferUInt32_Size7; // Constructor template FilterWithBuffer::FilterWithBuffer() : Filter(), sample_index(0) { // clear sample buffer reset(); } // reset - clear all samples from the buffer template void FilterWithBuffer::reset() { // call base class reset Filter::reset(); // clear samples buffer for( int8_t i=0; i T FilterWithBuffer::apply(T sample) { // add sample to array samples[sample_index++] = sample; // wrap index if necessary if( sample_index >= FILTER_SIZE ) sample_index = 0; // base class doesn't know what filtering to do so we just return the raw sample return sample; } #endif