struct Wavelet { virtual void filt(VecDoub_IO &a, const Int n, const Int isign) = 0; virtual void condition(VecDoub_IO &a, const Int n, const Int isign) {} }; struct Daub4 : Wavelet { void filt(VecDoub_IO &a, const Int n, const Int isign) { const Doub C0=0.4829629131445341, C1=0.8365163037378077, C2=0.2241438680420134, C3=-0.1294095225512603; Int nh,i,j; if (n < 4) return; VecDoub wksp(n); nh = n >> 1; if (isign >= 0) { for (i=0,j=0;j= 0) { wlet.condition(a,n,1); for (nn=n;nn>=4;nn>>=1) wlet.filt(a,nn,isign); } else { for (nn=4;nn<=n;nn<<=1) wlet.filt(a,nn,isign); wlet.condition(a,n,-1); } } struct Daubs : Wavelet { Int ncof,ioff,joff; VecDoub cc,cr; static Doub c4[4],c12[12],c20[20]; Daubs(Int n) : ncof(n), cc(n), cr(n) { Int i; ioff = joff = -(n >> 1); // ioff = -2; joff = -n + 2; if (n == 4) for (i=0; i> 1; for (j=0;j= 0) { for (ii=0,i=0;i> 1; if (isign >= 0) { wksp[0] = R00*a[0]+R01*a[1]+R02*a[2]; wksp[nh] = R10*a[0]+R11*a[1]+R12*a[2]; wksp[1] = R20*a[0]+R21*a[1]+R22*a[2]+R23*a[3]+R24*a[4]; wksp[nh+1] = R30*a[0]+R31*a[1]+R32*a[2]+R33*a[3]+R34*a[4]; for (i=2,j=3;j= 0) { t0 = 0.324894048898962*a[0]+0.0371580151158803*a[1]; t1 = 1.00144540498130*a[1]; t2 = 1.08984305289504*a[n-2]; t3 = -0.800813234246437*a[n-2]+2.09629288435324*a[n-1]; a[0]=t0; a[1]=t1; a[n-2]=t2; a[n-1]=t3; } else { t0 = 3.07792649138669*a[0]-0.114204567242137*a[1]; t1 = 0.998556681198888*a[1]; t2 = 0.917563310922261*a[n-2]; t3 = 0.350522032550918*a[n-2]+0.477032578540915*a[n-1]; a[0]=t0; a[1]=t1; a[n-2]=t2; a[n-1]=t3; } } }; void wtn(VecDoub_IO &a, VecInt_I &nn, const Int isign, Wavelet &wlet) { Int idim,i1,i2,i3,k,n,nnew,nprev=1,nt,ntot=1; Int ndim=nn.size(); for (idim=0;idim 4) { for (i2=0;i2= 0) { wlet.condition(wksp,n,1); for(nt=n;nt>=4;nt >>= 1) wlet.filt(wksp,nt,isign); } else { for(nt=4;nt<=n;nt <<= 1) wlet.filt(wksp,nt,isign); wlet.condition(wksp,n,-1); } for (i3=i1+i2,k=0;k