module DSP.Filter.IIR.Bilinear where
import Polynomial.Basic
zm :: (Integral b, Fractional a) => a -> b -> [a]
zm :: forall b a. (Integral b, Fractional a) => a -> b -> [a]
zm a
ts b
n = forall a b. (Num a, Integral b) => [a] -> b -> [a]
polypow [ -a
2forall a. Fractional a => a -> a -> a
/a
ts, a
2forall a. Fractional a => a -> a -> a
/a
ts ] b
n
zp :: (Integral b, Num a) => b -> [a]
zp :: forall b a. (Integral b, Num a) => b -> [a]
zp b
n = forall a b. (Num a, Integral b) => [a] -> b -> [a]
polypow [ a
1, a
1 ] b
n
step1 :: Fractional a => a -> [a] -> [[a]]
step1 :: forall a. Fractional a => a -> [a] -> [[a]]
step1 a
ts = forall {t}. Integral t => t -> [a] -> [[a]]
step1' (Int
0::Int)
where step1' :: t -> [a] -> [[a]]
step1' t
_ [] = []
step1' t
n (a
x:[a]
xs) = forall a. Num a => a -> [a] -> [a]
polyscale a
x (forall b a. (Integral b, Fractional a) => a -> b -> [a]
zm a
ts t
n) forall a. a -> [a] -> [a]
: t -> [a] -> [[a]]
step1' (t
nforall a. Num a => a -> a -> a
+t
1) [a]
xs
step2 :: (Num a, Integral b) => b -> [[a]] -> [[a]]
step2 :: forall a b. (Num a, Integral b) => b -> [[a]] -> [[a]]
step2 b
_ [] = []
step2 b
n ([a]
x:[[a]]
xs) = forall a. Num a => [a] -> [a] -> [a]
polymult (forall b a. (Integral b, Num a) => b -> [a]
zp b
n) [a]
x forall a. a -> [a] -> [a]
: forall a b. (Num a, Integral b) => b -> [[a]] -> [[a]]
step2 (b
nforall a. Num a => a -> a -> a
-b
1) [[a]]
xs
step3 :: Num a => [[a]] -> [a]
step3 :: forall a. Num a => [[a]] -> [a]
step3 [[a]]
x = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Num a => [a] -> [a] -> [a]
polyadd [a
0] [[a]]
x
step4 :: Fractional a => a -> [a] -> [a]
step4 :: forall a. Fractional a => a -> [a] -> [a]
step4 a
a0 [a]
x = forall a b. (a -> b) -> [a] -> [b]
map (forall a. Fractional a => a -> a -> a
/a
a0) [a]
x
bilinear :: Double
-> ([Double],[Double])
-> ([Double],[Double])
bilinear :: Double -> ([Double], [Double]) -> ([Double], [Double])
bilinear Double
ts ([Double]
num,[Double]
den) = ([Double]
num'', [Double]
den'')
where n :: Int
n = forall a. Ord a => a -> a -> a
max (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
num forall a. Num a => a -> a -> a
- Int
1) (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
den forall a. Num a => a -> a -> a
- Int
1)
num' :: [Double]
num' = forall a. Num a => [[a]] -> [a]
step3 forall a b. (a -> b) -> a -> b
$ forall a b. (Num a, Integral b) => b -> [[a]] -> [[a]]
step2 Int
n forall a b. (a -> b) -> a -> b
$ forall a. Fractional a => a -> [a] -> [[a]]
step1 Double
ts forall a b. (a -> b) -> a -> b
$ [Double]
num
den' :: [Double]
den' = forall a. Num a => [[a]] -> [a]
step3 forall a b. (a -> b) -> a -> b
$ forall a b. (Num a, Integral b) => b -> [[a]] -> [[a]]
step2 Int
n forall a b. (a -> b) -> a -> b
$ forall a. Fractional a => a -> [a] -> [[a]]
step1 Double
ts forall a b. (a -> b) -> a -> b
$ [Double]
den
a0 :: Double
a0 = forall a. [a] -> a
last [Double]
den'
num'' :: [Double]
num'' = forall a. Fractional a => a -> [a] -> [a]
step4 Double
a0 [Double]
num'
den'' :: [Double]
den'' = forall a. Fractional a => a -> [a] -> [a]
step4 Double
a0 [Double]
den'
prewarp :: Double
-> Double
-> Double
prewarp :: Double -> Double -> Double
prewarp Double
wc Double
ts = Double
2forall a. Fractional a => a -> a -> a
/Double
ts forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
tan (Double
wc forall a. Fractional a => a -> a -> a
/ Double
2)