23#ifndef __CALF_BIQUAD_H
24#define __CALF_BIQUAD_H
30#define M_PI 3.14159265358979323846264338327
74 inline void set_lp_rbj(
float fc,
float q,
float sr,
float gain = 1.0)
76 double omega=(2.0*
M_PI*fc/sr);
79 double alpha=(sn/(2*
q));
80 double inv=(1.0/(1.0+alpha));
82 a2 =
a0 = (gain*inv*(1.0 - cs)*0.5);
85 b2 = ((1.0 - alpha)*inv);
95 double omega=(
M_PI*fc*odsr);
96 double omega2=omega*omega;
97 double K=omega*(1+omega2*omega2*(1.0/1.45));
100 double iQK=1.0f/(QK+K);
103 b1 = (2.*(KK-1.f)*inv);
104 a2 =
a0 = (inv*gain*KK);
114 inline void set_hp_rbj(
float fc,
float q,
float esr,
float gain=1.0)
116 double omega=(double)(2*
M_PI*fc/esr);
117 double sn=sin(omega);
118 double cs=cos(omega);
119 double alpha=(double)(sn/(2*
q));
121 double inv=(double)(1.0/(1.0+alpha));
123 a0 = (gain*inv*(1 + cs)/2);
127 b2 = ((1 - alpha)*inv);
133 double omega=(double)(2*
M_PI*fc/esr);
134 double sn=omega+omega*omega*omega*(1.0/6.0)+omega*omega*omega*omega*omega*(1.0/120);
135 double cs=1-omega*omega*(1.0/2.0)+omega*omega*omega*omega*(1.0/24);
136 double alpha=(double)(sn/(2*
q));
138 double inv=(double)(1.0/(1.0+alpha));
140 a0 = (gain*inv*(1 + cs)*(1.0/2.0));
144 b2 = ((1. - alpha)*inv);
153 inline void set_bp_rbj(
double fc,
double q,
double esr,
double gain=1.0)
155 double omega=(double)(2*
M_PI*fc/esr);
156 double sn=sin(omega);
157 double cs=cos(omega);
158 double alpha=(double)(sn/(2*
q));
160 double inv=(double)(1.0/(1.0+alpha));
162 a0 = (double)(gain*inv*alpha);
164 a2 = (double)(-gain*inv*alpha);
165 b1 = (double)(-2*cs*inv);
166 b2 = (double)((1 - alpha)*inv);
170 inline void set_br_rbj(
double fc,
double q,
double esr,
double gain=1.0)
172 double omega=(double)(2*
M_PI*fc/esr);
173 double sn=sin(omega);
174 double cs=cos(omega);
175 double alpha=(double)(sn/(2*
q));
177 double inv=(double)(1.0/(1.0+alpha));
180 a1 = (-gain*inv*2.*cs);
183 b2 = ((1. - alpha)*inv);
195 if (
freq>sr*0.49)
freq=(float)(sr*0.49);
199 static inline double unwarp(
float omega,
float sr)
202 return (2 / T) * atan(omega * T / 2);
208 double omega = 1.0 /
t;
209 omega =
unwarp(omega, sr);
211 double f =
M_PI / omega;
215 void set_bilinear(
double aa0,
double aa1,
double aa2,
double ab0,
double ab1,
double ab2)
217 double q=(double)(1.0/(ab0+ab1+ab2));
218 a0 = (aa0+aa1+aa2)*
q;
220 a2 = (aa0-aa1+aa2)*
q;
222 b2 = (ab0-ab1+ab2)*
q;
242 double A = sqrt(peak);
243 double w0 =
freq * 2 *
M_PI * (1.0 / sr);
244 double alpha = sin(w0) / (2 *
q);
245 double ib0 = 1.0 / (1 + alpha/
A);
246 a1 =
b1 = -2*cos(w0) * ib0;
247 a0 = ib0 * (1 + alpha*
A);
248 a2 = ib0 * (1 - alpha*
A);
249 b2 = ib0 * (1 - alpha/
A);
258 double A = sqrt(peak);
259 double w0 =
freq * 2 *
M_PI * (1.0 / sr);
260 double alpha = sin(w0) / (2 *
q);
261 double cw0 = cos(w0);
262 double tmp = 2 * sqrt(
A) * alpha;
263 double b0 = 0.f, ib0 = 0.f;
265 a0 =
A*( (
A+1) - (
A-1)*cw0 + tmp);
266 a1 = 2*
A*( (
A-1) - (
A+1)*cw0);
267 a2 =
A*( (
A+1) - (
A-1)*cw0 - tmp);
268 b0 = (
A+1) + (
A-1)*cw0 + tmp;
269 b1 = -2*( (
A-1) + (
A+1)*cw0);
270 b2 = (
A+1) + (
A-1)*cw0 - tmp;
286 double A = sqrt(peak);
287 double w0 =
freq * 2 *
M_PI * (1.0 / sr);
288 double alpha = sin(w0) / (2 *
q);
289 double cw0 = cos(w0);
290 double tmp = 2 * sqrt(
A) * alpha;
291 double b0 = 0.f, ib0 = 0.f;
293 a0 =
A*( (
A+1) + (
A-1)*cw0 + tmp);
294 a1 = -2*
A*( (
A-1) + (
A+1)*cw0);
295 a2 =
A*( (
A+1) + (
A-1)*cw0 - tmp);
296 b0 = (
A+1) - (
A-1)*cw0 + tmp;
297 b1 = 2*( (
A-1) - (
A+1)*cw0);
298 b2 = (
A+1) - (
A-1)*cw0 - tmp;
327 return std::abs(
h_z(
z));
417 return (
y1 == 0. &&
y2 == 0.);
469 return (
w1 == 0.f &&
w2 == 0.f);
510 #define _DO_COEFF(coeff) coeff##delta = (coeff - coeff##cur) * (frac)
584 return (
y1 == 0. &&
y2 == 0.);
590template<
class F1,
class F2>
602 return f1.h_z(
z) *
f2.h_z(
z);
614 return std::abs(
h_z(
z));
624template<
class F1,
class F2>
636 return f1.h_z(
z) +
f2.h_z(
z);
648 return std::abs(
h_z(
z));
uint8_t a
Definition Spc_Cpu.h:141
#define _DO_COEFF(coeff)
Definition biquad.h:510
void set_lowshelf_rbj(float freq, float q, float peak, float sr)
Definition biquad.h:256
biquad_coeffs()
Definition biquad.h:55
void set_lp_zoelzer(float fc, float q, float odsr, float gain=1.0)
Definition biquad.h:93
void set_br_rbj(double fc, double q, double esr, double gain=1.0)
Definition biquad.h:170
void set_bilinear(double aa0, double aa1, double aa2, double ab0, double ab1, double ab2)
set digital filter parameters based on given analog filter parameters
Definition biquad.h:215
void copy_coeffs(const biquad_coeffs &src)
copy coefficients from another biquad
Definition biquad.h:309
double b2
Definition biquad.h:52
double a0
Definition biquad.h:52
void set_peakeq_rbj(double freq, double q, double peak, double sr)
Definition biquad.h:240
static double prewarp(float freq, float sr)
prewarping for bilinear transform, maps given digital frequency to analog counterpart for analog filt...
Definition biquad.h:193
void set_lp_rbj(float fc, float q, float sr, float gain=1.0)
Definition biquad.h:74
void set_hp_rbj_optimized(float fc, float q, float esr, float gain=1.0)
Definition biquad.h:131
double a2
Definition biquad.h:52
cfloat h_z(const cfloat &z) const
Definition biquad.h:332
void set_hp_rbj(float fc, float q, float esr, float gain=1.0)
Definition biquad.h:114
void set_allpass(float freq, float pole_r, float sr)
Definition biquad.h:186
float freq_gain(float freq, float sr) const
Definition biquad.h:321
std::complex< double > cfloat
Definition biquad.h:53
void set_bp_rbj(double fc, double q, double esr, double gain=1.0)
Definition biquad.h:153
static double unwarp(float omega, float sr)
convert analog angular frequency value to digital
Definition biquad.h:199
double b1
Definition biquad.h:52
static double unwarpf(float t, float sr)
convert analog filter time constant to digital counterpart
Definition biquad.h:205
double a1
Definition biquad.h:52
void set_bilinear_direct(double aa0, double aa1, double aa2, double ab1, double ab2)
set digital filter parameters directly
Definition biquad.h:226
void set_null()
Definition biquad.h:60
void set_highshelf_rbj(float freq, float q, float peak, float sr)
Definition biquad.h:284
Compose two filters in series.
Definition biquad.h:591
std::complex< float > cfloat
Definition biquad.h:593
F2 f2
Definition biquad.h:595
float process(float value)
Definition biquad.h:597
float freq_gain(float freq, float sr) const
Definition biquad.h:608
void sanitize()
Definition biquad.h:617
F1 f1
Definition biquad.h:594
cfloat h_z(const cfloat &z) const
Definition biquad.h:601
Compose two filters in parallel.
Definition biquad.h:625
double process(double value)
Definition biquad.h:631
void sanitize()
Definition biquad.h:651
cfloat h_z(const cfloat &z) const
Definition biquad.h:635
std::complex< double > cfloat
Definition biquad.h:627
F1 f1
Definition biquad.h:628
F2 f2
Definition biquad.h:629
float freq_gain(float freq, float sr) const
Definition biquad.h:642
#define M_PI
Definition compat.h:149
unsigned z
Definition inflate.c:1589
struct huft * t
Definition inflate.c:943
unsigned f
Definition inflate.c:1572
static PuglViewHint int value
Definition pugl.h:1708
JHUFF_TBL long freq[]
Definition jchuff.h:50
#define A(x)
Definition lice_arc.cpp:13
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
#define F1(x, y, z)
Definition md5.c:40
#define F2(x, y, z)
Definition md5.c:41
void zero(float &v)
Set a float to zero.
Definition primitives.h:41
void sanitize(float &value)
Definition primitives.h:354
void sanitize_denormal(float &value)
Definition primitives.h:374
void sanitize()
Sanitize (set to 0 if potentially denormal) filter state.
Definition biquad.h:558
double b1cur
Definition biquad.h:495
bool empty()
Definition biquad.h:583
double a2delta
Definition biquad.h:496
void big_step(double frac)
Definition biquad.h:511
double a2cur
Definition biquad.h:495
double y1
output[n-1]
Definition biquad.h:502
biquad_d1_lerp()
Constructor (initializes state to all zeros).
Definition biquad.h:506
double process_lp(double in)
simplified version for lowpass case with two zeros at -1
Definition biquad.h:548
double b1delta
Definition biquad.h:496
double a1delta
Definition biquad.h:496
double b2delta
Definition biquad.h:496
double a0cur
Definition biquad.h:495
double process(double in)
direct I form with four state variables
Definition biquad.h:521
double a0delta
Definition biquad.h:496
void reset()
Reset state variables.
Definition biquad.h:571
double process_zeroin()
direct I form with zero input
Definition biquad.h:537
double a1cur
Definition biquad.h:495
double y2
output[n-2]
Definition biquad.h:504
double x2
input[n-2]
Definition biquad.h:500
double b2cur
Definition biquad.h:495
double x1
input[n-1]
Definition biquad.h:498
double process_zeroin()
direct I form with zero input
Definition biquad.h:372
void sanitize()
Sanitize (set to 0 if potentially denormal) filter state.
Definition biquad.h:401
double x2
input[n-2]
Definition biquad.h:350
double process_lp(double in)
simplified version for lowpass case with two zeros at -1
Definition biquad.h:381
bool empty() const
Definition biquad.h:416
double process_hp(double in)
simplified version for highpass case with two zeros at 1
Definition biquad.h:391
double process(double in)
direct I form with four state variables
Definition biquad.h:361
double y1
output[n-1]
Definition biquad.h:352
double y2
output[n-2]
Definition biquad.h:354
double x1
input[n-1]
Definition biquad.h:348
biquad_d1()
Constructor (initializes state to all zeros).
Definition biquad.h:356
void reset()
Reset state variables.
Definition biquad.h:409
bool empty() const
Is the filter state completely silent? (i.e. set to 0 by sanitize function).
Definition biquad.h:468
biquad_d2()
Constructor (initializes state to all zeros).
Definition biquad.h:436
double w1
state[n-1]
Definition biquad.h:432
void reset()
Reset state variables.
Definition biquad.h:481
double process(double in)
direct II form with two state variables
Definition biquad.h:441
double process_lp(double in)
Definition biquad.h:458
double w2
state[n-2]
Definition biquad.h:434
void sanitize()
Sanitize (set to 0 if potentially denormal) filter state.
Definition biquad.h:474
int n
Definition crypt.c:458
register uch * q
Definition fileio.c:817