static void lsx_kaiser_params(double att, double Fc, double tr_bw, double * beta, int * num_taps) { *beta = *beta < 0? lsx_kaiser_beta(att, tr_bw * .5 / Fc): *beta; att = att < 60? (att - 7.95) / (2.285 * M_PI * 2) : ((.0007528358-1.577737e-05**beta)**beta+.6248022)**beta+.06186902; *num_taps = !*num_taps? ceil(att/tr_bw + 1) : *num_taps; }
static double * lpf(double Fn, double Fc, double tbw, int * num_taps, double att, double * beta, sox_bool round) { if ((Fc /= Fn) <= 0 || Fc >= 1) { *num_taps = 0; return NULL; } att = att? att : 120; *beta = *beta < 0? lsx_kaiser_beta(att) : *beta; if (!*num_taps) { int n = lsx_lpf_num_taps(att, (tbw? tbw / Fn : .05) * .5, 0); *num_taps = range_limit(n, 11, 32767); if (round) *num_taps = 1 + 2 * (int)((int)((*num_taps / 2) * Fc + .5) / Fc + .5); lsx_report("num taps = %i (from %i)", *num_taps, n); } return lsx_make_lpf(*num_taps |= 1, Fc, *beta, 1., sox_false); }