bw_src(_int), start from index 0 when downsampling

This commit is contained in:
Stefano D'Angelo 2023-03-23 15:58:32 +01:00
parent fb4d041838
commit 3a44034694
2 changed files with 4 additions and 5 deletions

View File

@ -129,15 +129,14 @@ static inline void bw_src_reset_state(const bw_src_coeffs *BW_RESTRICT coeffs, b
state->z2 = state->z1; state->z2 = state->z1;
state->z3 = state->z2; state->z3 = state->z2;
state->z4 = state->z3; state->z4 = state->z3;
state->i = 1.f;
} else { } else {
// TDF-II // TDF-II
state->z4 = (coeffs->b4 - coeffs->a4) * x0; state->z4 = (coeffs->b4 - coeffs->a4) * x0;
state->z3 = (coeffs->b3 - coeffs->a3) * x0 + state->z4; state->z3 = (coeffs->b3 - coeffs->a3) * x0 + state->z4;
state->z2 = (coeffs->b2 - coeffs->a2) * x0 + state->z3; state->z2 = (coeffs->b2 - coeffs->a2) * x0 + state->z3;
state->z1 = (coeffs->b1 - coeffs->a1) * x0 + state->z2; state->z1 = (coeffs->b1 - coeffs->a1) * x0 + state->z2;
state->i = 0.f;
} }
state->i = 0.f;
state->xz1 = x0; state->xz1 = x0;
state->xz2 = x0; state->xz2 = x0;
state->xz3 = x0; state->xz3 = x0;
@ -151,7 +150,6 @@ static inline void bw_src_process(const bw_src_coeffs *BW_RESTRICT coeffs, bw_sr
// DF-II // DF-II
const float z0 = x[i] - coeffs->a1 * state->z1 - coeffs->a2 * state->z2 - coeffs->a3 * state->z3 - coeffs->a4 * state->z4; const float z0 = x[i] - coeffs->a1 * state->z1 - coeffs->a2 * state->z2 - coeffs->a3 * state->z3 - coeffs->a4 * state->z4;
const float o = coeffs->b0 * z0 + coeffs->b1 * state->z1 + coeffs->b2 * state->z2 + coeffs->b3 * state->z3 + coeffs->b4 * state->z4; const float o = coeffs->b0 * z0 + coeffs->b1 * state->z1 + coeffs->b2 * state->z2 + coeffs->b3 * state->z3 + coeffs->b4 * state->z4;
state->i -= 1.f;
if (state->i <= 0.f) { if (state->i <= 0.f) {
// 3rd degree Lagrange interpolation + Horner's rule // 3rd degree Lagrange interpolation + Horner's rule
const float k1 = state->xz2 - state->xz1; const float k1 = state->xz2 - state->xz1;
@ -165,6 +163,7 @@ static inline void bw_src_process(const bw_src_coeffs *BW_RESTRICT coeffs, bw_sr
state->i -= coeffs->k; state->i -= coeffs->k;
j++; j++;
} }
state->i -= 1.f;
state->z4 = state->z3; state->z4 = state->z3;
state->z3 = state->z2; state->z3 = state->z2;
state->z2 = state->z1; state->z2 = state->z1;

View File

@ -132,7 +132,7 @@ static inline void bw_src_int_reset_state(const bw_src_int_coeffs *BW_RESTRICT c
state->z2 = state->z1; state->z2 = state->z1;
state->z3 = state->z2; state->z3 = state->z2;
state->z4 = state->z3; state->z4 = state->z3;
state->i = 1; state->i = 0;
} else { } else {
// TDF-II // TDF-II
state->z4 = (coeffs->b4 - coeffs->a4) * x0; state->z4 = (coeffs->b4 - coeffs->a4) * x0;
@ -148,12 +148,12 @@ static inline int bw_src_int_process(const bw_src_int_coeffs *BW_RESTRICT coeffs
for (int i = 0; i < n_in_samples; i++) { for (int i = 0; i < n_in_samples; i++) {
// DF-II // DF-II
const float z0 = x[i] - coeffs->a1 * state->z1 - coeffs->a2 * state->z2 - coeffs->a3 * state->z3 - coeffs->a4 * state->z4; const float z0 = x[i] - coeffs->a1 * state->z1 - coeffs->a2 * state->z2 - coeffs->a3 * state->z3 - coeffs->a4 * state->z4;
state->i--;
if (!state->i) { if (!state->i) {
state->i = -coeffs->ratio; state->i = -coeffs->ratio;
y[n] = coeffs->b0 * z0 + coeffs->b1 * state->z1 + coeffs->b2 * state->z2 + coeffs->b3 * state->z3 + coeffs->b4 * state->z4; y[n] = coeffs->b0 * z0 + coeffs->b1 * state->z1 + coeffs->b2 * state->z2 + coeffs->b3 * state->z3 + coeffs->b4 * state->z4;
n++; n++;
} }
state->i--;
state->z4 = state->z3; state->z4 = state->z3;
state->z3 = state->z2; state->z3 = state->z2;
state->z2 = state->z1; state->z2 = state->z1;