module Synthesizer.Plain.Filter.LinearPredictive where
import Synthesizer.Plain.Analysis (scalarProduct)
import qualified Data.List.Match as ListMatch
import qualified Data.List as List
import qualified Algebra.Field as Field
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)