The implementation of the signed binary average algorithm is also extremely simple once we have the algorithm description. In section 4.3.1, we describe the algorithm as follows:
The sign function is defined as follows:
This is implemented in Haskell as follows.
-- sbAv : Signed binary stream average operation
sbAv :: SBinStream -> SBinStream -> SBinStream
sbAv x y = sbAv' x y 0
-- sbAv' : Auxiliary function for sbAv
sbAv' :: SBinStream -> SBinStream -> Int -> SBinStream
sbAv' (a0:x) (b0:y) c = if (d' `mod` 2 == 0) then
((signum d'):(sbAv' x y 0))
else sbAv'' x y d'
where d' = (a0 + b0 + 2*c)
-- sbAv'' : Auxiliary function for sbAv
sbAv'' :: SBinStream -> SBinStream -> Int -> SBinStream
sbAv'' (a1:x') (b1:y') d' = (e : sbAv' (a1:x') (b1:y') c')
where {d = (2*d' + a1 + b1);
e = if (d > 2) then 1 else
if (d < -2) then -1 else 0;
c' = d' - (2*e)}