APM:Libraries
LowPassFilter2p.cpp
Go to the documentation of this file.
1 #include "LowPassFilter2p.h"
2 
3 
5 // DigitalBiquadFilter
7 
8 template <class T>
10  _delay_element_1 = T();
11  _delay_element_2 = T();
12 }
13 
14 template <class T>
15 T DigitalBiquadFilter<T>::apply(const T &sample, const struct biquad_params &params) {
16  if(is_zero(params.cutoff_freq) || is_zero(params.sample_freq)) {
17  return sample;
18  }
19 
20  T delay_element_0 = sample - _delay_element_1 * params.a1 - _delay_element_2 * params.a2;
21  T output = delay_element_0 * params.b0 + _delay_element_1 * params.b1 + _delay_element_2 * params.b2;
22 
23  _delay_element_2 = _delay_element_1;
24  _delay_element_1 = delay_element_0;
25 
26  return output;
27 }
28 
29 template <class T>
31  _delay_element_1 = _delay_element_2 = T();
32 }
33 
34 template <class T>
35 void DigitalBiquadFilter<T>::compute_params(float sample_freq, float cutoff_freq, biquad_params &ret) {
36  ret.cutoff_freq = cutoff_freq;
37  ret.sample_freq = sample_freq;
38 
39  float fr = sample_freq/cutoff_freq;
40  float ohm = tanf(M_PI/fr);
41  float c = 1.0f+2.0f*cosf(M_PI/4.0f)*ohm + ohm*ohm;
42 
43  ret.b0 = ohm*ohm/c;
44  ret.b1 = 2.0f*ret.b0;
45  ret.b2 = ret.b0;
46  ret.a1 = 2.0f*(ohm*ohm-1.0f)/c;
47  ret.a2 = (1.0f-2.0f*cosf(M_PI/4.0f)*ohm+ohm*ohm)/c;
48 }
49 
50 
52 // LowPassFilter2p
54 
55 template <class T>
57  memset(&_params, 0, sizeof(_params) );
58 }
59 
60 // constructor
61 template <class T>
62 LowPassFilter2p<T>::LowPassFilter2p(float sample_freq, float cutoff_freq) {
63  // set initial parameters
64  set_cutoff_frequency(sample_freq, cutoff_freq);
65 }
66 
67 // change parameters
68 template <class T>
69 void LowPassFilter2p<T>::set_cutoff_frequency(float sample_freq, float cutoff_freq) {
70  DigitalBiquadFilter<T>::compute_params(sample_freq, cutoff_freq, _params);
71 }
72 
73 // return the cutoff frequency
74 template <class T>
76  return _params.cutoff_freq;
77 }
78 
79 template <class T>
81  return _params.sample_freq;
82 }
83 
84 template <class T>
85 T LowPassFilter2p<T>::apply(const T &sample) {
86  return _filter.apply(sample, _params);
87 }
88 
89 template <class T>
91  return _filter.reset();
92 }
93 
94 /*
95  * Make an instances
96  * Otherwise we have to move the constructor implementations to the header file :P
97  */
98 template class LowPassFilter2p<int>;
99 template class LowPassFilter2p<long>;
100 template class LowPassFilter2p<float>;
101 template class LowPassFilter2p<Vector2f>;
102 template class LowPassFilter2p<Vector3f>;
float get_sample_freq(void) const
T apply(const T &sample)
float get_cutoff_freq(void) const
bool is_zero(const T fVal1)
Definition: AP_Math.h:40
#define f(i)
void set_cutoff_frequency(float sample_freq, float cutoff_freq)
A class to implement a second order low pass filter.
T apply(const T &sample, const struct biquad_params &params)
#define M_PI
Definition: definitions.h:10
static void compute_params(float sample_freq, float cutoff_freq, biquad_params &ret)