module Math.List.Wavelet (
wt1d,
iwt1d,
cconv1d,
cconv1dnc,
conv1d,
deltaFunc) where
import Data.Complex
import Data.List
wt1d :: [Double] -> Int -> Int -> Int -> [Double]
wt1d :: [Double] -> Int -> Int -> Int -> [Double]
wt1d [Double]
x Int
nd Int
jmin Int
jmax = if Int
jminforall a. Eq a => a -> a -> Bool
==Int
jmax then [Double]
x
else [Double] -> Int -> Int -> Int -> [Double]
wt1d [Double]
coarse Int
nd Int
jmin (Int
jmaxforall a. Num a => a -> a -> a
-Int
1) forall a. [a] -> [a] -> [a]
++ [Double]
detail
where h :: [Double]
h = Double
0.0 forall a. a -> [a] -> [a]
: [[Double]]
hcoefforall a. [a] -> Int -> a
!!(Int
ndforall a. Num a => a -> a -> a
-Int
2)
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
h
g :: [Double]
g = Double
0.0 forall a. a -> [a] -> [a]
: [Double
z | Int
k <- [Int
0..(Int
nforall a. Num a => a -> a -> a
-Int
2)], let z :: Double
z = (-Double
1)forall a b. (Num a, Integral b) => a -> b -> a
^Int
k forall a. Num a => a -> a -> a
* [Double]
hforall a. [a] -> Int -> a
!!((Int
nforall a. Num a => a -> a -> a
-Int
1forall a. Num a => a -> a -> a
-Int
k) forall a. Integral a => a -> a -> a
`mod` Int
n)]
coarse :: [Double]
coarse = forall a. Num a => [a] -> [a]
subsample forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a] -> [a]
cconv1d (forall a. [a] -> [a]
reverse [Double]
h) [Double]
x
detail :: [Double]
detail = forall a. Num a => [a] -> [a]
subsample forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a] -> [a]
cconv1d (forall a. [a] -> [a]
reverse [Double]
g) [Double]
x
iwt1d :: [Double] -> Int -> Int -> Int -> [Double]
iwt1d :: [Double] -> Int -> Int -> Int -> [Double]
iwt1d [Double]
x Int
nd Int
jmin Int
jmax = if Int
jminforall a. Eq a => a -> a -> Bool
==Int
jmax then [Double]
x
else [Double] -> Int -> Int -> Int -> [Double]
iwt1d [Double]
x' Int
nd (Int
jminforall a. Num a => a -> a -> a
+Int
1) Int
jmax
where h :: [Double]
h = Double
0.0 forall a. a -> [a] -> [a]
: [[Double]]
hcoefforall a. [a] -> Int -> a
!!(Int
ndforall a. Num a => a -> a -> a
-Int
2)
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
h
g :: [Double]
g = Double
0.0 forall a. a -> [a] -> [a]
: [Double
z | Int
k <- [Int
0..(Int
nforall a. Num a => a -> a -> a
-Int
2)], let z :: Double
z = (-Double
1)forall a b. (Num a, Integral b) => a -> b -> a
^Int
k forall a. Num a => a -> a -> a
* [Double]
hforall a. [a] -> Int -> a
!!((Int
nforall a. Num a => a -> a -> a
-Int
1forall a. Num a => a -> a -> a
-Int
k) forall a. Integral a => a -> a -> a
`mod` Int
n)]
coarse :: [Double]
coarse = forall a. Int -> [a] -> [a]
take (Int
2forall a b. (Num a, Integral b) => a -> b -> a
^Int
jmin) [Double]
x
detail :: [Double]
detail = forall a. Int -> [a] -> [a]
drop (Int
2forall a b. (Num a, Integral b) => a -> b -> a
^Int
jmin) (forall a. Int -> [a] -> [a]
take (Int
2forall a. Num a => a -> a -> a
*Int
2forall a b. (Num a, Integral b) => a -> b -> a
^Int
jmin) [Double]
x)
coarse' :: [Double]
coarse' = forall a. Num a => [a] -> [a] -> [a]
cconv1d [Double]
h forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a]
upsample [Double]
coarse
detail' :: [Double]
detail' = forall a. Num a => [a] -> [a] -> [a]
cconv1d [Double]
g forall a b. (a -> b) -> a -> b
$ forall a. Num a => [a] -> [a]
upsample [Double]
detail
x' :: [Double]
x' = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(+) [Double]
coarse' [Double]
detail' forall a. [a] -> [a] -> [a]
++ forall a. Int -> [a] -> [a]
drop (Int
2forall a. Num a => a -> a -> a
*Int
2forall a b. (Num a, Integral b) => a -> b -> a
^Int
jmin) [Double]
x
deltaFunc :: Num a => Int -> Int -> [a]
deltaFunc :: forall a. Num a => Int -> Int -> [a]
deltaFunc Int
k Int
n = forall a. Int -> [a] -> [a]
take Int
k [a]
l forall a. [a] -> [a] -> [a]
++ [a
1] forall a. [a] -> [a] -> [a]
++ forall a. Int -> [a] -> [a]
drop (Int
kforall a. Num a => a -> a -> a
+Int
1) [a]
l
where l :: [a]
l = forall a. Int -> a -> [a]
replicate Int
n a
0
subsample :: (Num a) => [a] -> [a]
subsample :: forall a. Num a => [a] -> [a]
subsample [a
x,a
y] = [a
x]
subsample (a
x:(a
y:[a]
xs)) = a
xforall a. a -> [a] -> [a]
:forall a. Num a => [a] -> [a]
subsample [a]
xs
upsample :: (Num a) => [a] -> [a]
upsample :: forall a. Num a => [a] -> [a]
upsample [] = [a
0]
upsample (a
x:[]) = [a
x,a
0]
upsample (a
x:[a]
xs) = (a
xforall a. a -> [a] -> [a]
:(a
0forall a. a -> [a] -> [a]
:forall a. Num a => [a] -> [a]
upsample [a]
xs))
cconv1d :: (Num a) => [a] -> [a] -> [a]
cconv1d :: forall a. Num a => [a] -> [a] -> [a]
cconv1d [a]
hs [a]
xs =
let m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
hs
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
p :: Int
p = (Int
mforall a. Num a => a -> a -> a
-Int
1) forall a. Integral a => a -> a -> a
`div` Int
2
padLeft :: [a]
padLeft = forall a. Int -> [a] -> [a]
drop (Int
nforall a. Num a => a -> a -> a
-Int
mforall a. Num a => a -> a -> a
+Int
1forall a. Num a => a -> a -> a
+Int
p) [a]
xs
padRight :: [a]
padRight = forall a. Int -> [a] -> [a]
take Int
p [a]
xs
ts :: [a]
ts = [a]
padLeft forall a. [a] -> [a] -> [a]
++ [a]
xs forall a. [a] -> [a] -> [a]
++ [a]
padRight
in forall a b. (a -> b) -> [a] -> [b]
map (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a. [a] -> [a]
reverse [a]
hs)) (forall a. Num a => Int -> [a] -> [[a]]
sublists Int
m [a]
ts)
cconv1dnc :: (Num a) => [a] -> [a] -> [a]
cconv1dnc :: forall a. Num a => [a] -> [a] -> [a]
cconv1dnc [a]
hs [a]
xs =
let m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
hs
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
padLeft :: [a]
padLeft = forall a. Int -> [a] -> [a]
drop (Int
nforall a. Num a => a -> a -> a
-Int
mforall a. Num a => a -> a -> a
+Int
1) [a]
xs
ts :: [a]
ts = [a]
padLeft forall a. [a] -> [a] -> [a]
++ [a]
xs
in forall a b. (a -> b) -> [a] -> [b]
map (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a. [a] -> [a]
reverse [a]
hs)) (forall a. Num a => Int -> [a] -> [[a]]
sublists Int
m [a]
ts)
conv1d :: (Num a) => [a] -> [a] -> [a]
conv1d :: forall a. Num a => [a] -> [a] -> [a]
conv1d [a]
hs [a]
xs =
let pad :: [a]
pad = forall a. Int -> a -> [a]
replicate ((forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
hs) forall a. Num a => a -> a -> a
- Int
1) a
0
ts :: [a]
ts = [a]
pad forall a. [a] -> [a] -> [a]
++ [a]
xs
in forall a b. (a -> b) -> [a] -> [b]
map (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a. [a] -> [a]
reverse [a]
hs)) (forall a. [a] -> [a]
init forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [[a]]
tails [a]
ts)
sublists :: (Num a) => Int -> [a] -> [[a]]
sublists :: forall a. Num a => Int -> [a] -> [[a]]
sublists Int
k [a]
lst = forall {a} {a}. [a] -> [a] -> [[a]]
go [a]
lst (forall a. Int -> [a] -> [a]
drop (Int
kforall a. Num a => a -> a -> a
-Int
1) [a]
lst)
where go :: [a] -> [a] -> [[a]]
go l :: [a]
l@(a
_:[a]
lt) (a
_:[a]
xs) = forall a. Int -> [a] -> [a]
take Int
k [a]
l forall a. a -> [a] -> [a]
: [a] -> [a] -> [[a]]
go [a]
lt [a]
xs
go [a]
_ [a]
_ = []
sublists' :: Int -> [a] -> [[a]]
sublists' :: forall a. Int -> [a] -> [[a]]
sublists' Int
k [a]
lst = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (forall a b. a -> b -> a
const forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [a]
take Int
k) (forall a. [a] -> [[a]]
tails [a]
lst) (forall a. Int -> [a] -> [a]
drop (Int
kforall a. Num a => a -> a -> a
-Int
1) [a]
lst)
hcoef :: [[Double]]
hcoef = [
[ Double
0.4829629131445341
, Double
0.8365163037378077
, Double
0.2241438680420134
,-Double
0.1294095225512603
],
[ Double
0.3326705529500825
, Double
0.8068915093110924
, Double
0.4598775021184914
,-Double
0.1350110200102546
,-Double
0.0854412738820267
, Double
0.0352262918857095
],
[ Double
0.2303778133068964
, Double
0.7148465705529154
, Double
0.6308807679398587
,-Double
0.0279837694168599
,-Double
0.1870348117190931
, Double
0.0308413818355607
, Double
0.0328830116668852
,-Double
0.0105974017850690
],
[ Double
0.1601023979741929
, Double
0.6038292697971895
, Double
0.7243085284377726
, Double
0.1384281459013203
,-Double
0.2422948870663823
,-Double
0.0322448695846381
, Double
0.0775714938400459
,-Double
0.0062414902127983
,-Double
0.0125807519990820
, Double
0.0033357252854738
],
[ Double
0.1115407433501095
, Double
0.4946238903984533
, Double
0.7511339080210959
, Double
0.3152503517091982
,-Double
0.2262646939654400
,-Double
0.1297668675672625
, Double
0.0975016055873225
, Double
0.0275228655303053
,-Double
0.0315820393174862
, Double
0.0005538422011614
, Double
0.0047772575109455
,-Double
0.0010773010853085
],
[ Double
0.0778520540850037
, Double
0.3965393194818912
, Double
0.7291320908461957
, Double
0.4697822874051889
,-Double
0.1439060039285212
,-Double
0.2240361849938412
, Double
0.0713092192668272
, Double
0.0806126091510774
,-Double
0.0380299369350104
,-Double
0.0165745416306655
, Double
0.0125509985560986
, Double
0.0004295779729214
,-Double
0.0018016407040473
, Double
0.0003537137999745
],
[ Double
0.0544158422431072
, Double
0.3128715909143166
, Double
0.6756307362973195
, Double
0.5853546836542159
,-Double
0.0158291052563823
,-Double
0.2840155429615824
, Double
0.0004724845739124
, Double
0.1287474266204893
,-Double
0.0173693010018090
,-Double
0.0440882539307971
, Double
0.0139810279174001
, Double
0.0087460940474065
,-Double
0.0048703529934520
,-Double
0.0003917403733770
, Double
0.0006754494064506
,-Double
0.0001174767841248
],
[ Double
0.0380779473638778
, Double
0.2438346746125858
, Double
0.6048231236900955
, Double
0.6572880780512736
, Double
0.1331973858249883
,-Double
0.2932737832791663
,-Double
0.0968407832229492
, Double
0.1485407493381256
, Double
0.0307256814793385
,-Double
0.0676328290613279
, Double
0.0002509471148340
, Double
0.0223616621236798
,-Double
0.0047232047577518
,-Double
0.0042815036824635
, Double
0.0018476468830563
, Double
0.0002303857635232
,-Double
0.0002519631889427
, Double
0.0000393473203163
],
[ Double
0.0266700579005473
, Double
0.1881768000776347
, Double
0.5272011889315757
, Double
0.6884590394534363
, Double
0.2811723436605715
,-Double
0.2498464243271598
,-Double
0.1959462743772862
, Double
0.1273693403357541
, Double
0.0930573646035547
,-Double
0.0713941471663501
,-Double
0.0294575368218399
, Double
0.0332126740593612
, Double
0.0036065535669870
,-Double
0.0107331754833007
, Double
0.0013953517470688
, Double
0.0019924052951925
,-Double
0.0006858566949564
,-Double
0.0001164668551285
, Double
0.0000935886703202
,-Double
0.0000132642028945
]
]