Moveout, velocity, and stacking

Next: COMMON-MIDPOINT STACKING Up: Moveout, velocity, and stacking Previous: Formal inversion

# THE NORMAL MOVEOUT MAPPING

Recall the traveltime equation ().
 (8) (9)

where is traveltime depth. This equation gives either time from a surface source to a receiver at depth , or it gives time to a surface receiver from an image source at depth .

A seismic trace is a signal recorded at some constant . We can convert the trace to a vertical propagation'' signal by stretching to . This process is called normal moveout correction'' (NMO). Typically we have many traces at different distances each of which theoretically produces the same hypothetical zero-offset trace. Figure 4.1 shows a marine shot profile before and after NMO correction at the water velocity. You can notice that the wave packet reflected from the ocean bottom is approximately a constant width on the raw data. After NMO, however, this waveform broadens considerably--a phenomenon known as NMO stretch."

stretch
Figure 1.
Marine data moved out with water velocity. Input on the left, output on the right.

The NMO transformation is representable as a square matrix. The matrix is a -plane containing all zeros except an interpolation operator centered along the hyperbola. The dots in the matrix below are zeros. The input signal is put into the vector . The output vector --i.e., the NMO'ed signal--is simply . In real life examples such as Figure 4.1 the subscript goes up to about one thousand instead of merely to ten.

 (10)

You can think of the matrix as having a horizontal -axis and a vertical -axis. The 1's in the matrix are arranged on the hyperbola . The transpose matrix defining some from gives synthetic data from the zero-offset (or stack) model , namely,

 (11)

A program for nearest-neighbor normal moveout as defined by equations (4.10) and (4.11) is nmo0(). Because of the limited alphabet of programming languages, I used the keystroke z to denote .

user/gee/nmo0.c
  for (iz=0; iz < n; iz++) { z = t0 + dt*iz; /* Travel-time depth */ xs= x * slow[iz]; t = hypotf(z,xs); /* Hypotenuse */ it = 0.5 + (t - t0) / dt; /* Round to nearest neighbor. */ if( it < n ) { if( adj ) zz[iz] += tt[it]; else tt[it] += zz[iz]; } } 
A program is a pull'' program if the loop creating the output covers each location in the output and gathers the input from wherever it may be. A program is a push'' program if it takes each input and pushes it to wherever it belongs. Thus this NMO program is a pull'' program for doing the model building (data processing), and it is a push'' program for the data building. You could write a program that worked the other way around, namely, a loop over with found by calculation . What is annoying is that if you want a push program going both ways, those two ways cannot be adjoint to one another.

Normal moveout is a linear operation. This means that data can be decomposed into any two parts, early and late, high frequency and low, smooth and rough, steep and shallow dip, etc.; and whether the two parts are NMO'ed either separately or together, the result is the same. The reason normal moveout is a linear operation is that we have shown it is effectively a matrix multiply operation and that operation fulfills .

 Moveout, velocity, and stacking

Next: COMMON-MIDPOINT STACKING Up: Moveout, velocity, and stacking Previous: Formal inversion

2009-03-16