module DSP.Filter.IIR.Transform (d_lp2lp, d_lp2hp, d_lp2bp, d_lp2bs) where
import DSP.Filter.Analog.Transform (substitute)
import Numeric.Special.Trigonometric (cot)
d_lp2lp :: Double
-> Double
-> ([Double], [Double])
-> ([Double], [Double])
d_lp2lp :: Double -> Double -> ([Double], [Double]) -> ([Double], [Double])
d_lp2lp Double
tp Double
wp ([Double]
num,[Double]
den) = ([Double], [Double])
-> ([Double], [Double]) -> ([Double], [Double])
substitute ([Double]
nsub,[Double]
dsub) ([Double]
num,[Double]
den)
where nsub :: [Double]
nsub = [-Double
a, Double
1]
dsub :: [Double]
dsub = [Double
1, -Double
a]
a :: Double
a = forall a. Floating a => a -> a
sin ((Double
tpforall a. Num a => a -> a -> a
-Double
wp)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sin ((Double
tpforall a. Num a => a -> a -> a
+Double
wp)forall a. Fractional a => a -> a -> a
/Double
2)
d_lp2hp :: Double
-> Double
-> ([Double], [Double])
-> ([Double], [Double])
d_lp2hp :: Double -> Double -> ([Double], [Double]) -> ([Double], [Double])
d_lp2hp Double
tp Double
wp ([Double]
num,[Double]
den) = ([Double], [Double])
-> ([Double], [Double]) -> ([Double], [Double])
substitute ([Double]
nsub,[Double]
dsub) ([Double]
num,[Double]
den)
where nsub :: [Double]
nsub = [Double
a, Double
1]
dsub :: [Double]
dsub = [-Double
1, -Double
a]
a :: Double
a = -forall a. Floating a => a -> a
cos ((Double
tpforall a. Num a => a -> a -> a
+Double
wp)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
cos ((Double
tpforall a. Num a => a -> a -> a
-Double
wp)forall a. Fractional a => a -> a -> a
/Double
2)
d_lp2bp :: Double
-> Double
-> Double
-> ([Double], [Double])
-> ([Double], [Double])
d_lp2bp :: Double
-> Double -> Double -> ([Double], [Double]) -> ([Double], [Double])
d_lp2bp Double
tp Double
wp1 Double
wp2 ([Double]
num,[Double]
den) = ([Double], [Double])
-> ([Double], [Double]) -> ([Double], [Double])
substitute ([Double]
nsub,[Double]
dsub) ([Double]
num,[Double]
den)
where nsub :: [Double]
nsub = [ (Double
kforall a. Num a => a -> a -> a
-Double
1)forall a. Fractional a => a -> a -> a
/(Double
kforall a. Num a => a -> a -> a
+Double
1), -Double
2forall a. Num a => a -> a -> a
*Double
aforall a. Num a => a -> a -> a
*Double
kforall a. Fractional a => a -> a -> a
/(Double
kforall a. Num a => a -> a -> a
+Double
1), Double
1 ]
dsub :: [Double]
dsub = [ Double
1, -Double
2forall a. Num a => a -> a -> a
*Double
aforall a. Num a => a -> a -> a
*Double
kforall a. Fractional a => a -> a -> a
/(Double
kforall a. Num a => a -> a -> a
+Double
1), (Double
kforall a. Num a => a -> a -> a
-Double
1)forall a. Fractional a => a -> a -> a
/(Double
kforall a. Num a => a -> a -> a
+Double
1) ]
a :: Double
a = forall a. Floating a => a -> a
cos ((Double
wp2forall a. Num a => a -> a -> a
+Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
cos ((Double
wp2forall a. Num a => a -> a -> a
-Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2)
k :: Double
k = forall a. Floating a => a -> a
cot ((Double
wp2forall a. Num a => a -> a -> a
-Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
tan (Double
tpforall a. Fractional a => a -> a -> a
/Double
2)
d_lp2bs :: Double
-> Double
-> Double
-> ([Double], [Double])
-> ([Double], [Double])
d_lp2bs :: Double
-> Double -> Double -> ([Double], [Double]) -> ([Double], [Double])
d_lp2bs Double
tp Double
wp1 Double
wp2 ([Double]
num,[Double]
den) = ([Double], [Double])
-> ([Double], [Double]) -> ([Double], [Double])
substitute ([Double]
nsub,[Double]
dsub) ([Double]
num,[Double]
den)
where nsub :: [Double]
nsub = [ (Double
1forall a. Num a => a -> a -> a
-Double
k)forall a. Fractional a => a -> a -> a
/(Double
1forall a. Num a => a -> a -> a
+Double
k), -Double
2forall a. Num a => a -> a -> a
*Double
aforall a. Fractional a => a -> a -> a
/(Double
1forall a. Num a => a -> a -> a
+Double
k), Double
1 ]
dsub :: [Double]
dsub = [ Double
1, -Double
2forall a. Num a => a -> a -> a
*Double
aforall a. Fractional a => a -> a -> a
/(Double
1forall a. Num a => a -> a -> a
+Double
k), (Double
1forall a. Num a => a -> a -> a
-Double
k)forall a. Fractional a => a -> a -> a
/(Double
1forall a. Num a => a -> a -> a
+Double
k) ]
a :: Double
a = forall a. Floating a => a -> a
cos ((Double
wp2forall a. Num a => a -> a -> a
+Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
cos ((Double
wp2forall a. Num a => a -> a -> a
-Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2)
k :: Double
k = forall a. Floating a => a -> a
cot ((Double
wp2forall a. Num a => a -> a -> a
-Double
wp1)forall a. Fractional a => a -> a -> a
/Double
2) forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
tan (Double
tpforall a. Fractional a => a -> a -> a
/Double
2)