module DSP.Filter.FIR.Kaiser (kaiser_lpf, kaiser_hpf) where
import Data.Array
import DSP.Window
import DSP.Filter.FIR.Taps
calc_wc :: Fractional a => a -> a -> a
calc_wc :: forall a. Fractional a => a -> a -> a
calc_wc a
wp a
ws = (a
wp forall a. Num a => a -> a -> a
+ a
ws) forall a. Fractional a => a -> a -> a
/ a
2
calc_dw :: Num a => a -> a -> a
calc_dw :: forall a. Num a => a -> a -> a
calc_dw a
wp a
ws = forall a. Num a => a -> a
abs (a
ws forall a. Num a => a -> a -> a
- a
wp)
calc_A :: (Floating a, Ord a) => a -> a -> a
calc_A :: forall a. (Floating a, Ord a) => a -> a -> a
calc_A a
d1 a
d2 = -a
20 forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a -> a
logBase a
10 (forall a. Ord a => a -> a -> a
min a
d1 a
d2)
calc_beta :: (Ord a, Floating a) => a -> a
calc_beta :: forall a. (Ord a, Floating a) => a -> a
calc_beta a
a | a
a forall a. Ord a => a -> a -> Bool
> a
50 = a
0.1102 forall a. Num a => a -> a -> a
* (a
a forall a. Num a => a -> a -> a
- a
8.7)
| a
a forall a. Ord a => a -> a -> Bool
>= a
21 = a
0.5842 forall a. Num a => a -> a -> a
* ((a
aforall a. Num a => a -> a -> a
-a
21) forall a. Floating a => a -> a -> a
** a
0.4) forall a. Num a => a -> a -> a
+ a
0.07886 forall a. Num a => a -> a -> a
* (a
aforall a. Num a => a -> a -> a
-a
21)
| Bool
otherwise = a
0.0
calc_M :: (Integral b, RealFrac a) => a -> a -> b
calc_M :: forall b a. (Integral b, RealFrac a) => a -> a -> b
calc_M a
a a
dw = forall a b. (RealFrac a, Integral b) => a -> b
ceiling ((a
a forall a. Num a => a -> a -> a
- a
8) forall a. Fractional a => a -> a -> a
/ (a
2.285 forall a. Num a => a -> a -> a
* a
dw))
kaiser_lpf :: Double
-> Double
-> Double
-> Double
-> Array Int Double
kaiser_lpf :: Double -> Double -> Double -> Double -> Array Int Double
kaiser_lpf Double
wp Double
ws Double
d1 Double
d2 = Array Int Double -> Array Int Double -> Array Int Double
window (Double -> Int -> Array Int Double
kaiser Double
beta Int
m) (forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
lpf Double
wc Int
m)
where wc :: Double
wc = forall a. Fractional a => a -> a -> a
calc_wc Double
wp Double
ws
dw :: Double
dw = forall a. Num a => a -> a -> a
calc_dw Double
wp Double
ws
a :: Double
a = forall a. (Floating a, Ord a) => a -> a -> a
calc_A Double
d1 Double
d2
beta :: Double
beta = forall a. (Ord a, Floating a) => a -> a
calc_beta Double
a
m :: Int
m = forall b a. (Integral b, RealFrac a) => a -> a -> b
calc_M Double
a Double
dw
kaiser_hpf :: Double
-> Double
-> Double
-> Double
-> Array Int Double
kaiser_hpf :: Double -> Double -> Double -> Double -> Array Int Double
kaiser_hpf Double
wp Double
ws Double
d1 Double
d2 = Array Int Double -> Array Int Double -> Array Int Double
window (Double -> Int -> Array Int Double
kaiser Double
beta Int
m) (forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
hpf Double
wc Int
m)
where wc :: Double
wc = forall a. Fractional a => a -> a -> a
calc_wc Double
wp Double
ws
dw :: Double
dw = forall a. Num a => a -> a -> a
calc_dw Double
wp Double
ws
a :: Double
a = forall a. (Floating a, Ord a) => a -> a -> a
calc_A Double
d1 Double
d2
beta :: Double
beta = forall a. (Ord a, Floating a) => a -> a
calc_beta Double
a
m :: Int
m = forall b. Integral b => b -> b
ceilingEven (forall b a. (Integral b, RealFrac a) => a -> a -> b
calc_M Double
a Double
dw)
ceilingEven :: Integral b => b -> b
ceilingEven :: forall b. Integral b => b -> b
ceilingEven b
x = b
x forall a. Num a => a -> a -> a
+ forall a. Integral a => a -> a -> a
mod (-b
x) b
2