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 qualified Data.List.Match as ListMatch
import qualified Data.List as List
import NumericPrelude.Numeric
import NumericPrelude.Base
import Prelude ()
approxCoefficients :: Field.C a =>
a -> [a] -> [a] -> [(a,[a])]
approxCoefficients k mask0 xs =
let infixes = map (ListMatch.take mask0) (List.tails xs)
targets = ListMatch.drop 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)