dispersion_phase_shift

function of dascore.transform.dispersion source

dispersion_phase_shift(
    patch: Patch ,
    phase_velocities: collections.abc.Sequence[float] ,
    approx_resolution: None | float[None, float] = None,
    approx_freq: None | tuple[None, tuple[float, float]] = None,
)-> ‘PatchType’

Compute dispersion images using the phase-shift method.

Parameters

Parameter Description
patch Patch to transform. Has to have dimensions of time and distance.
It also needs to be right-sided (see notes below).
phase_velocities NumPY array of positive velocities, monotonically increasing, for
which the dispersion will be computed.
approx_resolution Approximated frequency (Hz) resolution for the output. If left empty,
the frequency resolution is dictated by the number of samples.
approx_freq Minimum and maximum frequency to compute dispersion for, in Hz
If left empty, minimum is 0 Hz, and maximum is Nyquist
Note
  • See also Park, Miller, and Xia ()

  • Inspired by https://geophydog.cool/post/masw_phase_shift/.

  • Dims/Units of the output are forced to be ‘frequency’ (‘Hz’) and ‘velocity’ (‘m/s’).

  • The patch’s distance coordinates are assumed to be ordered by distance from the source, and not “fiber distance”. In other words, data are effectively mapped along a 2-D line.

  • The input shot gather must be right-sided meaning the wavefield propagates from lower to higher channel numbers. Always plot the patch first to verify its orientation. If the gather is left-sided, simply mirror the patch along the distance axis (see Example 2 below).

Examples

import dascore as dc
import numpy as np

# Example 1 - Right-sided wavefield
patch = (
    dc.get_example_patch('dispersion_event')
)

disp_patch = patch.dispersion_phase_shift(np.arange(100,1500,1),
            approx_resolution=0.1,approx_freq=[5,70])
ax = disp_patch.viz.waterfall(show=False,cmap=None)
ax.set_xlim(5, 70)
ax.set_ylim(1500, 100)
disp_patch.viz.waterfall(show=True, ax=ax)

# Example 2 - Left-sided wavefield
patch = (
    dc.get_example_patch('dispersion_event')
)
axis = patch.dims.index("distance")
flipped_data = np.flip(patch.data, axis=axis)
mirrored_patch = patch.update(data=flipped_data)

disp_patch = mirrored_patch.dispersion_phase_shift(np.arange(100,1500,1),
        approx_resolution=0.1,approx_freq=[5,70])

```

References

Park, Choon Byong, Richard D Miller, and Jianghai Xia. 1998. “Imaging Dispersion Curves of Surface Waves on Multi-Channel Record.” In SEG Technical Program Expanded Abstracts 1998, 1377–80. Society of Exploration Geophysicists.