Filters 1.0
LPF, HPF, BPF, BSF, SRL
Loading...
Searching...
No Matches
bpf_2.tpp
Go to the documentation of this file.
2
3template <typename T>
5{
6 reset();
7}
8
9template <typename T>
10void filter::band_pass::BPF_2<T>::config(T f0_, T B_, T dt_)
11{
12 set_param(f0_, B_, dt_);
13}
14
15template <typename T>
16void filter::band_pass::BPF_2<T>::set_param(T f0_, T B_, T dt_)
17{
18 f0 = f0_;
19 B = B_;
20 dt = dt_;
21 Q = f0 / B;
22 T wc = 6.28318530717958647692528676655900576 * f0;
23
24 T w1 = 0.5 * (std::sqrt(B * B + 4.0 * wc * wc) - B);
25 if (w1 < 0)
26 {
27 w1 = 0;
28 }
29
30 T w2 = 0.5 * (std::sqrt(B * B + 4.0 * wc * wc) + B);
31
32 T w1_n = prewarp_freq(w1, dt);
33 T w2_n = prewarp_freq(w2, dt);
34
35 T wc_n = std::sqrt(w1_n * w2_n);
36 T B_n = w2_n - w1_n;
37
38 T Q_n = (wc_n / 6.28318530717958647692528676655900576) / B_n;
39
40 T b0 = 2.0 * dt;
41 T b1 = 0.0;
42 T b2 = -b0;
43 T a0 = dt * dt * wc_n * wc_n + (2.0 * dt * wc_n) / Q_n + 4.0;
44 T a1 = 2.0 * dt * dt * wc_n * wc_n - 8.0;
45 T a2 = dt * dt * wc_n * wc_n - (2.0 * dt * wc_n) / Q_n + 4.0;
46
47 lambda_1 = b0 / a0;
48 lambda_2 = b1 / a0;
49 lambda_3 = b2 / a0;
50 lambda_4 = -a1 / a0;
51 lambda_5 = -a2 / a0;
52}
53
54template <typename T>
56{
57 T y_k = 0.0;
58
59 if (start_counter <= 1)
60 {
61 y_k = x_k;
62 start_counter++;
63 }
64 else
65 {
66 y_k = lambda_1 * x_k + lambda_2 * x_k_1 + lambda_3 * x_k_2 + lambda_4 * y_k_1 + lambda_5 * y_k_2;
67 }
68 y_k_2 = y_k_1;
69 y_k_1 = y_k;
70 x_k_2 = x_k_1;
71 x_k_1 = x_k;
72
73 return y_k;
74}
75
76template <typename T>
78{
79 start_counter = 0;
80 y_k_1 = 0.0;
81 y_k_2 = 0.0;
82 x_k_1 = 0.0;
83 x_k_2 = 0.0;
84}
85
86template <typename T>
88{
89 set_param(f0_, B, dt);
90}
91
92template <typename T>
94{
95 set_param(f0, B_, dt);
96}
97
98template <typename T>
100{
101 set_param(f0, B, dt_);
102}
103
104template <typename T>
106{
107 return f0;
108}
109
110template <typename T>
112{
113 return B;
114}
115
116template <typename T>
118{
119 return dt;
120}
121
122template <typename T>
124{
125 return Q;
126}
127
128template <typename T>
130{
131 return 1.0 / dt;
132}
133
134template <typename T>
136{
137 return (2.0 * std::tan(0.5 * wc_ * dt_)) / dt_;
138}
Second-order band-pass filter.
void set_dt(T dt_)
Sets the sampling time.
Definition bpf_2.h:100
void config(T f0_, T B_, T dt_)
Configures the band-pass filter.
Definition bpf_2.h:11
T get_f0()
Gets the center frequency.
Definition bpf_2.h:106
T get_dt()
Gets the sampling time.
Definition bpf_2.h:118
T get_B()
Gets the bandwidth.
Definition bpf_2.h:112
T get_fs()
Gets the sampling frequency.
Definition bpf_2.h:130
T prewarp_freq(T wc_, T dt_)
Prewarps an angular cutoff frequency.
Definition bpf_2.h:136
T update(T x_k)
Processes a new input sample.
Definition bpf_2.h:56
void reset()
Resets the filter state.
Definition bpf_2.h:78
void set_param(T f0_, T B_, T dt_)
Sets the filter parameters.
Definition bpf_2.h:17
BPF_2()
Constructs a second-order band-pass filter.
Definition bpf_2.h:5
T get_Q()
Gets the quality factor.
Definition bpf_2.h:124
void set_f0(T f0_)
Sets the center frequency.
Definition bpf_2.h:88
void set_B(T B_)
Sets the bandwidth.
Definition bpf_2.h:94