43 IFilter(std::string description) : description_(description) {}
47 std::string description()
const;
49 virtual IFilter* clone() = 0;
50 virtual unsigned int order()
const = 0;
52 unsigned int nchannels()
const;
53 bool realized()
const;
54 void realize(
unsigned int nchannels,
double init = 0.0);
58 virtual double process_channel(
double,
unsigned int channel) = 0;
61 virtual void process_sample(std::vector<double>&, std::vector<double>&) = 0;
62 virtual void process_sample(std::vector<double>::iterator, std::vector<double>::iterator) = 0;
63 virtual void process_sample(
double*,
double*) = 0;
66 virtual void process_channel(std::vector<double>&, std::vector<double>&,
67 unsigned int channel = 0) = 0;
68 virtual void process_channel(uint64_t nsamples, std::vector<double>::iterator,
69 std::vector<double>::iterator,
unsigned int channel = 0) = 0;
70 virtual void process_channel(uint64_t nsamples,
double*,
double*,
unsigned int channel) = 0;
73 virtual void process_by_channel(std::vector<std::vector<double>>&,
74 std::vector<std::vector<double>>&) = 0;
75 virtual void process_by_sample(std::vector<std::vector<double>>&,
76 std::vector<std::vector<double>>&) = 0;
77 virtual void process_by_channel(uint64_t nsamples,
double**,
79 virtual void process_by_sample(uint64_t nsamples,
double**,
81 virtual void process_by_channel(uint64_t nsamples, std::vector<double>&,
82 std::vector<double>&) = 0;
83 virtual void process_by_sample(uint64_t nsamples, std::vector<double>&,
84 std::vector<double>&) = 0;
87 virtual bool realize_filter(
unsigned int nchannels,
double init) = 0;
88 virtual void unrealize_filter() {};
91 std::string description_;
92 bool realized_ =
false;
93 unsigned int nchannels_ = 0;
96class FirFilter :
public IFilter {
98 FirFilter(
const std::vector<double>& coefficients, std::string description =
"");
99 virtual IFilter* clone();
101 static FirFilter* FromStream(std::istream& stream, std::string description,
102 bool binary =
false);
104 unsigned int order()
const final;
106 std::size_t group_delay()
const;
109 double process_channel(
double input,
unsigned int channel = 0)
final;
112 void process_sample(std::vector<double>& input, std::vector<double>& output)
final;
113 void process_sample(std::vector<double>::iterator input,
114 std::vector<double>::iterator output)
final;
115 void process_sample(
double* input,
double* output)
final;
118 void process_channel(std::vector<double>& input, std::vector<double>& output,
119 unsigned int channel = 0)
final;
120 void process_channel(uint64_t nsamples, std::vector<double>::iterator input,
121 std::vector<double>::iterator output,
unsigned int channel = 0);
122 void process_channel(uint64_t nsamples,
double* input,
double* output,
123 unsigned int channel = 0);
126 void process_by_channel(std::vector<std::vector<double>>& input,
127 std::vector<std::vector<double>>& output)
final;
128 void process_by_sample(std::vector<std::vector<double>>& input,
129 std::vector<std::vector<double>>& output)
final;
130 void process_by_channel(uint64_t nsamples,
double** input,
double** output)
final;
131 void process_by_sample(uint64_t nsamples,
double** input,
double** output)
final;
133 virtual void process_by_channel(uint64_t nsamples, std::vector<double>& input,
134 std::vector<double>& output);
135 virtual void process_by_sample(uint64_t nsamples, std::vector<double>& input,
136 std::vector<double>& output);
139 bool realize_filter(
unsigned int nchannels,
double init = 0.0)
final;
140 void unrealize_filter()
final;
143 std::vector<double> coefficients_;
144 double* pcoefficients_;
147 std::vector<std::vector<double>> registers_;
148 std::vector<double*> pregisters_;
153class SlopeFilter :
public FirFilter {
155 SlopeFilter(uint32_t window_size, uint32_t order, uint32_t derivative_order,
156 std::string description =
"")
157 : FirFilter(gram_sg::compute_weights(window_size, window_size, order, derivative_order),
159 window_size_(window_size),
161 derivative_order_(derivative_order) {};
163 static SlopeFilter* FromStream(std::istream& stream, std::string description,
bool binary);
165 virtual IFilter* clone() {
return new SlopeFilter(window_size_, order_, derivative_order_); };
170 uint32_t derivative_order_;
173 static constexpr uint16_t DEFAULT_WINDOW_SIZE = 4;
174 static constexpr uint8_t DEFAULT_ORDER = 1;
175 static constexpr uint8_t DEFAULT_DERIVATIVE_ORDER = 1;
178class BiquadFilter :
public IFilter {
180 BiquadFilter(
double gain, std::vector<std::array<double, 6>>& coefficients,
181 std::string description =
"");
182 virtual IFilter* clone();
184 static BiquadFilter* FromStream(std::istream& stream, std::string description,
bool binary);
186 unsigned int order()
const final;
189 double process_channel(
double x,
unsigned int c = 0)
final;
192 void process_sample(std::vector<double>& input, std::vector<double>& output)
final {};
193 void process_sample(std::vector<double>::iterator input,
194 std::vector<double>::iterator output)
final;
195 void process_sample(
double* input,
double* output)
final;
198 void process_channel(std::vector<double>& input, std::vector<double>& output,
199 unsigned int channel = 0)
final;
200 void process_channel(uint64_t nsamples, std::vector<double>::iterator input,
201 std::vector<double>::iterator output,
unsigned int channel = 0)
final;
202 void process_channel(uint64_t nsamples,
double* input,
double* output,
203 unsigned int channel = 0)
final;
206 void process_by_channel(std::vector<std::vector<double>>& input,
207 std::vector<std::vector<double>>& output)
final;
208 void process_by_sample(std::vector<std::vector<double>>& input,
209 std::vector<std::vector<double>>& output)
final;
210 void process_by_channel(uint64_t nsamples,
double** input,
double** output)
final;
211 void process_by_sample(uint64_t nsamples,
double** input,
double** output)
final;
213 virtual void process_by_channel(uint64_t nsamples, std::vector<double>& input,
214 std::vector<double>& output);
215 virtual void process_by_sample(uint64_t nsamples, std::vector<double>& input,
216 std::vector<double>& output);
219 bool realize_filter(
unsigned int nchannels,
double init = 0.0)
final;
220 void unrealize_filter()
final;
224 std::vector<std::array<double, 6>> coefficients_;
226 unsigned int nstages_;
228 std::vector<std::vector<std::array<double, 2>>> registers_;