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++); } }
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; }
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; }
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); }
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