/** * This actor implements an FIR filter. * * @author JWJ */ actor FIR (Integer length = 64, Integer interpolation = 1, List[Double] taps) Double Input ==> Double Output : invariant #taps > 0 end Integer length = #taps; Integer phaseLength = length / interpolation; List[List[Double]] phasedTaps = [ [taps[(phaseLength - i) * interpolation + phase] : for Integer i in Integers(1, phaseLength)] : for Integer phase in Integers(0, interpolation - 1) ]; List[Double] data := [0 : for Integer i in Integers(1, phaseLength)]; action [a] ==> [out] repeat #out var List[Double] out := [collect(0, Add, combine(Multiply, phasedTaps[phase], data)) : for Integer phase in Integers(0, interpolation - 1)] do data := [data[i] : for Integer i in Integers(1, phaseLength-1)] + [a]; end end