1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * SpanDSP - a series of DSP components for telephony 4 * 5 * biquad.h - General telephony bi-quad section routines (currently this just 6 * handles canonic/type 2 form) 7 * 8 * Written by Steve Underwood <steveu@coppice.org> 9 * 10 * Copyright (C) 2001 Steve Underwood 11 * 12 * All rights reserved. 13 */ 14 15 struct biquad2_state { 16 int32_t gain; 17 int32_t a1; 18 int32_t a2; 19 int32_t b1; 20 int32_t b2; 21 22 int32_t z1; 23 int32_t z2; 24 }; 25 26 static inline void biquad2_init(struct biquad2_state *bq, 27 int32_t gain, int32_t a1, int32_t a2, int32_t b1, int32_t b2) 28 { 29 bq->gain = gain; 30 bq->a1 = a1; 31 bq->a2 = a2; 32 bq->b1 = b1; 33 bq->b2 = b2; 34 35 bq->z1 = 0; 36 bq->z2 = 0; 37 } 38 39 static inline int16_t biquad2(struct biquad2_state *bq, int16_t sample) 40 { 41 int32_t y; 42 int32_t z0; 43 44 z0 = sample * bq->gain + bq->z1 * bq->a1 + bq->z2 * bq->a2; 45 y = z0 + bq->z1 * bq->b1 + bq->z2 * bq->b2; 46 47 bq->z2 = bq->z1; 48 bq->z1 = z0 >> 15; 49 y >>= 15; 50 return y; 51 } 52