module ForSyDe.Shallow.Utility.FIR (firSY) where
import ForSyDe.Shallow.MoC.Synchronous
import ForSyDe.Shallow.Core
firSY :: Fractional a => Vector a -> Signal a -> Signal a
firSY :: Vector a -> Signal a -> Signal a
firSY Vector a
h = Vector a -> Vector (Signal a) -> Signal a
forall a. Num a => Vector a -> Vector (Signal a) -> Signal a
innerProdSY Vector a
h (Vector (Signal a) -> Signal a)
-> (Signal a -> Vector (Signal a)) -> Signal a -> Signal a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a -> Signal a -> Vector (Signal a)
forall b. Int -> b -> Signal b -> Vector (Signal b)
sipoSY Int
k a
0.0
where k :: Int
k = Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
h
sipoSY :: Int -> b -> Signal b -> Vector (Signal b)
sipoSY :: Int -> b -> Signal b -> Vector (Signal b)
sipoSY Int
n b
s0 = Signal (Vector b) -> Vector (Signal b)
forall a. Signal (Vector a) -> Vector (Signal a)
unzipxSY (Signal (Vector b) -> Vector (Signal b))
-> (Signal b -> Signal (Vector b)) -> Signal b -> Vector (Signal b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Vector b -> b -> Vector b)
-> Vector b -> Signal b -> Signal (Vector b)
forall a b. (a -> b -> a) -> a -> Signal b -> Signal a
scanldSY Vector b -> b -> Vector b
forall a. Vector a -> a -> Vector a
shiftrV Vector b
initState
where initState :: Vector b
initState = Int -> b -> Vector b
forall a b. (Num a, Eq a) => a -> b -> Vector b
copyV Int
n b
s0
innerProdSY :: (Num a) => Vector a -> Vector (Signal a) -> Signal a
innerProdSY :: Vector a -> Vector (Signal a) -> Signal a
innerProdSY Vector a
coeffs = (Vector a -> a) -> Vector (Signal a) -> Signal a
forall a b. (Vector a -> b) -> Vector (Signal a) -> Signal b
zipWithxSY (Vector a -> Vector a -> a
forall p. Num p => Vector p -> Vector p -> p
ipV Vector a
coeffs)
where ipV :: Vector p -> Vector p -> p
ipV Vector p
NullV Vector p
NullV = p
0
ipV (p
h:>Vector p
hv) (p
x:>Vector p
xv) = p
hp -> p -> p
forall a. Num a => a -> a -> a
*p
x p -> p -> p
forall a. Num a => a -> a -> a
+ Vector p -> Vector p -> p
ipV Vector p
hv Vector p
xv
ipV Vector p
_ Vector p
_ = [Char] -> p
forall a. HasCallStack => [Char] -> a
error [Char]
"Vector of different length"