(* FIR with the array of coefficient [b] *)
(* sums are computed from left to right *)
let node fir(m)(b)(u) = y where
  rec t = Tapped_delays.window(m)(0.0, u)
  and y = Arrays.vvproduct(m)(b, t)

let node iir_direct1(n)(m)(b)(a)(u) = y where
  rec output1 = fir(m)(b)(u)
  and y = output1 -. output2
  and output2 = fir(n-1)(a)(0.0 fby y)