struct Spectreg { Int m,m2,nsum; VecDoub specsum, wksp; Spectreg(Int em) : m(em), m2(2*m), nsum(0), specsum(m+1,0.), wksp(m2) { if (m & (m-1)) throw("m must be power of 2"); } template void adddataseg(VecDoub_I &data, D &window) { Int i; Doub w,fac,sumw = 0.; if (data.size() != m2) throw("wrong size data segment"); for (i=0;i void adddataseg(VecDoub_I &data, D &window) { Int i; if (data.size() != m) throw("wrong size data segment"); if (first) { for (i=0;i void addlongdata(VecDoub_I &data, D &window) { Int i, k, noff, nt=data.size(), nk=(nt-1)/m; Doub del = nk > 1 ? (nt-m2)/(nk-1.) : 0.; if (nt < m2) throw("data length too short"); for (k=0;k= 2*jres) throw("kt too big or jres too small"); filltable(); } void filltable(); void renorm(Int n) { p = ldexp(p,n); pp = ldexp(pp,n); d = ldexp(d,n); dd = ldexp(dd,n); } struct Slepwindow { Int k; MatDoub &dps; Slepwindow(Int kkt, MatDoub &dpss) : k(kkt), dps(dpss) {} Doub operator() (Int j, Int n) {return dps[k][j];} }; void adddataseg(VecDoub_I &data) { Int k; if (data.size() != m2) throw("wrong size data segment"); for (k=0;k1.e30) renorm(-100); else if (abs(p)<1.e-30) renorm(100); } xnew = xx - p/d; if (abs(xx-xnew) < EPS*abs(xnew)) break; xx = xnew; } xx = xnew - (xold - xnew); xold = xnew; for (i=0;i=0; i--) u[i] -= gam[i+1]*u[i+1]; sup[nl] = ssup; sub[nl-1] = ssub; sum = 0.; for (i=0; i 0.)? sqrt(sum) : -sqrt(sum); for (i=0; i