OpenWareLaboratory
FirFilter.h
Go to the documentation of this file.
1 #ifndef __FirFilter_h__
2 #define __FirFilter_h__
3 
4 #include "FloatArray.h"
5 #include "SignalProcessor.h"
6 
7 class FirFilter : public SignalProcessor {
8 private:
9  FloatArray coefficients;
10  FloatArray states;
11  size_t blockSize;
12 #ifdef ARM_CORTEX
13  arm_fir_instance_f32 instance;
14 #else
15  size_t index = 0;
16 #endif /* ARM_CORTEX */
17 
18  void processBlock(float* source, float* destination, size_t size){
19 #ifdef ARM_CORTEX
20  arm_fir_f32(&instance, source, destination, size);
21 #else
22  for(size_t n = 0; n < size; n++){
23  states[index] = source[n];
24  size_t tempIndex = index;
25  float y = 0;
26  for(size_t k = 0; k < coefficients.getSize(); k++){
27  y += coefficients[k] * states[tempIndex];
28  tempIndex = (tempIndex == states.getSize()) ? 0 : tempIndex+1;
29  }
30  destination[n] = y;
31  // destination[n] = 0;
32  if(++index == states.getSize())
33  index = 0;
34  }
35 #endif /* ARM_CORTEX */
36  }
37 
38 public:
39  FirFilter() {}
40 
41  FirFilter(FloatArray cfs, FloatArray ste, size_t bsize)
42  : coefficients(cfs), states(ste), blockSize(bsize) {
43 #ifdef ARM_CORTEX
44  arm_fir_init_f32(&instance, coefficients.getSize(), coefficients.getData(), states.getData(), blockSize);
45 #else
46  index = 0;
47 #endif /* ARM_CORTEX */
48  }
49 
51  }
52 
53  float process(float input){
54  float output;
55  processBlock(&input, &output, 1);
56  return output;
57  }
58 
59  void process(FloatArray buffer){
60  ASSERT(buffer.getSize()<=blockSize, "Too large"); //TODO: check that in-place actually works properly
61  processBlock(buffer.getData(), buffer.getData(), buffer.getSize());
62  }
63 
64  void process(FloatArray source, FloatArray destination){
65  ASSERT(source.getSize()<=blockSize, "Too large");
66  ASSERT(source.getSize()==destination.getSize(), "Sizes don't match");
67  processBlock(source.getData(), destination.getData(), destination.getSize());
68  }
69 
70  [[deprecated("use process() instead.")]]
71  void processBlock(FloatArray buffer){
72  process(buffer);
73  }
74  [[deprecated("use process() instead.")]]
75  void processBlock(FloatArray source, FloatArray destination){
76  process(source, destination);
77  }
78 
80  return coefficients;
81  };
82 
86  void setCoefficients(FloatArray newCoefficients){
87  coefficients = newCoefficients;
88  }
89 
93  void copyCoefficients(FloatArray newCoefficients){
94  ASSERT(coefficients.getSize()==newCoefficients.getSize(), "wrong size");
95  coefficients.copyFrom(newCoefficients);
96  }
97 
99  return states;
100  };
101 
105  void setState(FloatArray newState){
106  states = newState;
107  }
108 
112  void copyState(FloatArray newState){
113  ASSERT(states.getSize()==newState.getSize(), "wrong size");
114  states.copyFrom(newState);
115  }
116 
117  static FirFilter* create(size_t taps, size_t blocksize){
118  FloatArray coefficients = FloatArray::create(taps);
119  FloatArray states = FloatArray::create(taps + blocksize - 1);
120  states.clear();
121  return new FirFilter(coefficients, states, blocksize);
122  }
123 
124  static void destroy(FirFilter* filter){
125  FloatArray::destroy(filter->coefficients);
126  FloatArray::destroy(filter->states);
127  delete filter;
128  }
129 };
130 #endif // __FirFilter_h__
void process(FloatArray source, FloatArray destination)
Definition: FirFilter.h:64
void setCoefficients(FloatArray newCoefficients)
Sets coefficients to point to a different set of values.
Definition: FirFilter.h:86
static FirFilter * create(size_t taps, size_t blocksize)
Definition: FirFilter.h:117
float process(float input)
Definition: FirFilter.h:53
FirFilter()
Definition: FirFilter.h:39
void processBlock(FloatArray buffer)
Definition: FirFilter.h:71
void setState(FloatArray newState)
Sets state to point to a different set of values.
Definition: FirFilter.h:105
FloatArray getCoefficients()
Definition: FirFilter.h:79
void copyCoefficients(FloatArray newCoefficients)
Copies coefficient values from an array.
Definition: FirFilter.h:93
void processBlock(FloatArray source, FloatArray destination)
Definition: FirFilter.h:75
~FirFilter()
Definition: FirFilter.h:50
void process(FloatArray buffer)
Definition: FirFilter.h:59
void copyState(FloatArray newState)
Copies state values from an array.
Definition: FirFilter.h:112
FloatArray getState()
Definition: FirFilter.h:98
static void destroy(FirFilter *filter)
Definition: FirFilter.h:124
FirFilter(FloatArray cfs, FloatArray ste, size_t bsize)
Definition: FirFilter.h:41
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
void clear()
Clear the array.
Definition: FloatArray.h:29
static void destroy(FloatArray array)
Destroys a FloatArray created with the create() method.
Definition: FloatArray.cpp:472
static FloatArray create(int size)
Creates a new FloatArray.
Definition: FloatArray.cpp:466
Base class for signal processors such as Filters.
void copyFrom(SimpleArray< T > source)
Copies the content of another array into this array.
Definition: SimpleArray.h:86
size_t getSize() const
Definition: SimpleArray.h:31
T * getData()
Get the data stored in the Array.
Definition: SimpleArray.h:27
#define ASSERT(cond, msg)
Definition: message.h:16