Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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++;
}