module Synthesizer.Plain.Filter.LinearPredictive where
import qualified Algebra.Field as Field
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import Synthesizer.Plain.Analysis (scalarProduct)
import NumericPrelude.List (takeMatch, dropMatch, )
import qualified Data.List as List
import NumericPrelude
import PreludeBase
import Prelude ()
approxCoefficients :: Field.C a =>
a -> [a] -> [a] -> [(a,[a])]
approxCoefficients k mask0 xs =
let infixes = map (takeMatch mask0) (List.tails xs)
targets = dropMatch mask0 xs
in scanl
(\(_,mask) (infx,target) ->
let residue = target scalarProduct mask infx
norm2 = scalarProduct infx infx
in (residue,
mask + map ((k*residue/norm2)*) infx))
(zero,mask0) (zip infixes targets)