pub use crate::daubechies::*;
pub use crate::lwt::LiftingTransform;
use ndwt_macros::implement_lifting_scheme;
implement_lifting_scheme! {
Daubechies1,
UpdateD(0, [-1.0]),
UpdateS(0, [0.5]),
Scale(1.41421356237309504880168872420969807856967187537694807317668)
}
implement_lifting_scheme! {
Daubechies2,
UpdateD(
0,
[-1.73205080756887729352744634150587236694280525381038062805581]
),
UpdateS(
0,
[
0.433012701892219323381861585376468091735701313452595157013952,
-0.0669872981077806766181384146235319082642986865474048429860483
]
),
UpdateD(-1, [1.0]),
Scale(1.93185165257813657349948639945779473526780967801680910080469)
}
implement_lifting_scheme! {
Daubechies3,
UpdateS(
0,
[2.42549724391195830853534735792805013148173539788185404597169]
),
UpdateD(
-1,
[
0.0793394561851575665709854468556681022464175974577020488100928,
-0.352387657674855469319634307041734500360168717199626110489802
]
),
UpdateS(
1,
[
-2.89534745414509893429485976731702946529529368748135552662476,
0.561414909153505374525726237570322812332695442156902611352901
]
),
UpdateD(
-2,
[-0.019750529242293006004979050052766598262001873036524279141228]
),
Scale(0.431879991517282793698835833676951360096586647014001193148804)
}
implement_lifting_scheme! {
Daubechies4,
UpdateD(
0,
[-3.10293148583032589470063811758833883204289885795495381963662]
),
UpdateS(
0,
[
0.291953126003475318556841072165741485752300908535736046765408,
-0.0763000865730822647117716642303829704900132630734716898217313
]
),
UpdateD(
-2,
[
-1.66252835290918420695309216797834224617770151758624450562630,
5.19949157307254554931197031659870769733798631513761235614244
]
),
UpdateS(
2,
[
0.0378927481279514768107649771704322007124977302352613448672599,
-0.00672237263307937367389807287370832440934919551535679032055690
]
),
UpdateD(
-3,
[0.3141064933959557065391048234478969083531725328477611313704]
),
Scale(2.61311836977700528153533622961553870584070279281549965816974)
}
implement_lifting_scheme! {
Daubechies5,
UpdateS(
0,
[3.77151921168926894757552366178790881698024090635846510016028]
),
UpdateD(
-1,
[
0.0698842923341383375213513979361008347245073868657407740184605,
-0.247729291360329682294999795251047782875275189599695961483240
]
),
UpdateS(
1,
[
-7.59757973540575405854153663362110608451687695913930970651012,
3.03368979135389213275426841861823490779263829963269704719700
]
),
UpdateD(
-3,
[
0.0157993238122452355950658463497927543465183810596906799882017,
-0.0503963526115147652552264735912933014908335872176681805787989
]
),
UpdateS(
3,
[
-1.10314632826313117312599754225554155377077047715385824307618,
0.172572555625945876870245572286755166281402778242781642128057
]
),
UpdateD(
-4,
[-0.002514343828207810116980039456958207159821965712982241017850]
),
Scale(0.347389040193226710460416754871479443615028875117970218575475)
}
implement_lifting_scheme! {
Daubechies6,
UpdateD(
0,
[-4.43446829869067456522902386901421595117929955784397002766726]
),
UpdateS(
0,
[
0.214593450003008209156010000739498614149390366235009628657503,
-0.0633131925460940277584543253045170400260191584783746185619816
]
),
UpdateD(
-2,
[
-4.49311316887101738480447295831022985715670304865394507715493,
9.97001561279871984191261047001888284698487613742269103059835
]
),
UpdateS(
2,
[
0.0574139368483299602834412946783536920860387960959081807080617,
-0.0236634936624266945597991164435457276455333750966623043873005
]
),
UpdateD(
-4,
[
-0.678784346153377860800578862111733303605730559399948511853599,
2.35649702197482872471682359887683553808556485181375033959333
]
),
UpdateS(
4,
[
0.00718356311583346870790647002569199987967970725769484660306772,
-0.000991165530519446158731723517460535223234500789445981449538906
]
),
UpdateD(
-5,
[0.0941066740419976307126245842066834084085931268118251639620]
),
Scale(3.12146472110567217396698691201148558733292298702703900943590)
}
implement_lifting_scheme! {
Daubechies7,
UpdateS(
0,
[5.09349848430361493158448369309319682065288729718818488170086]
),
UpdateD(
-1,
[
0.0573987259809472316318163158166229520747344869480313379225195,
-0.189042092071992120719115069286184373462757526526706607687359
]
),
UpdateS(
1,
[
-12.2854449967343086359903552773950797906521905606178682213636,
5.95920876247802982415703053009457554606483451817620285866937
]
),
UpdateD(
-3,
[
0.0291354832120604111715672746297275711217338322811099054777142,
-0.0604278631317421373037302780741631438456816254617632977400450
]
),
UpdateS(
3,
[
-3.97071066749950430300434793946545058865144871092579097855408,
1.56044025996325478842482192099426071408509934413107380064471
]
),
UpdateD(
-5,
[
0.00330657330114293172083753191386779325367868962178489518206046,
-0.0126913773899277263576544929765396597865052704453285425832652
]
),
UpdateS(
5,
[
-0.414198450444716993956500507305024397477047469411911796987340,
0.0508158836433382836486473921674908683852045493076552967984957
]
),
UpdateD(
6,
[-0.000406214488767545513490343915060150692174820527241063790923]
),
Scale(0.299010707585297416977548850152193565671577389737970684943879)
}
implement_lifting_scheme! {
Daubechies8,
UpdateD(
0,
[-5.74964161202428952531641742297874447770069863700611439780625]
),
UpdateS(
0,
[
0.168817243718131329733739050478074550968392688719678832777754,
-0.0522692017709505657615046200264570878753855329566801514443159
]
),
UpdateD(
-2,
[
-7.40210683018195497281259144457822959078824042693518644132815,
14.5428209935956353268617650552874052350090521140251529737701
]
),
UpdateS(
2,
[
0.0609092565131526712500223989293871769934896033103158195108610,
-0.0324020739799994261972421468359233560093660827487021893317097
]
),
UpdateD(
-4,
[
-2.75569878011462525067005258197637909961926722730653432065204,
5.81871648960616924395028985550090363087448278263304640355032
]
),
UpdateS(
4,
[
0.0179741053616847069172743389156784247398807427207560577921141,
-0.00655821883883417186334513866087578753320413229517368432598099
]
),
UpdateD(
-6,
[
-0.247286508228382323711914584543135429166229548148776820566842,
1.05058183627305042173272934526705555053668924546503033598454
]
),
UpdateS(
6,
[
0.00155378941435181290328472355847245468306658119261351754857778,
-0.000171095706397052251935603348141260065760590013485603128919513
]
),
UpdateD(
-7,
[0.0272403229721260106412588252370521928932024767680952595018]
),
Scale(3.55216212499884228308604950160526405248328786633495753507726)
}
implement_lifting_scheme! {
Daubechies9,
UpdateS(
0,
[6.40356667029530508760080808783489133464036532617193668200642]
),
UpdateD(
-1,
[
0.0478620457576149696142136339183134192664759465250407879952019,
-0.152445307138113158125515923369521189954909195320469555091745
]
),
UpdateS(
1,
[
-16.7495289773888798826988564047533244498790443964285935409250,
8.81374755622085106660660863038249265306851411409730451179401
]
),
UpdateD(
-3,
[
0.0340347707916009652867818067005911583675728508345200913918348,
-0.0599208900033806032126553368487307560798208913547861697203664
]
),
UpdateS(
3,
[
-7.79465596858466751790439766158850497420595357628693657112631,
4.16556856168973137548378360164009504192377781136783738852484
]
),
UpdateD(
-5,
[
0.0101058807409283297084867372477325233905693061878794566228052,
-0.0224419008121378002481343456879309753491248147469986492112145
]
),
UpdateS(
5,
[
-2.02686517288325962820838159403507719850692398840316366775084,
0.680385404820989371520060130779157801338964153839808884599304
]
),
UpdateD(
-7,
[
0.000737614555567870951119489872174219864600074362045135172869561,
-0.00345517675942357584563854529369350464317538313241706164777921
]
),
UpdateS(
7,
[
-0.145575980707287404465639734807644548395600047373340146812474,
0.0145160493659163017396796133362259414298078142573013650468794
]
),
UpdateD(
8,
[-0.000073558753801024382174422512593349405711068832718470204911]
),
Scale(0.266806475394164811023784074087480714665703180413524153545256)
}
implement_lifting_scheme! {
Daubechies10,
UpdateD(
0,
[-7.05573271641722425372287287671537054274962482939774393309597]
),
UpdateS(
0,
[
0.138937875273882486867801529794954198889605368487685062499916,
-0.0440723855473913159199751979923158273798120987048451923439931
]
),
UpdateD(
-2,
[
-10.1944019324491108447120691883139389311502922162321182217969,
18.9141327490851728118176967423708811816959438636030989932862
]
),
UpdateS(
2,
[
0.0581400886463108620418714676575886465057572425807448620563261,
-0.0345692907775274607658344294544977358985093127259602337375023
]
),
UpdateD(
-4,
[
-5.70138711246923678994802131608360234141050792847673535020183,
9.82667061849089314269898456882699657839357508456034855942949
]
),
UpdateS(
4,
[
0.02589156679055362177370904355067755409866048500959951140203431,
-0.0134214601881666825322224865563089256723608595115204041422517
]
),
UpdateD(
-6,
[
-1.39809421892900296812835643251929202203521241237059776271413,
3.31309217077838642695523164256389983851609417600879502794343
]
),
UpdateS(
6,
[
0.00587858298639691456648277376962090120201222076185998953606526,
-0.00181242379712518927320452687498457116493703409472903720690277
]
),
UpdateD(
-8,
[
-0.0845508291568382642128739817221491217957002914094375371425917,
0.434275883081245282445872075043694638789242093593484235654802
]
),
UpdateS(
8,
[
0.000353135120384141769320697765492599497299036748377472493001024,
-0.0000321412109048260097331298099101743753319602611038821674298915
]
),
UpdateD(
-9,
[0.0076957695402440469213874787289877569218407678080231515098]
),
Scale(3.93366550987980032644543137065956466690284578093101997017002)
}
#[cfg(test)]
mod tests {
use core::f64;
use super::*;
use crate::boundarys::ZeroBoundary;
use crate::tests::test_approx_equal;
const RTOL: f64 = 1E-6;
const ATOL: f64 = 1E-14;
#[test]
fn test_daubechies1() {
let mut x = [0.0; 10];
x[4] = 1.0;
let s_ref = [0.0, 0.0, 1.0 / f64::consts::SQRT_2, 0.0, 0.0];
let d_ref = [0.0, 0.0, -1.0 / f64::consts::SQRT_2, 0.0, 0.0];
let mut s = [0.0; 5];
let mut d = [0.0; 5];
let (chunks, _rem) = x.as_chunks::<2>();
chunks.iter().enumerate().for_each(|(i, xc)| {
s[i] = xc[0];
d[i] = xc[1];
});
Daubechies1::forward(&mut s, &mut d, &ZeroBoundary {});
test_approx_equal(&s, &s_ref, RTOL, ATOL);
test_approx_equal(&d, &d_ref, RTOL, ATOL);
let mut x = [0.0; 10];
x[5] = 1.0;
let s_ref = [0.0, 0.0, 1.0 / f64::consts::SQRT_2, 0.0, 0.0];
let d_ref = [0.0, 0.0, 1.0 / f64::consts::SQRT_2, 0.0, 0.0];
let mut s = [0.0; 5];
let mut d = [0.0; 5];
let (chunks, _rem) = x.as_chunks::<2>();
chunks.iter().enumerate().for_each(|(i, xc)| {
s[i] = xc[0];
d[i] = xc[1];
});
Daubechies1::forward(&mut s, &mut d, &ZeroBoundary {});
test_approx_equal(&s, &s_ref, RTOL, ATOL);
test_approx_equal(&d, &d_ref, RTOL, ATOL);
}
}