next up previous print clean
Next: Crossing traveltime curves Up: Moveout, velocity, and stacking Previous: THE NORMAL MOVEOUT MAPPING

COMMON-MIDPOINT STACKING

Typically, many receivers record every shot, and there are many shots over the reflectors of interest. It is common practice to define the midpoint y =(xs+xg)/2 and then to sort the seismic traces into ``common-midpoint gathers''. After sorting, each trace on a common-midpoint gather can be transformed by NMO into an equivalent zero-offset trace and the traces in the gather can all be added together. This is often called ``common-depth-point (CDP) stacking'' or, more correctly, ``common-midpoint stacking''.

The adjoint to this operation is to begin from a model that is identical to the zero-offset trace and spray this trace to all offsets. There is no ``official'' definition of which operator of an operator pair is the operator itself and which is the adjoint. On the one hand, I like to think of the modeling operation itself as the operator. On the other hand, the industry machinery keeps churning away at many processes that have well-known names, so people often think of one of them as the operator. Industrial data-processing operators are typically adjoints to modeling operators.

Figure 2 illustrates the operator pair, consisting of spraying out a zero-offset trace (the model) to all offsets and the adjoint of the spraying, which is stacking. The moveout and stack operations are in subroutine stack0().  

subroutine stack0( adj, add, slow,     t0,dt, x0,dx, nt,nx, stack, gather)
integer ix,        adj, add,                         nt,nx
real     x,                  slow(nt), t0,dt, x0,dx,   stack(nt), gather(nt,nx)
call adjnull(      adj, add,                           stack,nt,  gather,nt*nx)
do ix= 1, nx {
        x = x0 + dx * (ix-1)
        call nmo0( adj, 1, slow, x, t0,dt, nt, stack, gather(1,ix))
        }
return; end
Let $\bold S'$ denote NMO, and let the stack be defined by invoking stack0() with the adj=1 argument. Then $\bold S$ is the modeling operation defined by invoking stack0() with the adj=0 argument. Figure 2 illustrates both.

 
stack
Figure 2
Top is a model trace $\bold m$. Center shows the spraying to synthetic traces, $\bold S' \bold m$. Bottom is the stack of the synthetic data, ${\bf S S' m}$.

stack
view burn build edit restore

Notice the roughness on the waveforms caused by different numbers of points landing in one place. Notice also the increase of AVO (amplitude versus offset) as the waveform gets compressed into a smaller space. Finally, notice that the stack is a little rough, but the energy is all in the desired time window.

We notice a contradiction of aspirations. On the one hand, an operator has smooth outputs if it ``loops over output space'' and finds its input where ever it may. On the other hand, it is nice to have modeling and processing be exact adjoints of each other. Unfortunately, we cannot have both. If you loop over the output space of an operator, then the adjoint operator has a loop over input space and a consequent roughness of its output.



 
next up previous print clean
Next: Crossing traveltime curves Up: Moveout, velocity, and stacking Previous: THE NORMAL MOVEOUT MAPPING
Stanford Exploration Project
12/26/2000