void DspVCF::calculateFilterCoefficients(float f, float q) { float r, oneminusr, omega; if (f < 0.001f) f = 10.0f; if (q < 0.0f) q = 0.0f; this->centerFrequency = f; this->q = q; omega = f * (2.0f * M_PI) / sampleRate; if (q < 0.001) oneminusr = 1.0f; else oneminusr = omega/q; if (oneminusr > 1.0f) oneminusr = 1.0f; r = 1.0f - oneminusr; coef1 = 2.0f * sigbp_qcos(omega) * r; coef2 = - r * r; gain = 2 * oneminusr * (oneminusr + r * omega); }
static void sigbp_docoef(t_sigbp *x, t_floatarg f, t_floatarg q) { float r, oneminusr, omega; if (f < 0.001) f = 10; if (q < 0) q = 0; x->x_freq = f; x->x_q = q; omega = f * (2.0f * 3.14159f) / x->x_sr; if (q < 0.001) oneminusr = 1.0f; else oneminusr = omega/q; if (oneminusr > 1.0f) oneminusr = 1.0f; r = 1.0f - oneminusr; x->x_ctl->c_coef1 = ftofix(2.0f * sigbp_qcos(omega) * r); x->x_ctl->c_coef2 = ftofix(- r * r); x->x_ctl->c_gain = ftofix(2 * oneminusr * (oneminusr + r * omega)); /* post("r %f, omega %f, coef1 %f, coef2 %f", r, omega, x->x_ctl->c_coef1, x->x_ctl->c_coef2); */ }