{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.State.Filter.Recursive.MovingAverage (
sumsStaticInt,
modulatedFrac,
) where
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.State.Filter.Recursive.Integration as Integration
import qualified Synthesizer.State.Filter.Delay as Delay
import qualified Algebra.Module as Module
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE sumsStaticInt #-}
sumsStaticInt :: (Additive.C v) => Int -> Sig.T v -> Sig.T v
sumsStaticInt :: forall v. C v => Int -> T v -> T v
sumsStaticInt Int
n T v
xs =
forall v. C v => T v -> T v
Integration.run (T v
xs forall a. C a => a -> a -> a
- forall v. C v => Int -> T v -> T v
Delay.staticPos Int
n T v
xs)
{-# INLINE sumFromToFrac #-}
sumFromToFrac :: (RealField.C a, Module.C a v) => a -> a -> Sig.T v -> v
sumFromToFrac :: forall a v. (C a, C a v) => a -> a -> T v -> v
sumFromToFrac a
from a
to T v
xs =
let (Int
fromInt, a
fromFrac) = forall a b. (C a, C b) => a -> (b, a)
splitFraction a
from
(Int
toInt, a
toFrac) = forall a b. (C a, C b) => a -> (b, a)
splitFraction a
to
in case forall a. Ord a => a -> a -> Ordering
compare Int
fromInt Int
toInt of
Ordering
EQ -> (a
toforall a. C a => a -> a -> a
-a
from) forall a v. C a v => a -> v -> v
*> forall a. Int -> T a -> a
Sig.index Int
fromInt T v
xs
Ordering
LT ->
forall a. C a => T a -> a
Sig.sum forall a b. (a -> b) -> a -> b
$
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith forall a. a -> a
id
(((a
1forall a. C a => a -> a -> a
-a
fromFrac) forall a v. C a v => a -> v -> v
*>) forall a. a -> T a -> T a
`Sig.cons`
forall a. Int -> a -> T a
Sig.replicate (Int
toIntforall a. C a => a -> a -> a
-Int
fromIntforall a. C a => a -> a -> a
-Int
1) forall a. a -> a
id forall a. T a -> T a -> T a
`Sig.append`
forall a. a -> T a
Sig.singleton (a
toFrac forall a v. C a v => a -> v -> v
*>)) forall a b. (a -> b) -> a -> b
$
forall a. Int -> T a -> T a
Sig.drop Int
fromInt T v
xs
Ordering
GT ->
forall a. C a => a -> a
negate forall a b. (a -> b) -> a -> b
$ forall a. C a => T a -> a
Sig.sum forall a b. (a -> b) -> a -> b
$
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith forall a. a -> a
id
(((a
1forall a. C a => a -> a -> a
-a
toFrac) forall a v. C a v => a -> v -> v
*>) forall a. a -> T a -> T a
`Sig.cons`
forall a. Int -> a -> T a
Sig.replicate (Int
fromIntforall a. C a => a -> a -> a
-Int
toIntforall a. C a => a -> a -> a
-Int
1) forall a. a -> a
id forall a. T a -> T a -> T a
`Sig.append`
forall a. a -> T a
Sig.singleton (a
fromFrac forall a v. C a v => a -> v -> v
*>)) forall a b. (a -> b) -> a -> b
$
forall a. Int -> T a -> T a
Sig.drop Int
toInt T v
xs
{-# INLINE sumDiffsModulated #-}
sumDiffsModulated :: (RealField.C a, Module.C a v) =>
a -> Sig.T a -> Sig.T v -> Sig.T v
sumDiffsModulated :: forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d T a
ds =
forall y. T y -> T y
Sig.init forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall y0 y1 y2. (y0 -> T y1 -> y2) -> T y0 -> T y1 -> T y2
Sig.zipWithTails (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a v. (C a, C a v) => a -> a -> T v -> v
sumFromToFrac)
(forall a b. T a -> T b -> T (a, b)
Sig.zip (forall a. a -> T a -> T a
Sig.cons (a
dforall a. C a => a -> a -> a
+a
1) T a
ds) (forall a b. (a -> b) -> T a -> T b
Sig.map (a
1forall a. C a => a -> a -> a
+) T a
ds)) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. a -> T a -> T a
Sig.cons forall a. C a => a
zero
{-# INLINE sumsModulatedHalf #-}
sumsModulatedHalf :: (RealField.C a, Module.C a v) =>
Int -> Sig.T a -> Sig.T v -> Sig.T v
sumsModulatedHalf :: forall a v. (C a, C a v) => Int -> T a -> T v -> T v
sumsModulatedHalf Int
maxDInt T a
ds T v
xs =
let maxD :: a
maxD = forall a b. (C a, C b) => a -> b
fromIntegral Int
maxDInt
d0 :: a
d0 = a
maxDforall a. C a => a -> a -> a
+a
0.5
delXs :: T v
delXs = forall v. C v => Int -> T v -> T v
Delay.staticPos Int
maxDInt T v
xs
posXs :: T v
posXs = forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d0 (forall a b. (a -> b) -> T a -> T b
Sig.map (a
d0forall a. C a => a -> a -> a
+) T a
ds) T v
delXs
negXs :: T v
negXs = forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d0 (forall a b. (a -> b) -> T a -> T b
Sig.map (a
d0forall a. C a => a -> a -> a
-) T a
ds) T v
delXs
in forall v. C v => T v -> T v
Integration.run (T v
posXs forall a. C a => a -> a -> a
- T v
negXs)
{-# INLINE modulatedFrac #-}
modulatedFrac :: (RealField.C a, Module.C a v) =>
Int -> Sig.T a -> Sig.T v -> Sig.T v
modulatedFrac :: forall a v. (C a, C a v) => Int -> T a -> T v -> T v
modulatedFrac Int
maxDInt T a
ds T v
xs =
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith (\a
d v
y -> forall a. C a => a -> a
recip (a
2forall a. C a => a -> a -> a
*a
d) forall a v. C a v => a -> v -> v
*> v
y) T a
ds forall a b. (a -> b) -> a -> b
$
forall a v. (C a, C a v) => Int -> T a -> T v -> T v
sumsModulatedHalf Int
maxDInt T a
ds T v
xs