iir1
Loading...
Searching...
No Matches
State.h
1
35
36#pragma once
37
38#include "Common.h"
39#include "Biquad.h"
40
41
42#define DEFAULT_STATE DirectFormII
43
44namespace Iir {
45
54 class IIR_EXPORT DirectFormI
55 {
56 public:
57 DirectFormI () = default;
58
59 void reset ()
60 {
61 m_x1 = 0;
62 m_x2 = 0;
63 m_y1 = 0;
64 m_y2 = 0;
65 }
66
67 inline double filter(const double in,
68 const Biquad& s)
69 {
70 const double out = s.m_b0*in + s.m_b1*m_x1 + s.m_b2*m_x2
71 - s.m_a1*m_y1 - s.m_a2*m_y2;
72 m_x2 = m_x1;
73 m_y2 = m_y1;
74 m_x1 = in;
75 m_y1 = out;
76
77 return out;
78 }
79
80 protected:
81 double m_x2 = 0.0; // x[n-2]
82 double m_y2 = 0.0; // y[n-2]
83 double m_x1 = 0.0; // x[n-1]
84 double m_y1 = 0.0; // y[n-1]
85 };
86
87//------------------------------------------------------------------------------
88
98 class IIR_EXPORT DirectFormII
99 {
100 public:
101 DirectFormII () = default;
102
103 void reset ()
104 {
105 m_v1 = 0.0;
106 m_v2 = 0.0;
107 }
108
109 inline double filter(const double in,
110 const Biquad& s)
111 {
112 const double w = in - s.m_a1*m_v1 - s.m_a2*m_v2;
113 const double out = s.m_b0*w + s.m_b1*m_v1 + s.m_b2*m_v2;
114
115 m_v2 = m_v1;
116 m_v1 = w;
117
118 return out;
119 }
120
121 private:
122 double m_v1 = 0.0; // v[-1]
123 double m_v2 = 0.0; // v[-2]
124 };
125
126
127//------------------------------------------------------------------------------
128
129 class IIR_EXPORT TransposedDirectFormII
130 {
131 public:
132 TransposedDirectFormII() = default;
133
134 void reset ()
135 {
136 m_s1 = 0.0;
137 m_s1_1 = 0.0;
138 m_s2 = 0.0;
139 m_s2_1 = 0.0;
140 }
141
142 inline double filter(const double in,
143 const Biquad& s)
144 {
145 const double out = m_s1_1 + s.m_b0*in;
146 m_s1 = m_s2_1 + s.m_b1*in - s.m_a1*out;
147 m_s2 = s.m_b2*in - s.m_a2*out;
148 m_s1_1 = m_s1;
149 m_s2_1 = m_s2;
150
151 return out;
152 }
153
154 private:
155 double m_s1 = 0.0;
156 double m_s1_1 = 0.0;
157 double m_s2 = 0.0;
158 double m_s2_1 = 0.0;
159 };
160
161}
Definition Biquad.h:51
Definition Biquad.cpp:40