Seismic Monitoring (dv/v) Workflow
SeisGo’s monitoring module measures relative seismic velocity changes (dv/v) from
ambient-noise cross-correlation functions using stretching or wavelet-based methods.
Overview
Velocity changes are detected by comparing individual cross-correlation windows (the current state) against a reference stack. A positive dv/v indicates the medium has sped up (e.g., from increased effective stress); a negative value indicates slowing.
CorrData (time series of xcorr windows)
│
▼
get_dvv()
│
┌─────┴──────┐
│ reference │ ← linear/pws/robust stack of all windows (or user-supplied)
└─────┬──────┘
│ stretch or wavelet transform each window vs. reference
▼
DvvData object
Basic usage
from seisgo import monitoring
dvvdata = monitoring.get_dvv(
corrdata, # CorrData object
freq=[0.1, 1.0], # frequency band for dv/v measurement (Hz)
win_len=50.0, # coda window length (s)
method="wts", # "wts" (wavelet) or "ts" (stretching)
dvmax=0.05, # search range: ±5%
vmin=1.0, # minimum group velocity to set start of coda window
offset=1.0, # extra offset from main arrival (s)
normalize=True,
)
Available methods (helpers.dvv_methods()):
Method |
Description |
|---|---|
|
Wavelet-transform stretching — frequency-dependent dv/v |
|
Time-domain stretching — single broadband dv/v value |
Reference trace options
By default the reference is computed by linearly stacking all windows in corrdata. You
can supply a custom reference:
import numpy as np
my_ref = np.mean(corrdata.data, axis=0)
dvvdata = monitoring.get_dvv(corrdata, freq=[0.1, 1.0], win_len=50,
ref=my_ref)
Temporal resolution (sub-stacking)
The resolution parameter controls temporal resampling before measurement. For example,
to measure dv/v on daily sub-stacks from hourly correlations:
dvvdata = monitoring.get_dvv(
corrdata,
freq=[0.1, 1.0],
win_len=50.0,
resolution=86400, # 1 day in seconds
stack_method="linear",
)
Multiple measurement windows
Pass lists to win_len and offset to measure at several coda windows simultaneously:
dvvdata = monitoring.get_dvv(
corrdata,
freq=[0.1, 1.0],
win_len=[30.0, 60.0],
offset=[1.0, 1.0],
)
Whitening before measurement
Apply spectral whitening to reduce contamination from strong spectral peaks:
dvvdata = monitoring.get_dvv(
corrdata,
freq=[0.1, 1.0],
win_len=50.0,
whiten="rma",
whiten_smooth=20,
whiten_pad=100,
)
Plotting and saving
# Plot the dv/v time series
dvvdata.plot()
# Save to ASDF
dvvdata.to_asdf("dvv_TA.A25A_TA.B25A.h5")
# Save to pickle
monitoring.get_dvv(..., save=True, outdir="./dvv_output", format="pickle")
Parallel processing
For large datasets with many correlation pairs, enable multi-processing:
dvvdata = monitoring.get_dvv(corrdata, freq=[0.1, 1.0], win_len=50,
nproc=8)