|
|
|
|
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 |