Basic operators and adjoints |
Normal-moveout correction is a geometrical correction of reflection seismic data that stretches the time axis so that data recorded at nonzero separation of shot and receiver, after stretching, appears to be at . NMO correction is roughly like time-to-depth conversion with the equation . After the data at is stretched from to , it should look like stretched data from any other (assuming these are plane horizontal reflectors, etc.). In practice, is not used; rather, traveltime depth is used, where ; so . (Because of the limited alphabet of programming languages, I often use the keystroke z to denote .)
Typically, many receivers record each shot. Each seismogram can be transformed by NMO and the results all added. The whole process is called ``NMO stacking.'' The adjoint to this operation is to begin from a model that ideally is the zero-offset trace, and spray this model to all offsets. From a matrix viewpoint, stacking is like a row vector of NMO operators, and modeling is like a column. An example is shown in Figure 8.
cunha
Figure 8. Hypothetical model, synthetic data, and model image. | |
---|---|
A module that does reverse moveout is hypotenusei. Given a zero-offset trace, it makes another at nonzero offset. The adjoint does the usual normal moveout correction.
void hypotenusei_set(float t0 /* time origin */, float dt /* time sampling */, float xs /* offset times slowness */) /*< set up >*/ { int it; float t, z2; for (it=0; it < nt; it++) { t = t0 + dt*it; z2 = t * t - xs * xs; iz[it] = ( z2 >= 0.)? 0.5 + (sqrtf(z2) - t0) /dt: -1; } } void hypotenusei_lop(bool adj, bool add, int n1, int n2, float *zz, float *tt) /*< linear operator >*/ { int it; sf_adjnull(adj,add,n1,n2,zz,tt); for (it=0; it < nt; it++) { if (iz[it] < 0) continue; if (adj) zz[iz[it]] += tt[it]; else tt[it] += zz[iz[it]]; } } |
void imospray_lop(bool adj, bool add, int n1, int n2, float *stack, float *gather) /*< linear operator >*/ { int ix; float x; sf_adjnull(adj,add,n1,n2,stack,gather); for (ix=0; ix < nx; ix++) { x = x0 + dx*ix; hypotenusei_set (t0, dt, x); hypotenusei_lop (adj, true, nt, nt, stack, gather+ix*nt); } } |
Basic operators and adjoints |