module DSP.Multirate.CIC (cic_interpolate, cic_decimate) where
import DSP.Basic (delay1, delay, upsample, downsample)
apply :: (a -> a) -> Int -> (a -> a)
apply :: forall a. (a -> a) -> Int -> a -> a
apply a -> a
f Int
1 = a -> a
f
apply a -> a
f Int
n = a -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a) -> Int -> a -> a
apply a -> a
f (Int
n forall a. Num a => a -> a -> a
- Int
1)
integrate :: (Num a) => [a] -> [a]
integrate :: forall a. Num a => [a] -> [a]
integrate [a]
a = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(+) [a]
a (forall a. Num a => [a] -> [a]
delay1 (forall a. Num a => [a] -> [a]
integrate [a]
a))
comb :: (Num a) => Int -> [a] -> [a]
comb :: forall a. Num a => Int -> [a] -> [a]
comb Int
m [a]
a = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (-) [a]
a (forall a. Num a => Int -> [a] -> [a]
delay Int
m [a]
a)
cic_interpolate :: (Num a) => Int
-> Int
-> Int
-> [a]
-> [a]
cic_interpolate :: forall a. Num a => Int -> Int -> Int -> [a] -> [a]
cic_interpolate Int
r Int
m Int
n = [a] -> [a]
integrate_chain forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => Int -> [a] -> [a]
upsample Int
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
comb_chain
where integrate_chain :: [a] -> [a]
integrate_chain = forall a. (a -> a) -> Int -> a -> a
apply forall a. Num a => [a] -> [a]
integrate Int
n
comb_chain :: [a] -> [a]
comb_chain = forall a. (a -> a) -> Int -> a -> a
apply (forall a. Num a => Int -> [a] -> [a]
comb Int
m) Int
n
cic_decimate :: (Num a) => Int
-> Int
-> Int
-> [a]
-> [a]
cic_decimate :: forall a. Num a => Int -> Int -> Int -> [a] -> [a]
cic_decimate Int
r Int
m Int
n = [a] -> [a]
comb_chain forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Int -> [a] -> [a]
downsample Int
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
integrate_chain
where integrate_chain :: [a] -> [a]
integrate_chain = forall a. (a -> a) -> Int -> a -> a
apply forall a. Num a => [a] -> [a]
integrate Int
n
comb_chain :: [a] -> [a]
comb_chain = forall a. (a -> a) -> Int -> a -> a
apply (forall a. Num a => Int -> [a] -> [a]
comb Int
m) Int
n