fix bw_src_int upsampling

This commit is contained in:
Stefano D'Angelo 2023-03-15 17:45:38 +01:00
parent d8ac7cadcc
commit fd4db8fd4f
2 changed files with 17 additions and 24 deletions

1
TODO
View File

@ -33,6 +33,7 @@ code:
* web examples: need to export memset?
* bw_satur gain compensation to divide by actual gain (derivative) rather than gain parameter?
* cite papers, thank authors
* process1 and multi-channel
build system:
* make makefiles handle paths with spaces etc

View File

@ -110,10 +110,6 @@ struct _bw_src_int_state {
float z2;
float z3;
float z4;
float xz1;
float xz2;
float xz3;
float xz4;
};
static inline void bw_src_int_init(bw_src_int_coeffs *BW_RESTRICT coeffs, int ratio) {
@ -140,15 +136,11 @@ static inline void bw_src_int_reset_state(const bw_src_int_coeffs *BW_RESTRICT c
state->z4 = state->z3;
state->i = 1;
} else {
// DF-I
state->z1 = x0;
state->z2 = x0;
state->z3 = x0;
state->z4 = x0;
state->xz1 = x0;
state->xz2 = x0;
state->xz3 = x0;
state->xz4 = x0;
// TDF-II
state->z4 = (coeffs->b4 - coeffs->a4) * x0;
state->z3 = (coeffs->b3 - coeffs->a3) * x0 + state->z4;
state->z2 = (coeffs->b2 - coeffs->a2) * x0 + state->z3;
state->z1 = (coeffs->b1 - coeffs->a1) * x0 + state->z2;
}
}
@ -171,18 +163,18 @@ static inline int bw_src_int_process(const bw_src_int_coeffs *BW_RESTRICT coeffs
}
} else {
for (int i = 0; i < n_in_samples; i++) {
// DF-I
const float v = coeffs->b0 * x[i] + coeffs->b1 * state->xz1 + coeffs->b2 * state->xz2 + coeffs->b3 * state->xz3 + coeffs->b4 * state->xz4;
state->xz4 = state->xz3;
state->xz3 = state->xz2;
state->xz2 = state->xz1;
state->xz1 = x[i];
// TDF-II
const float v0 = coeffs->b0 * x[i];
const float v1 = coeffs->b1 * x[i];
const float v2 = coeffs->b2 * x[i];
const float v3 = coeffs->b3 * x[i];
const float v4 = coeffs->b4 * x[i];
for (int j = 0; j < coeffs->ratio; j++) {
y[n] = v - coeffs->a1 * state->z1 - coeffs->a2 * state->z2 - coeffs->a3 * state->z3 - coeffs->a4 * state->z4;
state->z4 = state->z3;
state->z3 = state->z2;
state->z2 = state->z1;
state->z1 = y[n];
y[n] = v0 + state->z1;
state->z1 = v1 - coeffs->a1 * y[n] + state->z2;
state->z2 = v2 - coeffs->a2 * y[n] + state->z3;
state->z3 = v3 - coeffs->a3 * y[n] + state->z4;
state->z4 = v4 - coeffs->a4 * y[n];
n++;
}
}