2 * Kaiser Window digital filter
4 * Copyright © 2001, Keith Packard
5 * All Rights Reserved. See the file COPYING in this directory
6 * for licensing information.
19 ds = ds * x**2 / d**2;
21 # printf ("ds %g s %g dist %g\n", ds, s,
24 while (ds - 0.2e-8 * s > 0);
28 real highpass (real n, real m, real wc)
35 return (pi/2 - wc) / pi;
36 return -sin(dist * (pi/2-wc)) / (pi * dist);
39 real lowpass (real n, real m, real wc)
46 return sin (wc * dist) / (pi * dist);
49 real kaiser (real n, real m, real beta)
52 return i0 (beta * sqrt (1 - ((n - alpha) / alpha)**2)) / i0(beta);
55 void write_high (string filename,
64 f = File::open (filename, "w");
65 for (n = 0; n <= m; n += step)
66 File::fprintf (f, "%g,\n", highpass (n, m, wc) * kaiser (n, m, beta));
70 void write_low (string filename,
79 f = File::open (filename, "w");
80 for (n = 0; n <= m; n += step)
81 File::fprintf (f, "%g,\n", lowpass (n, m, wc) * kaiser (n, m, beta));
88 return 0.1102 * (A - 8.7);
90 return 0.5842 * (A - 21) ** 0.4 + 0.07886 * (A - 21);
95 int M (real A, real Δω)
98 return ceil ((A - 7.95) / (2.285 * Δω));
100 return ceil(5.79 / Δω);
111 filter_param_t filter (real ωpass, real ωstop, real error)
115 p.Δω = ωstop - ωpass;
116 p.A = -20 * log10 (error);
124 real[] low_pass_filter(real ωpass, real ωstop, real error)
126 filter_param_t p = filter(ωpass, ωstop, error);
128 return (real[p.M + 1]) {
129 [n] = lowpass(n, p.M, ωpass) * kaiser(n, p.M, p.β)