added prewarp_at_cutoff in bw_iir{1,2}

This commit is contained in:
Stefano D'Angelo 2025-01-28 15:45:41 +01:00
parent 20bb3a8193
commit 029ec29f6d
6 changed files with 57 additions and 11 deletions

View File

@ -57,7 +57,7 @@ static void plugin_mem_set(plugin *instance, void *mem) {
}
static void plugin_reset(plugin *instance) {
bw_iir1_coeffs_mm1(instance->sample_rate, instance->cutoff, instance->cutoff, instance->coeff_x, instance->coeff_lp, &instance->b0, &instance->b1, &instance->a1);
bw_iir1_coeffs_mm1(instance->sample_rate, instance->cutoff, 1, instance->cutoff, instance->coeff_x, instance->coeff_lp, &instance->b0, &instance->b1, &instance->a1);
float y;
bw_iir1_reset(0.f, &y, &instance->s, instance->b0, instance->b1, instance->a1);
instance->to_reset = 0;

View File

@ -63,7 +63,7 @@ static void plugin_mem_set(plugin *instance, void *mem) {
}
static void plugin_reset(plugin *instance) {
bw_iir2_coeffs_mm2(instance->sample_rate, instance->cutoff, instance->q, instance->cutoff, instance->coeff_x, instance->coeff_lp, instance->coeff_bp, instance->coeff_hp, &instance->b0, &instance->b1, &instance->b2, &instance->a1, &instance->a2);
bw_iir2_coeffs_mm2(instance->sample_rate, instance->cutoff, instance->q, 1, instance->cutoff, instance->coeff_x, instance->coeff_lp, instance->coeff_bp, instance->coeff_hp, &instance->b0, &instance->b1, &instance->b2, &instance->a1, &instance->a2);
float y;
bw_iir2_reset(0.f, &y, &instance->s1, &instance->s2, instance->b0, instance->b1, instance->b2, instance->a1, instance->a2);
instance->to_reset = 0;

View File

@ -54,7 +54,7 @@ void impl_set_sample_rate(impl handle, float sample_rate) {
void impl_reset(impl handle) {
plugin *instance = reinterpret_cast<plugin *>(handle);
bw_iir1_coeffs_mm1(instance->sample_rate, instance->cutoff, instance->cutoff, instance->coeff_x, instance->coeff_lp, &instance->b0, &instance->b1, &instance->a1);
bw_iir1_coeffs_mm1(instance->sample_rate, instance->cutoff, 1, instance->cutoff, instance->coeff_x, instance->coeff_lp, &instance->b0, &instance->b1, &instance->a1);
float x0[1] = { 0.f };
iir1Reset<1>(x0, BW_NULL, &instance->s, instance->b0, instance->b1, instance->a1);
instance->to_reset = 0;

View File

@ -60,7 +60,7 @@ void impl_set_sample_rate(impl handle, float sample_rate) {
void impl_reset(impl handle) {
plugin *instance = reinterpret_cast<plugin *>(handle);
bw_iir2_coeffs_mm2(instance->sample_rate, instance->cutoff, instance->q, instance->cutoff, instance->coeff_x, instance->coeff_lp, instance->coeff_bp, instance->coeff_hp, &instance->b0, &instance->b1, &instance->b2, &instance->a1, &instance->a2);
bw_iir2_coeffs_mm2(instance->sample_rate, instance->cutoff, instance->q, 1, instance->cutoff, instance->coeff_x, instance->coeff_lp, instance->coeff_bp, instance->coeff_hp, &instance->b0, &instance->b1, &instance->b2, &instance->a1, &instance->a2);
float x0[1] = { 0.f };
iir2Reset<1>(x0, BW_NULL, &instance->s1, &instance->s2, instance->b0, instance->b1, instance->b2, instance->a1, instance->a2);
instance->to_reset = 0;

View File

@ -121,6 +121,7 @@ static inline void bw_iir1_process_multi(
static inline void bw_iir1_coeffs_ap1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -133,6 +134,7 @@ static inline void bw_iir1_coeffs_ap1(
static inline void bw_iir1_coeffs_hp1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -145,6 +147,7 @@ static inline void bw_iir1_coeffs_hp1(
static inline void bw_iir1_coeffs_hs1_lin(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_lin,
float * BW_RESTRICT b0,
@ -158,6 +161,7 @@ static inline void bw_iir1_coeffs_hs1_lin(
static inline void bw_iir1_coeffs_hs1_dB(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_dB,
float * BW_RESTRICT b0,
@ -171,6 +175,7 @@ static inline void bw_iir1_coeffs_hs1_dB(
static inline void bw_iir1_coeffs_lp1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -183,6 +188,7 @@ static inline void bw_iir1_coeffs_lp1(
static inline void bw_iir1_coeffs_ls1_lin(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_lin,
float * BW_RESTRICT b0,
@ -196,6 +202,7 @@ static inline void bw_iir1_coeffs_ls1_lin(
static inline void bw_iir1_coeffs_ls1_dB(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_dB,
float * BW_RESTRICT b0,
@ -209,6 +216,7 @@ static inline void bw_iir1_coeffs_ls1_dB(
static inline void bw_iir1_coeffs_mm1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float coeff_x,
float coeff_lp,
@ -318,6 +326,7 @@ static inline void bw_iir1_process_multi(
}
#define BW_IIR1_COEFFS_COMMON \
prewarp_freq = prewarp_at_cutoff ? cutoff : prewarp_freq; \
const float t = bw_tanf(3.141592653589793f * prewarp_freq * bw_rcpf(sample_rate)); \
const float k = t * cutoff; \
const float d = bw_rcpf(k + prewarp_freq); \
@ -326,6 +335,7 @@ static inline void bw_iir1_process_multi(
static inline void bw_iir1_coeffs_ap1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -338,6 +348,7 @@ static inline void bw_iir1_coeffs_ap1(
static inline void bw_iir1_coeffs_hp1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -350,6 +361,7 @@ static inline void bw_iir1_coeffs_hp1(
static inline void bw_iir1_coeffs_hs1_lin(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_lin,
float * BW_RESTRICT b0,
@ -365,17 +377,19 @@ static inline void bw_iir1_coeffs_hs1_lin(
static inline void bw_iir1_coeffs_hs1_dB(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_dB,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
float * BW_RESTRICT a1) {
bw_iir1_coeffs_hs1_lin(sample_rate, cutoff, prewarp_freq, bw_dB2linf(high_gain_dB), b0, b1, a1);
bw_iir1_coeffs_hs1_lin(sample_rate, cutoff, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(high_gain_dB), b0, b1, a1);
}
static inline void bw_iir1_coeffs_lp1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -388,6 +402,7 @@ static inline void bw_iir1_coeffs_lp1(
static inline void bw_iir1_coeffs_ls1_lin(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_lin,
float * BW_RESTRICT b0,
@ -403,17 +418,19 @@ static inline void bw_iir1_coeffs_ls1_lin(
static inline void bw_iir1_coeffs_ls1_dB(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_dB,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
float * BW_RESTRICT a1) {
bw_iir1_coeffs_ls1_lin(sample_rate, cutoff, prewarp_freq, bw_dB2linf(dc_gain_dB), b0, b1, a1);
bw_iir1_coeffs_ls1_lin(sample_rate, cutoff, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(dc_gain_dB), b0, b1, a1);
}
static inline void bw_iir1_coeffs_mm1(
float sample_rate,
float cutoff,
char prewarp_at_cutoff,
float prewarp_freq,
float coeff_x,
float coeff_lp,

View File

@ -137,6 +137,7 @@ static inline void bw_iir2_coeffs_ap2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -152,6 +153,7 @@ static inline void bw_iir2_coeffs_bp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -167,6 +169,7 @@ static inline void bw_iir2_coeffs_hp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -182,6 +185,7 @@ static inline void bw_iir2_coeffs_hs2_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_lin,
float * BW_RESTRICT b0,
@ -198,6 +202,7 @@ static inline void bw_iir2_coeffs_hs2_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_dB,
float * BW_RESTRICT b0,
@ -214,6 +219,7 @@ static inline void bw_iir2_coeffs_lp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -229,6 +235,7 @@ static inline void bw_iir2_coeffs_ls2_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_lin,
float * BW_RESTRICT b0,
@ -245,6 +252,7 @@ static inline void bw_iir2_coeffs_ls2_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_dB,
float * BW_RESTRICT b0,
@ -261,6 +269,7 @@ static inline void bw_iir2_coeffs_mm2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float coeff_x,
float coeff_lp,
@ -280,6 +289,7 @@ static inline void bw_iir2_coeffs_notch(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -295,6 +305,7 @@ static inline void bw_iir2_coeffs_peak_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_lin,
float * BW_RESTRICT b0,
@ -311,6 +322,7 @@ static inline void bw_iir2_coeffs_peak_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_dB,
float * BW_RESTRICT b0,
@ -327,6 +339,7 @@ static inline void bw_iir2_coeffs_peak_lin_bw(
float sample_rate,
float cutoff,
float bandwidth,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_lin,
float * BW_RESTRICT b0,
@ -343,6 +356,7 @@ static inline void bw_iir2_coeffs_peak_dB_bw(
float sample_rate,
float cutoff,
float bandwidth,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_dB,
float * BW_RESTRICT b0,
@ -496,6 +510,7 @@ static inline void bw_iir2_process_multi(
}
#define BW_IIR2_COEFFS_COMMON \
prewarp_freq = prewarp_at_cutoff ? cutoff : prewarp_freq; \
const float t = bw_tanf(3.141592653589793f * prewarp_freq * bw_rcpf(sample_rate)); \
const float k1 = prewarp_freq * prewarp_freq; \
const float k2 = t * cutoff; \
@ -510,6 +525,7 @@ static inline void bw_iir2_coeffs_ap2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -526,6 +542,7 @@ static inline void bw_iir2_coeffs_bp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -542,6 +559,7 @@ static inline void bw_iir2_coeffs_hp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -558,6 +576,7 @@ static inline void bw_iir2_coeffs_hs2_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_lin,
float * BW_RESTRICT b0,
@ -582,6 +601,7 @@ static inline void bw_iir2_coeffs_hs2_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float high_gain_dB,
float * BW_RESTRICT b0,
@ -589,13 +609,14 @@ static inline void bw_iir2_coeffs_hs2_dB(
float * BW_RESTRICT b2,
float * BW_RESTRICT a1,
float * BW_RESTRICT a2) {
bw_iir2_coeffs_hs2_lin(sample_rate, cutoff, Q, prewarp_freq, bw_dB2linf(high_gain_dB), b0, b1, b2, a1, a2);
bw_iir2_coeffs_hs2_lin(sample_rate, cutoff, Q, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(high_gain_dB), b0, b1, b2, a1, a2);
}
static inline void bw_iir2_coeffs_lp2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -612,6 +633,7 @@ static inline void bw_iir2_coeffs_ls2_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_lin,
float * BW_RESTRICT b0,
@ -635,6 +657,7 @@ static inline void bw_iir2_coeffs_ls2_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float dc_gain_dB,
float * BW_RESTRICT b0,
@ -642,13 +665,14 @@ static inline void bw_iir2_coeffs_ls2_dB(
float * BW_RESTRICT b2,
float * BW_RESTRICT a1,
float * BW_RESTRICT a2) {
bw_iir2_coeffs_ls2_lin(sample_rate, cutoff, Q, prewarp_freq, bw_dB2linf(dc_gain_dB), b0, b1, b2, a1, a2);
bw_iir2_coeffs_ls2_lin(sample_rate, cutoff, Q, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(dc_gain_dB), b0, b1, b2, a1, a2);
}
static inline void bw_iir2_coeffs_mm2(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float coeff_x,
float coeff_lp,
@ -673,6 +697,7 @@ static inline void bw_iir2_coeffs_notch(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float * BW_RESTRICT b0,
float * BW_RESTRICT b1,
@ -689,6 +714,7 @@ static inline void bw_iir2_coeffs_peak_lin(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_lin,
float * BW_RESTRICT b0,
@ -708,6 +734,7 @@ static inline void bw_iir2_coeffs_peak_dB(
float sample_rate,
float cutoff,
float Q,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_dB,
float * BW_RESTRICT b0,
@ -715,13 +742,14 @@ static inline void bw_iir2_coeffs_peak_dB(
float * BW_RESTRICT b2,
float * BW_RESTRICT a1,
float * BW_RESTRICT a2) {
bw_iir2_coeffs_peak_lin(sample_rate, cutoff, Q, prewarp_freq, bw_dB2linf(peak_gain_dB), b0, b1, b2, a1, a2);
bw_iir2_coeffs_peak_lin(sample_rate, cutoff, Q, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(peak_gain_dB), b0, b1, b2, a1, a2);
}
static inline void bw_iir2_coeffs_peak_lin_bw(
float sample_rate,
float cutoff,
float bandwidth,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_lin,
float * BW_RESTRICT b0,
@ -731,13 +759,14 @@ static inline void bw_iir2_coeffs_peak_lin_bw(
float * BW_RESTRICT a2) {
const float k6 = bw_pow2f(bandwidth);
const float Q = bw_sqrtf(k6 * peak_gain_lin) * bw_rcpf(k6 - 1.f);
bw_iir2_coeffs_peak_lin(sample_rate, cutoff, Q, prewarp_freq, peak_gain_lin, b0, b1, b2, a1, a2);
bw_iir2_coeffs_peak_lin(sample_rate, cutoff, Q, prewarp_at_cutoff, prewarp_freq, peak_gain_lin, b0, b1, b2, a1, a2);
}
static inline void bw_iir2_coeffs_peak_dB_bw(
float sample_rate,
float cutoff,
float bandwidth,
char prewarp_at_cutoff,
float prewarp_freq,
float peak_gain_dB,
float * BW_RESTRICT b0,
@ -745,7 +774,7 @@ static inline void bw_iir2_coeffs_peak_dB_bw(
float * BW_RESTRICT b2,
float * BW_RESTRICT a1,
float * BW_RESTRICT a2) {
bw_iir2_coeffs_peak_lin_bw(sample_rate, cutoff, bandwidth, prewarp_freq, bw_dB2linf(peak_gain_dB), b0, b1, b2, a1, a2);
bw_iir2_coeffs_peak_lin_bw(sample_rate, cutoff, bandwidth, prewarp_at_cutoff, prewarp_freq, bw_dB2linf(peak_gain_dB), b0, b1, b2, a1, a2);
}
#undef BW_IIR2_COEFFS_COMMON