-----------------------------------------------------------------------------
-- |
-- Module      :  DSP.Filter.IIR.Matchedz
-- Copyright   :  (c) Matthew Donadio 2003
-- License     :  GPL
--
-- Maintainer  :  m.p.donadio@ieee.org
-- Stability   :  experimental
-- Portability :  portable
--
-- Matched-z transform
--
-- References: Proakis and Manolakis, Rabiner and Gold
--
-----------------------------------------------------------------------------


module DSP.Filter.IIR.Matchedz (matchedz) where

import Polynomial.Basic
import Polynomial.Roots

import Data.Complex

-- | Performs the matched-z transform

matchedz :: Double -- ^ T_s
	 -> ([Double],[Double]) -- ^ (b,a)
	 -> ([Double],[Double]) -- ^ (b',a')

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'