HARDT - The Ham Radio DSP Toolkit
hmovingaveragefilter.h
1 #ifndef __HMOVINGAVERAGEFILTER_H
2 #define __HMOVINGAVERAGEFILTER_H
3 
4 #include "hfilter.h"
5 
9 template <class T>
10 class HMovingAverageFilter: public HFilter<T>
11 {
12  private:
13 
14  int _m;
15  double* _previous;
16 
17  void Init(size_t blocksize, int m) {
18  if( _previous != nullptr ) {
19  delete[] _previous;
20  }
21  _previous = new double[m - 1];
22  memset((void*) _previous, 0, sizeof(T) * (m - 1));
23  }
24 
25  public:
26 
28  HMovingAverageFilter(HWriter<T>* writer, int m, size_t blocksize, HProbe<T>* probe = NULL):
29  HFilter<T>(writer, blocksize, probe),
30  _m(m),
31  _previous(nullptr)
32  {
33  Init(blocksize, m);
34  }
35 
37  HMovingAverageFilter(HWriterConsumer<T>* consumer, int m, size_t blocksize, HProbe<T>* probe = NULL):
38  HFilter<T>(consumer, blocksize, probe),
39  _m(m),
40  _previous(nullptr)
41  {
42  Init(blocksize, m);
43  }
44 
46  HMovingAverageFilter(HReader<T>* reader, int m, size_t blocksize, HProbe<T>* probe = NULL):
47  HFilter<T>(reader, blocksize, probe),
48  _m(m),
49  _previous(nullptr)
50  {
51  Init(blocksize, m);
52  }
53 
56  {}
57 
59  void Filter(T* src, T* dest, size_t blocksize)
60  {
61  for(int i = 0; i < blocksize; i++ ) {
62  double sum = 0;
63 
64  for( int j = 0; j < _m; j++ ) {
65  if( i - _m + j + 1 < 0 ) {
66  sum += (double) _previous[j];
67  } else {
68  sum += (double) src[i - _m + j + 1];
69  }
70  }
71 
72  sum /= _m;
73  dest[i] = (T) sum;
74  }
75 
76  for( int i = 0; i < _m - 1; i++ ) {
77  _previous[i] = (double) src[blocksize - _m + i + 1];
78  }
79  }
80 
82  void SetM(int m) {
83  Init(HFilter<T>::_blocksize, m);
84  _m = m;
85  }
86 };
87 
88 #endif
HMovingAverageFilter::HMovingAverageFilter
HMovingAverageFilter(HReader< T > *reader, int m, size_t blocksize, HProbe< T > *probe=NULL)
Definition: hmovingaveragefilter.h:46
HMovingAverageFilter
Definition: hmovingaveragefilter.h:10
HMovingAverageFilter::Filter
void Filter(T *src, T *dest, size_t blocksize)
Definition: hmovingaveragefilter.h:59
HWriter
Definition: hwriter.h:10
HFilter
Definition: hfilter.h:14
HReader
Definition: hreader.h:24
HProbe
Definition: hprobe.h:10
HMovingAverageFilter::HMovingAverageFilter
HMovingAverageFilter(HWriterConsumer< T > *consumer, int m, size_t blocksize, HProbe< T > *probe=NULL)
Definition: hmovingaveragefilter.h:37
HMovingAverageFilter::HMovingAverageFilter
HMovingAverageFilter(HWriter< T > *writer, int m, size_t blocksize, HProbe< T > *probe=NULL)
Definition: hmovingaveragefilter.h:28
HMovingAverageFilter::SetM
void SetM(int m)
Definition: hmovingaveragefilter.h:82
HWriterConsumer
Definition: hwriterconsumer.h:8
HMovingAverageFilter::~HMovingAverageFilter
~HMovingAverageFilter()
Definition: hmovingaveragefilter.h:55