123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- //
- /// @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
- #pragma once
- #include "FilterClass.h"
- template <class T, uint8_t FILTER_SIZE>
- class FilterWithBuffer : public Filter<T>
- {
- public:
- // constructor
- FilterWithBuffer();
- // apply - Add a new raw value to the filter, retrieve the filtered result
- virtual T apply(T sample) override;
- // reset - clear the filter
- virtual void reset() override;
- // get filter size
- uint8_t get_filter_size() const {
- return FILTER_SIZE;
- };
- T get_sample(uint8_t i) const {
- return samples[i];
- }
- 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<int16_t,2> FilterWithBufferInt16_Size2;
- typedef FilterWithBuffer<int16_t,3> FilterWithBufferInt16_Size3;
- typedef FilterWithBuffer<int16_t,4> FilterWithBufferInt16_Size4;
- typedef FilterWithBuffer<int16_t,5> FilterWithBufferInt16_Size5;
- typedef FilterWithBuffer<int16_t,6> FilterWithBufferInt16_Size6;
- typedef FilterWithBuffer<int16_t,7> FilterWithBufferInt16_Size7;
- typedef FilterWithBuffer<uint16_t,2> FilterWithBufferUInt16_Size2;
- typedef FilterWithBuffer<uint16_t,3> FilterWithBufferUInt16_Size3;
- typedef FilterWithBuffer<uint16_t,4> FilterWithBufferUInt16_Size4;
- typedef FilterWithBuffer<uint16_t,5> FilterWithBufferUInt16_Size5;
- typedef FilterWithBuffer<uint16_t,6> FilterWithBufferUInt16_Size6;
- typedef FilterWithBuffer<uint16_t,7> FilterWithBufferUInt16_Size7;
- typedef FilterWithBuffer<int32_t,2> FilterWithBufferInt32_Size2;
- typedef FilterWithBuffer<int32_t,3> FilterWithBufferInt32_Size3;
- typedef FilterWithBuffer<int32_t,4> FilterWithBufferInt32_Size4;
- typedef FilterWithBuffer<int32_t,5> FilterWithBufferInt32_Size5;
- typedef FilterWithBuffer<int32_t,6> FilterWithBufferInt32_Size6;
- typedef FilterWithBuffer<int32_t,7> FilterWithBufferInt32_Size7;
- typedef FilterWithBuffer<uint32_t,2> FilterWithBufferUInt32_Size2;
- typedef FilterWithBuffer<uint32_t,3> FilterWithBufferUInt32_Size3;
- typedef FilterWithBuffer<uint32_t,4> FilterWithBufferUInt32_Size4;
- typedef FilterWithBuffer<uint32_t,5> FilterWithBufferUInt32_Size5;
- typedef FilterWithBuffer<uint32_t,6> FilterWithBufferUInt32_Size6;
- typedef FilterWithBuffer<uint32_t,7> FilterWithBufferUInt32_Size7;
- // Constructor
- template <class T, uint8_t FILTER_SIZE>
- FilterWithBuffer<T,FILTER_SIZE>::FilterWithBuffer() :
- sample_index(0)
- {
- // clear sample buffer
- reset();
- }
- // reset - clear all samples from the buffer
- template <class T, uint8_t FILTER_SIZE>
- void FilterWithBuffer<T,FILTER_SIZE>::reset()
- {
- // clear samples buffer
- for( int8_t i=0; i<FILTER_SIZE; i++ ) {
- samples[i] = 0;
- }
- // reset index back to beginning of the array
- sample_index = 0;
- }
- // apply - take in a new raw sample, and return the filtered results
- template <class T, uint8_t FILTER_SIZE>
- T FilterWithBuffer<T,FILTER_SIZE>:: 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;
- }
|