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
import PreludeBase
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)