node FIR_proto(x : real; h : real) returns (delay: real; val: real); let delay = 0.0 -> pre x; val = x * h; tel node FIR<>(x : real; h : real^n) returns (y : real); var tmp : real^n; var d : real; let (d, tmp) = fillred<>(x, h); y = red<<+, n>>(0.0, tmp); tel node delay_chain(x : real) returns (delay : real; val: real); let delay = 0.0 -> pre x; val = x; tel node delayed_array<< const n : int>>(x : real) returns (y : real^n); var d : real; let (d, y) = fill<>(x); tel function power_acc(p : real; s : real) returns (pp : real); let pp = p + s*s; tel function scalar_mult(c : real; x : real) returns (prop: real; y : real) let y = x * c; prop = c; tel node NLMS_FIR<< const n : int>>(ref : real; x : real; mu : real) returns (e : real; h : real^n); var delayed : real^n; --var h : real^n; var stepsize : real; var currstep : real^n; var y : real; let h = (0. ^ n) -> map<<+, n>>(pre h, pre currstep); y = FIR<>(ref, h); e = x - y; delayed = delayed_array<>(ref); (stepsize, currstep) = fillred<>(mu * e / red<>(1e-9, delayed), delayed); tel node VD_wrapper<< const n : int >>(ref : real; x : real; mu : real; e : real; force : bool) returns (y : real; h : real^n; count : int); let count = 0 -> if (pre count) > 0 then (pre count) - 1 else ( if( red<>(0.0, delayed_array<<10>>(pre y)) >= 16.0 * e * 10.0) then 3600 else 0); y, h = NLMS_FIR<>(ref,x, if (count > 0) and not force then 0.0 else mu); tel node EchoCancel = VD_wrapper<<256>>; node pll<< const f0 : real >>(s : real) returns (phi : real; freq : real) let freq = f0 -> 0.999 * (pre freq) + (1 - 0.999) * (s * sin(pre phi)); tel