module Math.List.Wavelet (
wt1d,
iwt1d,
conv1d,
cconv1d,
cconv1dnc,
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 = [Double] -> [Double]
subsample forall a b. (a -> b) -> a -> b
$ [Double] -> [Double] -> [Double]
cconv1d (forall a. [a] -> [a]
reverse [Double]
h) [Double]
x
detail :: [Double]
detail = [Double] -> [Double]
subsample forall a b. (a -> b) -> a -> b
$ [Double] -> [Double] -> [Double]
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' = [Double] -> [Double] -> [Double]
cconv1d [Double]
h forall a b. (a -> b) -> a -> b
$ [Double] -> [Double]
upsample [Double]
coarse
detail' :: [Double]
detail' = [Double] -> [Double] -> [Double]
cconv1d [Double]
g forall a b. (a -> b) -> a -> b
$ [Double] -> [Double]
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 :: [Double] -> [Double]
subsample :: [Double] -> [Double]
subsample [Double
x,Double
y] = [Double
x]
subsample (Double
x:(Double
y:[Double]
xs)) = Double
xforall a. a -> [a] -> [a]
:[Double] -> [Double]
subsample [Double]
xs
upsample :: [Double] -> [Double]
upsample :: [Double] -> [Double]
upsample [] = [Double
0]
upsample (Double
x:[]) = [Double
x,Double
0]
upsample (Double
x:[Double]
xs) = (Double
xforall a. a -> [a] -> [a]
:(Double
0forall a. a -> [a] -> [a]
:[Double] -> [Double]
upsample [Double]
xs))
zeropad :: [Double] -> Int -> Double
zeropad :: [Double] -> Int -> Double
zeropad [Double]
x Int
i = if (Int
i forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i forall a. Ord a => a -> a -> Bool
>= Int
len) then Double
0.0 else [Double]
xforall a. [a] -> Int -> a
!!Int
i
where len :: Int
len = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
x
cconv1d :: [Double] -> [Double] -> [Double]
cconv1d :: [Double] -> [Double] -> [Double]
cconv1d [Double]
h [Double]
x = [forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [[Double]
hforall a. [a] -> Int -> a
!!Int
i forall a. Num a => a -> a -> a
* [Double]
xforall a. [a] -> Int -> a
!!((Int
jforall a. Num a => a -> a -> a
-Int
iforall a. Num a => a -> a -> a
+Int
pc) forall a. Integral a => a -> a -> a
`mod` Int
n) | Int
i <- [Int
0..(Int
mforall a. Num a => a -> a -> a
-Int
1)]] | Int
j <- [Int
0..(Int
nforall a. Num a => a -> a -> a
-Int
1)] ]
where m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
h
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
x
pc :: Int
pc = (Int
mforall a. Num a => a -> a -> a
-Int
1) forall a. Integral a => a -> a -> a
`div` Int
2
cconv1dnc :: [Double] -> [Double] -> [Double]
cconv1dnc :: [Double] -> [Double] -> [Double]
cconv1dnc [Double]
h [Double]
x = [forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [[Double]
hforall a. [a] -> Int -> a
!!Int
i forall a. Num a => a -> a -> a
* [Double]
xforall a. [a] -> Int -> a
!!((Int
jforall a. Num a => a -> a -> a
-Int
i) forall a. Integral a => a -> a -> a
`mod` Int
n) | Int
i <- [Int
0..(Int
mforall a. Num a => a -> a -> a
-Int
1)]] | Int
j <- [Int
0..(Int
nforall a. Num a => a -> a -> a
-Int
1)] ]
where m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
h
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
x
conv1d :: [Double] -> [Double] -> [Double]
conv1d :: [Double] -> [Double] -> [Double]
conv1d [Double]
h [Double]
x = [forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [[Double]
hforall a. [a] -> Int -> a
!!Int
i forall a. Num a => a -> a -> a
* [Double] -> Int -> Double
zeropad [Double]
x (Int
jforall a. Num a => a -> a -> a
-Int
i) | Int
i <- [Int
0..(Int
mforall a. Num a => a -> a -> a
-Int
1)]] | Int
j <- [Int
0..(Int
nforall a. Num a => a -> a -> a
+Int
mforall a. Num a => a -> a -> a
-Int
2)] ]
where m :: Int
m = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
h
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Double]
x
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
]
]