-----------------------------------------------------------------------------
-- |
-- Module      :  DSP.Filter.Analog.Response
-- Copyright   :  (c) Matthew Donadio 2003
-- License     :  GPL
--
-- Maintainer  :  m.p.donadio@ieee.org
-- Stability   :  experimental
-- Portability :  portable
--
-- Module for generating analog filter responses
--
-- Formulas are from Oppenheim and Schafer, Appendix B
--
-----------------------------------------------------------------------------

module DSP.Filter.Analog.Response where

import DSP.Basic ((^!))
import Polynomial.Basic
import Polynomial.Chebyshev

-- | Butterworth filter response function

butterworth_H :: Int    -- ^ N
	      -> Double -- ^ w_c
	      -> Double -- ^ w
	      -> Double -- ^ |H_c(w)|^2

butterworth_H :: Int -> Double -> Double -> Double
butterworth_H Int
n Double
wc Double
w = Double
1 forall a. Fractional a => a -> a -> a
/ (Double
1 forall a. Num a => a -> a -> a
+ (Double
wforall a. Fractional a => a -> a -> a
/Double
wc)forall a b. (Num a, Integral b) => a -> b -> a
^(Int
2forall a. Num a => a -> a -> a
*Int
n))

-- | Chebyshev filter response function

chebyshev1_H :: Int    -- ^ N
	     -> Double -- ^ epsilon
	     -> Double -- ^ w_c
	     -> Double -- ^ w
	     -> Double -- ^ |H_c(w)|^2

chebyshev1_H :: Int -> Double -> Double -> Double -> Double
chebyshev1_H Int
n Double
eps Double
wc Double
w = Double
1 forall a. Fractional a => a -> a -> a
/ (Double
1 forall a. Num a => a -> a -> a
+ Double
epsforall a. Num a => a -> Int -> a
^!Int
2 forall a. Num a => a -> a -> a
* Double -> Double
vn(Double
wforall a. Fractional a => a -> a -> a
/Double
wc)forall a. Num a => a -> Int -> a
^!Int
2)
    where vn :: Double -> Double
vn = forall a. Num a => [a] -> a -> a
polyeval (forall a b. (Integral a, Num b) => a -> [b]
cheby Int
n)

-- | Inverse Chebyshev filter response function
--
-- Note that @w_c@ is a property of the stopband for this filter

chebyshev2_H :: Int    -- ^ N
	     -> Double -- ^ epsilon
	     -> Double -- ^ w_c
	     -> Double -- ^ w
	     -> Double -- ^ |H_c(w)|^2

chebyshev2_H :: Int -> Double -> Double -> Double -> Double
chebyshev2_H Int
n Double
eps Double
wc Double
w = Double
1 forall a. Fractional a => a -> a -> a
/ (Double
1 forall a. Num a => a -> a -> a
+ (Double
epsforall a. Num a => a -> Int -> a
^!Int
2 forall a. Num a => a -> a -> a
* Double -> Double
vn(Double
wcforall a. Fractional a => a -> a -> a
/Double
w)forall a. Num a => a -> Int -> a
^!Int
2)forall a. Floating a => a -> a -> a
**(-Double
1))
    where vn :: Double -> Double
vn = forall a. Num a => [a] -> a -> a
polyeval (forall a b. (Integral a, Num b) => a -> [b]
cheby Int
n)