module DSP.Filter.FIR.Taps (lpf, hpf, bpf, bsf, mbf, rc) where
import Data.Array
indexes :: (Integral a, Num b, Enum b) => a -> [b]
indexes :: forall a b. (Integral a, Num b, Enum b) => a -> [b]
indexes a
m = [ b
0 .. forall a b. (Integral a, Num b) => a -> b
fromIntegral a
m ]
lpf_tap :: (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap :: forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap b
wc a
m b
n | b
nforall a. Num a => a -> a -> a
-b
a forall a. Eq a => a -> a -> Bool
== b
0 = b
wc forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a
pi
| Bool
otherwise = forall a. Floating a => a -> a
sin (b
wc forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a)) forall a. Fractional a => a -> a -> a
/ (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a))
where a :: b
a = (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
m) forall a. Fractional a => a -> a -> a
/ b
2
hpf_tap :: (Integral a, Floating b, Eq b) => b -> a -> b -> b
hpf_tap :: forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
hpf_tap b
wc a
m b
n | b
nforall a. Num a => a -> a -> a
-b
a forall a. Eq a => a -> a -> Bool
== b
0 = b
1 forall a. Num a => a -> a -> a
- b
wc forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a
pi
| Bool
otherwise = forall a. Floating a => a -> a
sin (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a)) forall a. Fractional a => a -> a -> a
/ (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a)) forall a. Num a => a -> a -> a
- forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap b
wc a
m b
n
where a :: b
a = (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
m) forall a. Fractional a => a -> a -> a
/ b
2
mbf_tap :: (Integral a, Floating b, Eq b) => [b] -> [b] -> a -> b -> b
mbf_tap :: forall a b.
(Integral a, Floating b, Eq b) =>
[b] -> [b] -> a -> b -> b
mbf_tap (b
g:[]) (b
w:[]) a
m b
n = b
g forall a. Num a => a -> a -> a
* forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap b
w a
m b
n
mbf_tap (b
g1:b
g2:[b]
gs) (b
w:[b]
ws) a
m b
n = (b
g1forall a. Num a => a -> a -> a
-b
g2) forall a. Num a => a -> a -> a
* forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap b
w a
m b
n forall a. Num a => a -> a -> a
+ forall a b.
(Integral a, Floating b, Eq b) =>
[b] -> [b] -> a -> b -> b
mbf_tap (b
g2forall a. a -> [a] -> [a]
:[b]
gs) [b]
ws a
m b
n
mbf_tap [b]
_ [b]
_ a
_ b
_ = forall a. HasCallStack => [Char] -> a
error [Char]
"mbf_tap: bands out of sync"
rc_tap :: (Integral a, Floating b, Eq b) => b -> b -> a -> b -> b
rc_tap :: forall a b. (Integral a, Floating b, Eq b) => b -> b -> a -> b -> b
rc_tap b
ws b
b a
m b
n | b
nforall a. Num a => a -> a -> a
-b
a forall a. Eq a => a -> a -> Bool
== b
0 = b
1
| b
den forall a. Eq a => a -> a -> Bool
== b
0 = b
0
| Bool
otherwise = forall a. Floating a => a -> a
sin b
sarg forall a. Fractional a => a -> a -> a
/ b
sarg forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
cos b
carg forall a. Fractional a => a -> a -> a
/ b
den
where sarg :: b
sarg = b
ws forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a) forall a. Fractional a => a -> a -> a
/ b
2
carg :: b
carg = b
b forall a. Num a => a -> a -> a
* b
ws forall a. Num a => a -> a -> a
* (b
nforall a. Num a => a -> a -> a
-b
a) forall a. Fractional a => a -> a -> a
/ b
2
den :: b
den = b
1 forall a. Num a => a -> a -> a
- b
4 forall a. Num a => a -> a -> a
* ((b
bforall a. Num a => a -> a -> a
*b
wsforall a. Num a => a -> a -> a
*(b
nforall a. Num a => a -> a -> a
-b
a)) forall a. Fractional a => a -> a -> a
/ (b
2forall a. Num a => a -> a -> a
*forall a. Floating a => a
pi)) forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2::Int)
a :: b
a = (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
m) forall a. Fractional a => a -> a -> a
/ b
2
lpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b
-> a
-> Array a b
lpf :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
lpf b
wc a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
lpf_tap b
wc a
m) (forall a b. (Integral a, Num b, Enum b) => a -> [b]
indexes a
m)
hpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b
-> a
-> Array a b
hpf :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
hpf b
wc a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Integral a, Floating b, Eq b) => b -> a -> b -> b
hpf_tap b
wc a
m) (forall a b. (Integral a, Num b, Enum b) => a -> [b]
indexes a
m)
bpf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b
-> b
-> a
-> Array a b
bpf :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> b -> a -> Array a b
bpf b
wl b
wu a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(+) (forall i e. Array i e -> [e]
elems forall a b. (a -> b) -> a -> b
$ forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
lpf b
wu a
m) (forall i e. Array i e -> [e]
elems forall a b. (a -> b) -> a -> b
$ forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
hpf b
wl a
m)
bsf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b
-> b
-> a
-> Array a b
bsf :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> b -> a -> Array a b
bsf b
wl b
wu a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(+) (forall i e. Array i e -> [e]
elems forall a b. (a -> b) -> a -> b
$ forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
lpf b
wl a
m) (forall i e. Array i e -> [e]
elems forall a b. (a -> b) -> a -> b
$ forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> a -> Array a b
hpf b
wu a
m)
mbf :: (Ix a, Integral a, Enum b, Floating b, Eq b) => [b]
-> [b]
-> a
-> Array a b
mbf :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
[b] -> [b] -> a -> Array a b
mbf [b]
g [b]
w a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a b.
(Integral a, Floating b, Eq b) =>
[b] -> [b] -> a -> b -> b
mbf_tap [b]
g [b]
w a
m) (forall a b. (Integral a, Num b, Enum b) => a -> [b]
indexes a
m)
rc :: (Ix a, Integral a, Enum b, Floating b, Eq b) => b
-> b
-> a
-> Array a b
rc :: forall a b.
(Ix a, Integral a, Enum b, Floating b, Eq b) =>
b -> b -> a -> Array a b
rc b
ws b
b a
m = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (a
0,a
m) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Integral a, Floating b, Eq b) => b -> b -> a -> b -> b
rc_tap b
ws b
b a
m) (forall a b. (Integral a, Num b, Enum b) => a -> [b]
indexes a
m)