#pragma once class Biquad { public: Biquad(); void copy_filter(const Biquad &other); void SetSampleRate(double fs); void set_freq(double f0); void set_s_eq(const double b[3], const double a[3]); void transform_s_to_z(); void process_block(float *dest_ptr, const float *src_ptr, long nbr_spl); void clear_buffers(); private: double _s_eq_b[3]; // Coefs for numerator (zeros) double _s_eq_a[3]; // Coefs for denominator (poles) double _z_eq_b[3]; // Direct coefficients, order z^(-n) double _z_eq_a[3]; // Recursive coefficients, order z^(-n) double sampleRate; // Hz, > 0 double _f0; // Hz, > 0, _f0 % (_sample_freq/2) != 0 double xn[2]; // Input memory, order z^(-n) double yn[2]; // Output memory, order z^(-n) int _mem_pos; // 0 or 1 inline double process_sample(double x); };