18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * SpanDSP - a series of DSP components for telephony
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * biquad.h - General telephony bi-quad section routines (currently this just
68c2ecf20Sopenharmony_ci *            handles canonic/type 2 form)
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Written by Steve Underwood <steveu@coppice.org>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * Copyright (C) 2001 Steve Underwood
118c2ecf20Sopenharmony_ci *
128c2ecf20Sopenharmony_ci * All rights reserved.
138c2ecf20Sopenharmony_ci */
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct biquad2_state {
168c2ecf20Sopenharmony_ci	int32_t gain;
178c2ecf20Sopenharmony_ci	int32_t a1;
188c2ecf20Sopenharmony_ci	int32_t a2;
198c2ecf20Sopenharmony_ci	int32_t b1;
208c2ecf20Sopenharmony_ci	int32_t b2;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	int32_t z1;
238c2ecf20Sopenharmony_ci	int32_t z2;
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic inline void biquad2_init(struct biquad2_state *bq,
278c2ecf20Sopenharmony_ci				int32_t gain, int32_t a1, int32_t a2, int32_t b1, int32_t b2)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	bq->gain = gain;
308c2ecf20Sopenharmony_ci	bq->a1 = a1;
318c2ecf20Sopenharmony_ci	bq->a2 = a2;
328c2ecf20Sopenharmony_ci	bq->b1 = b1;
338c2ecf20Sopenharmony_ci	bq->b2 = b2;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	bq->z1 = 0;
368c2ecf20Sopenharmony_ci	bq->z2 = 0;
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic inline int16_t biquad2(struct biquad2_state *bq, int16_t sample)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	int32_t y;
428c2ecf20Sopenharmony_ci	int32_t z0;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	z0 = sample * bq->gain + bq->z1 * bq->a1 + bq->z2 * bq->a2;
458c2ecf20Sopenharmony_ci	y = z0 + bq->z1 * bq->b1 + bq->z2 * bq->b2;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	bq->z2 = bq->z1;
488c2ecf20Sopenharmony_ci	bq->z1 = z0 >> 15;
498c2ecf20Sopenharmony_ci	y >>= 15;
508c2ecf20Sopenharmony_ci	return  y;
518c2ecf20Sopenharmony_ci}
52