From c13696aca1ccce8a33f5cf6d27598776054f08a0 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 30 Jun 2023 17:49:29 +0200 Subject: [PATCH] filter-chain: simplify biquads --- spa/plugins/audioconvert/crossover.c | 48 +++++++++------------ src/modules/module-filter-chain/dsp-ops-c.c | 16 +++---- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/spa/plugins/audioconvert/crossover.c b/spa/plugins/audioconvert/crossover.c index 7575833cd..177cf6106 100644 --- a/spa/plugins/audioconvert/crossover.c +++ b/spa/plugins/audioconvert/crossover.c @@ -22,17 +22,16 @@ void lr4_set(struct lr4 *lr4, enum biquad_type type, float freq) void lr4_process(struct lr4 *lr4, float *dst, const float *src, const float vol, int samples) { - float lx1 = lr4->x1; - float lx2 = lr4->x2; - float ly1 = lr4->y1; - float ly2 = lr4->y2; - float lz1 = lr4->z1; - float lz2 = lr4->z2; - float lb0 = lr4->bq.b0; - float lb1 = lr4->bq.b1; - float lb2 = lr4->bq.b2; - float la1 = lr4->bq.a1; - float la2 = lr4->bq.a2; + float x1 = lr4->x1; + float x2 = lr4->x2; + float y1 = lr4->y1; + float y2 = lr4->y2; + float b0 = lr4->bq.b0; + float b1 = lr4->bq.b1; + float b2 = lr4->bq.b2; + float a1 = lr4->bq.a1; + float a2 = lr4->bq.a2; + float x, y, z; int i; if (vol == 0.0f) { @@ -47,24 +46,19 @@ void lr4_process(struct lr4 *lr4, float *dst, const float *src, const float vol, } for (i = 0; i < samples; i++) { - float x, y, z; - x = src[i]; - y = lb0*x + lb1*lx1 + lb2*lx2 - la1*ly1 - la2*ly2; - z = lb0*y + lb1*ly1 + lb2*ly2 - la1*lz1 - la2*lz2; - lx2 = lx1; - lx1 = x; - ly2 = ly1; - ly1 = y; - lz2 = lz1; - lz1 = z; + x = src[i]; + y = b0 * x + x1; + x1 = b1 * x - a1 * y + x2; + x2 = b2 * x - a2 * y; + z = b0 * y + y1; + y1 = b1 * y - a1 * z + y2; + y2 = b2 * y - a2 * z; dst[i] = z * vol; } #define F(x) (-FLT_MIN < (x) && (x) < FLT_MIN ? 0.0f : (x)) - lr4->x1 = F(lx1); - lr4->x2 = F(lx2); - lr4->y1 = F(ly1); - lr4->y2 = F(ly2); - lr4->z1 = F(lz1); - lr4->z2 = F(lz2); + lr4->x1 = F(x1); + lr4->x2 = F(x2); + lr4->y1 = F(y1); + lr4->y2 = F(y2); #undef F } diff --git a/src/modules/module-filter-chain/dsp-ops-c.c b/src/modules/module-filter-chain/dsp-ops-c.c index fb5d1cdd5..68b3080e8 100644 --- a/src/modules/module-filter-chain/dsp-ops-c.c +++ b/src/modules/module-filter-chain/dsp-ops-c.c @@ -84,33 +84,27 @@ void dsp_mix_gain_c(struct dsp_ops *ops, void dsp_biquad_run_c(struct dsp_ops *ops, struct biquad *bq, float *out, const float *in, uint32_t n_samples) { - float x1, x2, y1, y2; + float x, y, x1, x2; float b0, b1, b2, a1, a2; uint32_t i; x1 = bq->x1; x2 = bq->x2; - y1 = bq->y1; - y2 = bq->y2; b0 = bq->b0; b1 = bq->b1; b2 = bq->b2; a1 = bq->a1; a2 = bq->a2; for (i = 0; i < n_samples; i++) { - float x = in[i]; - float y = b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2; + x = in[i]; + y = b0 * x + x1; + x1 = b1 * x - a1 * y + x2; + x2 = b2 * x - a2 * y; out[i] = y; - x2 = x1; - x1 = x; - y2 = y1; - y1 = y; } #define F(x) (-FLT_MIN < (x) && (x) < FLT_MIN ? 0.0f : (x)) bq->x1 = F(x1); bq->x2 = F(x2); - bq->y1 = F(y1); - bq->y2 = F(y2); #undef F }