module DSP.Filter.IIR.Matchedz (matchedz) where
import Polynomial.Basic
import Polynomial.Roots
import Data.Complex
matchedz :: Double
-> ([Double],[Double])
-> ([Double],[Double])
matchedz :: Double -> ([Double], [Double]) -> ([Double], [Double])
matchedz Double
ts ([Double]
num,[Double]
den) = ([Double]
num',[Double]
den')
where zeros :: [Complex Double]
zeros = forall a. RealFloat a => a -> Int -> [Complex a] -> [Complex a]
roots Double
1.0e-12 Int
1000 forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> a -> Complex a
:+ Double
0) forall a b. (a -> b) -> a -> b
$ [Double]
num
poles :: [Complex Double]
poles = forall a. RealFloat a => a -> Int -> [Complex a] -> [Complex a]
roots Double
1.0e-12 Int
1000 forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> a -> Complex a
:+ Double
0) forall a b. (a -> b) -> a -> b
$ [Double]
den
zeros' :: [Complex Double]
zeros' = forall a b. (a -> b) -> [a] -> [b]
map forall a. Floating a => a -> a
exp forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. Num a => a -> a -> a
* (Double
ts forall a. a -> a -> Complex a
:+ Double
0)) forall a b. (a -> b) -> a -> b
$ [Complex Double]
zeros
poles' :: [Complex Double]
poles' = forall a b. (a -> b) -> [a] -> [b]
map forall a. Floating a => a -> a
exp forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. Num a => a -> a -> a
* (Double
ts forall a. a -> a -> Complex a
:+ Double
0)) forall a b. (a -> b) -> a -> b
$ [Complex Double]
poles
num' :: [Double]
num' = forall a b. (a -> b) -> [a] -> [b]
map forall a. Complex a -> a
realPart forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a]
roots2poly [Complex Double]
zeros'
den' :: [Double]
den' = forall a b. (a -> b) -> [a] -> [b]
map forall a. Complex a -> a
realPart forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a]
roots2poly [Complex Double]
poles'