Exemplo n.º 1
0
void addsinc (float time, float amp,
	int nt, float dt, float ft, float *trace)
/*****************************************************************************
Add sinc wavelet to trace at specified time and with specified amplitude
******************************************************************************
Input:
time		time at which to center sinc wavelet
amp		peak amplitude of sinc wavelet
nt		number of time samples
dt		time sampling interval
ft		first time sample
trace		array[nt] containing sample values

Output:
trace		array[nt] with sinc added to sample values
*****************************************************************************/
{
	static float sinc[101][8];
	static int nsinc=101,madesinc=0;
	int jsinc;
	float frac;
	int itlo,ithi,it,jt;
	float tn,*psinc;

	/* if not made sinc coefficients, make them */
	if (!madesinc) {
		for (jsinc=1; jsinc<nsinc-1; ++jsinc) {
			frac = (float)jsinc/(float)(nsinc-1);
			mksinc(frac,8,sinc[jsinc]);
		}
		for (jsinc=0; jsinc<8; ++jsinc)
			sinc[0][jsinc] = sinc[nsinc-1][jsinc] = 0.0;
		sinc[0][3] = 1.0;
		sinc[nsinc-1][4] = 1.0;
		madesinc = 1;
	}
	tn = (time-ft)/dt;
	jt = tn;
	jsinc = (tn-jt)*(nsinc-1);
	itlo = jt-3;
	ithi = jt+4;
	if (itlo>=0 && ithi<nt) {
		psinc = sinc[jsinc];
		trace[itlo] += amp*psinc[0];
		trace[itlo+1] += amp*psinc[1];
		trace[itlo+2] += amp*psinc[2];
		trace[itlo+3] += amp*psinc[3];
		trace[itlo+4] += amp*psinc[4];
		trace[itlo+5] += amp*psinc[5];
		trace[itlo+6] += amp*psinc[6];
		trace[itlo+7] += amp*psinc[7];
	} else if (ithi>=0 && itlo<nt) {
		if (itlo<0) itlo = 0;
		if (ithi>=nt) ithi = nt-1;
		psinc = sinc[jsinc]+itlo-jt+3;
		for (it=itlo; it<=ithi; ++it)
			trace[it] += amp*(*psinc++);
	}
}
Exemplo n.º 2
0
struct shot_image_par_type shot_image_grab_par(void)
/*< initialize >*/
{
    struct shot_image_par_type image_par;
    float min_x,max_x,min_y,max_y;
    int nhx,nhy,ihx;
    if (!sf_getint("nhx",&nhx) ) nhx=1;
    if (!sf_getint("nhy",&nhy) ) nhy=1;
    if (!sf_getfloat("image_min_x",&min_x)) min_x=1000.0;
    if (!sf_getfloat("image_max_x",&max_x)) max_x=10000.0;
    if (!sf_getfloat("image_min_y",&min_y)) min_y=0.0;
    if (!sf_getfloat("image_max_y",&max_y)) max_y=0.0;
    image_par.nhx=nhx; image_par.nhy=nhy;
    image_par.min_x=min_x; image_par.max_x=max_x;
    image_par.min_y=min_y; image_par.max_y=max_y;
    image_par.sincx_table=sf_floatalloc(8*2001);
    for(ihx=0;ihx<2001;ihx++) mksinc((float)(ihx)*0.0005,8,image_par.sincx_table+ihx*8); 
    sf_warning("Image: minx=%f  maxx=%f\n",image_par.min_x,image_par.max_x);
    return image_par; 
}
Exemplo n.º 3
0
struct shot_rotate_par_type shot_rotate_init(float rotate_angle,int nx,int nz,float dx, float dz)
/*< initialize >*/
{
    struct shot_rotate_par_type rotate_par;
    float x,z,wx;
    int i,tmpn;
    rotate_par.nx=nx; rotate_par.dx=dx; rotate_par.dz=dz; rotate_par.nz=nz;
    rotate_par.rotate_angle=rotate_angle; 
    if( 0.0==rotate_angle){
	rotate_par.nx_rotate=kissfftn(nx); rotate_par.nz_rotate=nz; rotate_par.ny_rotate=1;
	rotate_par.nz_s_rotate=1;  rotate_par.ix_rotate_center=0;
    }
    else{
	rotate_par.nz_rotate=((nz-1)*dz*cos(fabs(rotate_angle))+(nx-1)*dx*sin(fabs(rotate_angle)))/dz+1;
	rotate_par.ix_rotate_center=((nz-1)*dz*sin(fabs(rotate_angle))-0.0)/dx;
	tmpn=((nx-1)*dx*cos(fabs(rotate_angle)))/dx+1; 
	//printf("rororotate=%d, nx=%d,center=%d\n",tmpn,nx,rotate_par.ix_rotate_center);
	rotate_par.nx_rotate=kissfftn( ((nx-1)*dx*cosf(fabsf(rotate_angle)))/dx+rotate_par.ix_rotate_center+1);
	rotate_par.nz_s_rotate=((nx-1)*dx*sinf(fabsf(rotate_angle)))/dz+1;
	rotate_par.ny_rotate=1;
    
    
	x=(float)(rotate_par.ix_rotate_center)*dx; z=x*fabs(cos(rotate_par.rotate_angle)/sin(rotate_par.rotate_angle));
	rotate_par.nz_left=(int)(z/dz)+1; rotate_par.nz_right=rotate_par.nz_rotate-rotate_par.nz_left;
    }
    rotate_par.Nsinc=2000;
    rotate_par.sinc=sf_floatalloc(8*(rotate_par.Nsinc+1));
  
    for (i=0;i<=rotate_par.Nsinc;i++){
	wx=(float)(i)*1.0/(float)rotate_par.Nsinc;
	mksinc(wx,8,rotate_par.sinc+8*i); 
    }/*
       for (i=0;i<rotate_par.Nsinc;i++){
       printf("%d\n",i);
       for(j=0;j<8;j++) printf(" %f ",*(rotate_par.sinc+8*i+j));
       printf("\n");
       }*/
    return rotate_par;
}
Exemplo n.º 4
0
void shot_image_sinc_table(struct shot_image_par_type *image_par){
    int ihx;
    float *sincx_table=image_par->sincx_table;
    image_par->sincx_table=sf_floatalloc(8*2001);
    for(ihx=0;ihx<2001;ihx++) mksinc((float)(ihx)*0.0005,8,sincx_table+ihx*8);
}
Exemplo n.º 5
0
void shot_rotate_data_rotate(sf_complex * z0_s,sf_complex * z0_s_rotate,struct shot_rotate_par_type *rotate_par)
/*< rotation >*/
{
    float rotate_angle,cos_rotate_angle,sin_rotate_angle,dx,dz;
    int nx,nx_rotate,nz_rotate,nz_s_rotate,ix_rotate_center;

    int  ix,ix_rotate,iz_rotate,i_ix_rotate,i_iz_rotate;
    float x,x_rotate,z_rotate,wx_rotate,wz_rotate;
    float  sincx[16],sincz[16];
    sf_complex *z0_s_smooth;
    int nd; float ddx;
    int ix_fin_rotate,iz_fin_rotate;
    float dwx;

    rotate_angle=rotate_par->rotate_angle;
    dx=rotate_par->dx; dz=rotate_par->dz; nx=rotate_par->nx; 
    nx_rotate=rotate_par->nx_rotate; nz_rotate=rotate_par->nz_rotate; 
    nz_s_rotate=rotate_par->nz_s_rotate;
    ix_rotate_center=rotate_par->ix_rotate_center;
    cos_rotate_angle=cos(fabs(rotate_angle)); sin_rotate_angle=sin(fabs(rotate_angle));
  
    nd=16; 
    ddx=dx/(float)(nd);
    z0_s_smooth=sf_complexalloc(nd*nx);

    vector_value_c(z0_s_smooth,sf_cmplx(0.0,0.0),nd*nx);
    dwx=1.0/(float)(rotate_par->Nsinc);
    for(ix=0;ix<nd*nx;ix++){
	wx_rotate=(float)(ix%nd)/(float)(nd);
	ix_rotate=ix/nd;
	//printf("ix=%d,ixrotate=%d\n",ix,ix_rotate);
    
	//if (wx_rotate < 0) wx_rotate=1+wx_rotate;
	//iwx=(int)(wx_rotate/dwx); wwx=wx_rotate/dwx-(float)iwx; i0sinc=rotate_par->sinc+8*iwx; i1sinc=i0sinc+8; 
	//for(i_ix_rotate=0;i_ix_rotate<8;i_ix_rotate++) 
	//  sincx[i_ix_rotate]=(1-wwx)*i0sinc[i_ix_rotate]+wwx*i1sinc[i_ix_rotate];
	wx_rotate=0.0; 
	mksinc(wx_rotate,16,sincx);
	//printf("ix=%d\n",ix);
	//for(i_ix_rotate=0;i_ix_rotate<16;i_ix_rotate++)
	//  printf("%f  ",sincx[i_ix_rotate]);
	//printf("\n");
	//printf("ix=%d\n",ix);
	for(i_ix_rotate=1;i_ix_rotate<=16;i_ix_rotate++){
	    if (ix_rotate-8+i_ix_rotate >=0 && ix_rotate-8+i_ix_rotate <nx ){ 
		z0_s_smooth[ix]+=z0_s[ix_rotate-8+i_ix_rotate]*sincx[i_ix_rotate-1];
		//printf("ix=%d,r=%f  ",ix_rotate-8+i_ix_rotate, sincx[i_ix_rotate-1]);
	    }
	}  //for(i_ix_rotate=0;i_ix_rotate<8;i_ix_rotate++)
	//printf("\n");
    }// for(ix=0;ix<nd*nx;ix++)
    //printf("max1=%f\n",maxvalc(z0_s_smooth,nd*nx));
    vector_value_c(z0_s_rotate,sf_cmplx(0.0,0.0),nx_rotate*nz_s_rotate);
    for(ix=0;ix<nx*nd;ix++){
	if (rotate_angle >=0 )  x=(float)(ix)*ddx;
	else x=(float)(nx*nd-1-ix)*ddx;
	x_rotate=x*cos_rotate_angle; z_rotate=x*sin_rotate_angle;
	ix_rotate=(int)((x_rotate-0.0)/dx);iz_rotate=(int)((z_rotate-0.0)/dz);
	wx_rotate=(x_rotate-(float)(ix_rotate)*dx)/dx;
	wz_rotate=(z_rotate-(float)(iz_rotate)*dz)/dz;
	//printf("ix=%d,xr=%f,zr=%f,ixr=%d,izr=%d\n",ix,wx_rotate,wz_rotate,ix_rotate,iz_rotate);
    
	//if (wx_rotate < 0) wx_rotate=1+wx_rotate; if (wz_rotate < 0) wz_rotate=1+wz_rotate;
	//iwx=(int)(wx_rotate/dwx); wwx=wx_rotate/dwx-(float)iwx; i0sinc=rotate_par->sinc+8*iwx; i1sinc=i0sinc+8; 
	//for(i_ix_rotate=0;i_ix_rotate<8;i_ix_rotate++) 
	//  sincx[i_ix_rotate]=(1-wwx)*i0sinc[i_ix_rotate]+wwx*i1sinc[i_ix_rotate];
	//iwx=(int)(wz_rotate/dwx); wwx=wz_rotate/dwx-(float)iwx; i0sinc=rotate_par->sinc+8*iwx; i1sinc=i0sinc+8;
	//for(i_ix_rotate=0;i_ix_rotate<8;i_ix_rotate++) 
	//  sincz[i_ix_rotate]=(1-wwx)*i0sinc[i_ix_rotate]+wwx*i1sinc[i_ix_rotate];   
 
	mksinc(wx_rotate,16,sincx); 
	mksinc(wz_rotate,16,sincz);
	for( i_ix_rotate=1; i_ix_rotate<=16;i_ix_rotate++){
	    ix_fin_rotate=ix_rotate-8+i_ix_rotate+ix_rotate_center; 
	    if (ix_fin_rotate >=0 && ix_fin_rotate <nx_rotate){
		for(i_iz_rotate=1;i_iz_rotate<=16;i_iz_rotate++){
		    iz_fin_rotate=iz_rotate-8+i_iz_rotate;
		    if (iz_fin_rotate >=0 && iz_fin_rotate <nz_s_rotate) 
			z0_s_rotate[i2(iz_fin_rotate,ix_fin_rotate,nx_rotate)]+=
			    z0_s_smooth[ix]*sincx[i_ix_rotate-1]*sincz[i_iz_rotate-1];
		}//for(i_iz_rotate=1;i_iz_rotate<=8;i_iz_rotate++)
	    }
	}//for( i_ix_rotate=1; i_ix_rotate<=8;i_ix_rotate++)

    }//for(ix=0;ix<nx*nd;ix++)
    //printf("max1=%f\n",maxvalc(z0_s_rotate,rotate_par->nz_s_rotate*rotate_par->nx_rotate));

  
    free(z0_s_smooth);
} // shot_rotate_data_rotate