float wilson2_factor(int niter /* number of iterations */, float s0 /* zero-lag auto-correlation */, sf_filter ss /* input auto-correlation */, float a0 /* zero-lag filter */, sf_filter aa /* output factor */, bool verb /* verbosity flag */, float tol /* tolerance */) /*< Factor >*/ { float g0, *gg; int i, iter; for(i=0; i < n2; i++) { au[i] = 0.; } sf_helicon_init( aa); /* multiply polynoms */ sf_polydiv_init( n2, aa); /* divide polynoms */ au[n-1] = -a0*a0; sf_helicon_lop(false, false, n2, n2, au, bb); sf_helicon_lop(true, false, n2, n2, au, bb); au[n-1] += s0; for(i=0; i < ss->nh; i++) { /* symmetrize input auto */ au[n-1+ss->lag[i]] += ss->flt[i]; au[n-1-ss->lag[i]] += ss->flt[i]; } g0 = a0; gg = sf_floatalloc(aa->nh); for(i=0; i < aa->nh; i++) { gg[i] = aa->flt[i]; } for(iter=0; iter < niter; iter++) { sf_polydiv_lop(false,false, n2, n2, au, bb); /* bb = S/A */ sf_polydiv_lop(true, false, n2, n2, cc, bb); /* cc = S/(AA') */ /* b = plusside(cc) */ for(i=0; i < n; i++) { b[i] = 0.5*(cc[n-1+i] + cc[n-1-i])/a0; } sf_helicon_lop( false, false, n, n, b, c); /* c = A b */ a0 = 2.*(c[0]+g0); for(i=0; i < aa->nh; i++) { /* put on helix */ aa->flt[i] = 2.*(c[aa->lag[i]]+gg[i])/a0; } } a0 -= g0; for(i=0; i < aa->nh; i++) { aa->flt[i] = ((a0+g0)*aa->flt[i]-gg[i])/a0; } return a0; }
void fixbad (int niter /* number of iterations */, sf_filter aa /* PEF */, int ny /* data size */, float *yy /* in - data, out - deburst */) /*< find bad data and restore it >*/ { int iy; float *rr, *rabs, rbar; bool *known; rr = sf_floatalloc(ny); rabs = sf_floatalloc(ny); known = sf_boolalloc(ny); sf_helicon_init(aa); sf_helicon_lop (false,false,ny,ny,yy,rr); for (iy=0; iy < ny; iy++) rabs[iy] = fabsf (rr[iy]); rbar = sf_quantile(ny/2,ny,rabs); for (iy=0; iy < ny; iy++) known[iy] = (bool) ((yy[iy] > 0.) && (fabsf(rr[iy]) < 4. * rbar)); mis2 (niter, ny, yy, aa, known, 0., true); free(rr); free(rabs); free(known); }
void signoi_lop (bool adj, bool add, int n1, int n2, float *data, float *sign) /*< linear operator >*/ { sf_helicon_init (nn); sf_polydiv_init (nd, ss); sf_adjnull(adj,add,n1,n2,data,sign); sf_helicon_lop (false, false, n1, n1, data, dd); sf_solver_prec(sf_helicon_lop, sf_cgstep, sf_polydiv_lop, nd, nd, nd, sign, dd, niter, eps, "verb", verb, "end"); sf_cgstep_close(); nn++; ss++; }