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