MsPASS C++ API  2.4.1.dev4+g92330b7a
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
Public Member Functions | List of all members
mspass::algorithms::deconvolution::NoiseStableDecon Class Reference

Noise-aware stable FFT inverse used by NS-GID. More...

#include <NoiseStableDecon.h>

Inheritance diagram for mspass::algorithms::deconvolution::NoiseStableDecon:
Inheritance graph
[legend]
Collaboration diagram for mspass::algorithms::deconvolution::NoiseStableDecon:
Collaboration graph
[legend]

Public Member Functions

 NoiseStableDecon (const mspass::utility::Metadata &md)
 Construct from metadata defining FFT and NS-GID parameters.
 
 NoiseStableDecon (const mspass::utility::Metadata &md, const std::vector< double > &wavelet, const std::vector< double > &data)
 Construct and load wavelet and data vectors.
 
void changeparameter (const mspass::utility::Metadata &md)
 Update operator parameters from a Metadata container.
 
void process ()
 Compute the noise-stable inverse filter and result.
 
void loadnoise (const std::vector< double > &noise)
 Load a noise waveform used to form frequency-dependent damping.
 
void loadnoise (const mspass::seismic::CoreTimeSeries &noise)
 Load a noise waveform from a core time series.
 
void loadnoise (const mspass::seismic::PowerSpectrum &noise_spectrum)
 Load a precomputed noise power spectrum.
 
mspass::seismic::CoreTimeSeries actual_output ()
 Return the actual output of the deconvolution operator.
 
mspass::seismic::CoreTimeSeries inverse_wavelet (const double t0parent)
 Return the inverse filter impulse response.
 
mspass::seismic::CoreTimeSeries inverse_wavelet ()
 Return a FIR represention of the inverse filter.
 
mspass::utility::Metadata QCMetrics ()
 Return appropriate quality measures.
 
double max_gain () const
 
double gain_cap () const
 
- Public Member Functions inherited from mspass::algorithms::deconvolution::FFTDeconOperator
 FFTDeconOperator ()
 Construct an empty FFT operator shell.
 
 FFTDeconOperator (const mspass::utility::Metadata &md)
 Construct from deconvolution Metadata.
 
 FFTDeconOperator (const FFTDeconOperator &parent)
 Copy constructor.
 
 ~FFTDeconOperator ()
 Release allocated GSL FFT work objects.
 
FFTDeconOperatoroperator= (const FFTDeconOperator &parent)
 Assign FFT size and lag shift from another operator.
 
void changeparameter (const mspass::utility::Metadata &md)
 Reconfigure the FFT operator from Metadata.
 
void change_size (const int nfft_new)
 Change the FFT work-buffer length.
 
void change_shift (const int shift)
 Set the sample offset used to unwrap deconvolution lag windows.
 
int get_size ()
 Return the current FFT work-buffer length.
 
int get_shift ()
 Return the current deconvolution lag-window sample shift.
 
int operator_size ()
 Return the current FFT work-buffer length.
 
int operator_shift ()
 Return the current deconvolution lag-window sample shift.
 
double df (const double dt)
 Return frequency spacing for the current FFT length.
 
mspass::seismic::CoreTimeSeries FourierInverse (const ComplexArray &winv, const ComplexArray &sw, const double dt, const double t0parent)
 Return inverse wavelet for Fourier methods.
 
- Public Member Functions inherited from mspass::algorithms::deconvolution::ScalarDecon
 ScalarDecon ()
 Construct an empty scalar deconvolution operator.
 
 ScalarDecon (const mspass::utility::Metadata &md)
 Construct from Metadata.
 
 ScalarDecon (const std::vector< double > &d, const std::vector< double > &w)
 Construct with loaded data and source-wavelet vectors.
 
 ScalarDecon (const ScalarDecon &parent)
 Copy constructor preserving loaded vectors and shaping wavelet.
 
int load (const std::vector< double > &wavelet, const std::vector< double > &data)
 Load all data required for decon.
 
int loaddata (const std::vector< double > &data)
 
int loadwavelet (const std::vector< double > &wavelet)
 
ScalarDeconoperator= (const ScalarDecon &parent)
 Assign loaded wavelet, data, and result vectors from parent.
 
std::vector< double > getresult ()
 Return the current deconvolution result vector.
 
void changeparameter (const mspass::utility::Metadata &md)
 
void change_shaping_wavelet (const ShapingWavelet &nsw)
 
ShapingWavelet get_shaping_wavelet () const
 
virtual mspass::seismic::CoreTimeSeries output_shaping_wavelet ()
 Return the output shaping wavelet.
 
mspass::seismic::CoreTimeSeries ideal_output ()
 Legacy alias for output_shaping_wavelet.
 
mspass::seismic::CoreTimeSeries resolution_kernel ()
 Alias for actual_output using inverse-theory terminology.
 
- Public Member Functions inherited from mspass::algorithms::deconvolution::BasicDeconOperator
virtual ~BasicDeconOperator ()
 

Additional Inherited Members

- Protected Member Functions inherited from mspass::algorithms::deconvolution::ScalarDecon
mspass::utility::Metadata BasicQCMetrics (const std::string &operator_name, const bool processed)
 Build QC Metadata fields common to scalar deconvolution operators.
 
- Protected Attributes inherited from mspass::algorithms::deconvolution::FFTDeconOperator
int nfft
 Current FFT work-buffer length in samples.
 
int sample_shift
 Sample offset used to place zero lag in deconvolution outputs.
 
gsl_fft_complex_wavetable * wavetable
 GSL factorization table allocated for nfft.
 
gsl_fft_complex_workspace * workspace
 GSL scratch workspace allocated for nfft.
 
ComplexArray winv
 Frequency-domain inverse wavelet coefficients for derived operators.
 
- Protected Attributes inherited from mspass::algorithms::deconvolution::ScalarDecon
std::vector< double > data
 Data vector to be deconvolved by concrete scalar methods.
 
std::vector< double > wavelet
 Source-wavelet estimate used by concrete scalar methods.
 
std::vector< double > result
 Deconvolved output vector produced by process.
 
ShapingWavelet shapingwavelet
 Output shaping wavelet applied by scalar deconvolution methods.
 

Detailed Description

Noise-aware stable FFT inverse used by NS-GID.

This scalar operator computes

G(f)=B(f) conj(S(f))/(|S(f)|^2 + mu(f))

with frequency-dependent damping from an optional noise spectrum and an explicit gain cap. The minimum damping parameter is scaled by peak wavelet spectral power. It is intended as the inverse operator used to form the GID peak-picking function. As a standalone scalar deconvolution operator it applies one stable inverse filter and returns the finite-bandwidth result; it does not run sparse iteration and does not apply the GID output shaping wavelet.

Constructor & Destructor Documentation

◆ NoiseStableDecon() [1/3]

mspass::algorithms::deconvolution::NoiseStableDecon::NoiseStableDecon ( )
34 : FFTDeconOperator(), ScalarDecon(), mu_min(3.0e-3), alpha(1.0),
35 noise_floor(1.0e-12), gain_max(1.0e3), snr_taper_low(1.0),
36 snr_taper_high(3.0), use_reliability_taper(false),
37 noise_vector_loaded(false), noise_spectrum_loaded(false),
38 processed(false), max_gain_actual(0.0), noise_amplification(0.0),
39 effective_bandwidth_fraction(0.0) {}
FFTDeconOperator()
Construct an empty FFT operator shell.
Definition FFTDeconOperator.cc:13
ScalarDecon()
Construct an empty scalar deconvolution operator.
Definition ScalarDecon.h:33

◆ NoiseStableDecon() [2/3]

mspass::algorithms::deconvolution::NoiseStableDecon::NoiseStableDecon ( const mspass::utility::Metadata md)

Construct from metadata defining FFT and NS-GID parameters.

Parameters
mdmetadata containing FFT sizing, shaping-wavelet, and noise-stable inverse parameters.
42 : FFTDeconOperator(md), noise_vector_loaded(false),
43 noise_spectrum_loaded(false), processed(false) {
44 this->read_metadata(md);
45}

◆ NoiseStableDecon() [3/3]

mspass::algorithms::deconvolution::NoiseStableDecon::NoiseStableDecon ( const mspass::utility::Metadata md,
const std::vector< double > &  wavelet,
const std::vector< double > &  data 
)

Construct and load wavelet and data vectors.

Parameters
mdmetadata containing FFT sizing, shaping-wavelet, and noise-stable inverse parameters.
waveletsource wavelet samples.
datadata samples to deconvolve with the source wavelet.
50 : FFTDeconOperator(md), noise_vector_loaded(false),
51 noise_spectrum_loaded(false), processed(false) {
52 this->read_metadata(md);
53 this->wavelet = wavelet;
54 this->data = data;
55}
std::vector< double > data
Data vector to be deconvolved by concrete scalar methods.
Definition ScalarDecon.h:140
std::vector< double > wavelet
Source-wavelet estimate used by concrete scalar methods.
Definition ScalarDecon.h:142

References mspass::algorithms::deconvolution::ScalarDecon::data, and mspass::algorithms::deconvolution::ScalarDecon::wavelet.

Member Function Documentation

◆ actual_output()

CoreTimeSeries mspass::algorithms::deconvolution::NoiseStableDecon::actual_output ( )
virtual

Return the actual output of the deconvolution operator.

The actual output is defined as w^-1*w and is compable to resolution kernels in linear inverse theory. Although not required we would normally expect this function to be peaked at 0. Offsets from 0 would imply a bias.

Implements mspass::algorithms::deconvolution::ScalarDecon.

240 {
241 if (!processed || winv.size() <= 0)
242 throw MsPASSError(
243 "NoiseStableDecon::actual_output: process must be called first",
244 ErrorSeverity::Invalid);
245 vector<double> wavelet_padded(wavelet);
246 if (wavelet_padded.size() < nfft)
247 wavelet_padded.resize(nfft, 0.0);
248 ComplexArray W(nfft, &(wavelet_padded[0]));
249 gsl_fft_complex_forward(W.ptr(), 1, nfft, wavetable, workspace);
250 ComplexArray ao_fft = winv * W;
251 gsl_fft_complex_inverse(ao_fft.ptr(), 1, nfft, wavetable, workspace);
252 vector<double> ao;
253 ao.reserve(nfft);
254 for (int k = 0; k < ao_fft.size(); ++k)
255 ao.push_back(ao_fft[k].real());
256 int i0 = nfft / 2;
257 ao = circular_shift(ao, i0);
258 CoreTimeSeries result(nfft);
259 double dt = shapingwavelet.sample_interval();
260 result.set_t0(-dt * static_cast<double>(i0));
261 result.set_dt(dt);
262 result.set_live();
263 result.set_npts(nfft);
264 result.set_tref(TimeReferenceType::Relative);
265 for (int k = 0; k < nfft; ++k)
266 result.s[k] = ao[k];
267 result.s = normalize<double>(result.s);
268 return result;
269}
int size() const
Definition ComplexArray.cc:275
gsl_fft_complex_workspace * workspace
GSL scratch workspace allocated for nfft.
Definition FFTDeconOperator.h:101
gsl_fft_complex_wavetable * wavetable
GSL factorization table allocated for nfft.
Definition FFTDeconOperator.h:99
ComplexArray winv
Frequency-domain inverse wavelet coefficients for derived operators.
Definition FFTDeconOperator.h:103
int nfft
Current FFT work-buffer length in samples.
Definition FFTDeconOperator.h:95
std::vector< double > result
Deconvolved output vector produced by process.
Definition ScalarDecon.h:144
ShapingWavelet shapingwavelet
Output shaping wavelet applied by scalar deconvolution methods.
Definition ScalarDecon.h:146
double sample_interval()
Definition ShapingWavelet.h:86

References mspass::algorithms::deconvolution::FFTDeconOperator::nfft, mspass::algorithms::deconvolution::ComplexArray::ptr(), mspass::algorithms::deconvolution::ScalarDecon::result, mspass::algorithms::deconvolution::ShapingWavelet::sample_interval(), mspass::algorithms::deconvolution::ScalarDecon::shapingwavelet, mspass::algorithms::deconvolution::ComplexArray::size(), mspass::algorithms::deconvolution::ScalarDecon::wavelet, mspass::algorithms::deconvolution::FFTDeconOperator::wavetable, mspass::algorithms::deconvolution::FFTDeconOperator::winv, and mspass::algorithms::deconvolution::FFTDeconOperator::workspace.

◆ changeparameter()

void mspass::algorithms::deconvolution::NoiseStableDecon::changeparameter ( const mspass::utility::Metadata md)
virtual

Update operator parameters from a Metadata container.

Implements mspass::algorithms::deconvolution::BasicDeconOperator.

99 {
100 this->read_metadata(md);
101 result.clear();
102 winv = ComplexArray();
103 processed = false;
104}

References mspass::algorithms::deconvolution::ScalarDecon::result, and mspass::algorithms::deconvolution::FFTDeconOperator::winv.

◆ gain_cap()

double mspass::algorithms::deconvolution::NoiseStableDecon::gain_cap ( ) const
inline

Return the configured hard cap on inverse-filter gain.

79{ return gain_max; }

◆ inverse_wavelet() [1/2]

CoreTimeSeries mspass::algorithms::deconvolution::NoiseStableDecon::inverse_wavelet ( )
virtual

Return a FIR represention of the inverse filter.

After any deconvolution is computed one can sometimes produce a finite impulse response (FIR) respresentation of the inverse filter.

Implements mspass::algorithms::deconvolution::ScalarDecon.

286 {
287 return this->inverse_wavelet(0.0);
288}
mspass::seismic::CoreTimeSeries inverse_wavelet()
Return a FIR represention of the inverse filter.
Definition NoiseStableDecon.cc:286

References inverse_wavelet().

◆ inverse_wavelet() [2/2]

CoreTimeSeries mspass::algorithms::deconvolution::NoiseStableDecon::inverse_wavelet ( const double  t0parent)
virtual

Return the inverse filter impulse response.

Parameters
t0parentparent waveform start time used to set the output time standard.

Implements mspass::algorithms::deconvolution::ScalarDecon.

271 {
272 if (!processed || winv.size() <= 0)
273 throw MsPASSError(
274 "NoiseStableDecon::inverse_wavelet: process must be called first",
275 ErrorSeverity::Invalid);
276 double dt = shapingwavelet.sample_interval();
277 ComplexArray no_shaping(nfft);
278 for (int k = 0; k < nfft; ++k) {
279 double *ptr = no_shaping.ptr(k);
280 ptr[0] = 1.0;
281 ptr[1] = 0.0;
282 }
283 return this->FourierInverse(winv, no_shaping, dt, t0parent);
284}
mspass::seismic::CoreTimeSeries FourierInverse(const ComplexArray &winv, const ComplexArray &sw, const double dt, const double t0parent)
Return inverse wavelet for Fourier methods.
Definition FFTDeconOperator.cc:144

References mspass::algorithms::deconvolution::FFTDeconOperator::FourierInverse(), mspass::algorithms::deconvolution::FFTDeconOperator::nfft, mspass::algorithms::deconvolution::ComplexArray::ptr(), mspass::algorithms::deconvolution::ShapingWavelet::sample_interval(), mspass::algorithms::deconvolution::ScalarDecon::shapingwavelet, mspass::algorithms::deconvolution::ComplexArray::size(), and mspass::algorithms::deconvolution::FFTDeconOperator::winv.

◆ loadnoise() [1/3]

void mspass::algorithms::deconvolution::NoiseStableDecon::loadnoise ( const mspass::seismic::CoreTimeSeries noise)

Load a noise waveform from a core time series.

Parameters
noisescalar noise time series.
119 {
120 this->loadnoise(noise_in.s);
121}
void loadnoise(const std::vector< double > &noise)
Load a noise waveform used to form frequency-dependent damping.
Definition NoiseStableDecon.cc:106

References loadnoise(), and mspass::seismic::CoreTimeSeries::s.

◆ loadnoise() [2/3]

void mspass::algorithms::deconvolution::NoiseStableDecon::loadnoise ( const mspass::seismic::PowerSpectrum noise_spectrum)

Load a precomputed noise power spectrum.

Parameters
noise_spectrumspectrum that covers DC and describes noise power.
123 {
124 ValidatePowerSpectrumCoversDC(noise_spectrum_in,
125 "NoiseStableDecon::loadnoise");
126 noise_spectrum = noise_spectrum_in;
127 noise_spectrum_loaded = true;
128 noise_vector_loaded = false;
129 result.clear();
130 winv = ComplexArray();
131 processed = false;
132}

References mspass::algorithms::deconvolution::ScalarDecon::result, and mspass::algorithms::deconvolution::FFTDeconOperator::winv.

◆ loadnoise() [3/3]

void mspass::algorithms::deconvolution::NoiseStableDecon::loadnoise ( const std::vector< double > &  noise)

Load a noise waveform used to form frequency-dependent damping.

Parameters
noisescalar noise samples.
106 {
107 if (noise.empty())
108 throw MsPASSError("NoiseStableDecon::loadnoise: noise vector cannot be "
109 "empty",
110 ErrorSeverity::Invalid);
111 this->noise = noise;
112 noise_vector_loaded = true;
113 noise_spectrum_loaded = false;
114 result.clear();
115 winv = ComplexArray();
116 processed = false;
117}

References mspass::algorithms::deconvolution::ScalarDecon::result, and mspass::algorithms::deconvolution::FFTDeconOperator::winv.

◆ max_gain()

double mspass::algorithms::deconvolution::NoiseStableDecon::max_gain ( ) const
inline

Return the largest gain reached by the processed inverse filter.

77{ return max_gain_actual; }

◆ process()

void mspass::algorithms::deconvolution::NoiseStableDecon::process ( )
virtual

Compute the noise-stable inverse filter and result.

The method requires loaded wavelet and data vectors and rebuilds cached output, inverse-filter, and QC state.

Implements mspass::algorithms::deconvolution::ScalarDecon.

168 {
169 const string base_error("NoiseStableDecon::process: ");
170 result.clear();
171 winv = ComplexArray();
172 processed = false;
173 const int output_length = data.size();
174 if (output_length <= 0)
175 throw MsPASSError(base_error + "no data loaded", ErrorSeverity::Invalid);
176 if (wavelet.empty())
177 throw MsPASSError(base_error + "no wavelet loaded", ErrorSeverity::Invalid);
178 if (output_length > nfft || wavelet.size() > nfft)
179 throw MsPASSError(base_error + "loaded vectors exceed padded FFT length",
180 ErrorSeverity::Invalid);
181
182 vector<double> data_padded(data);
183 data_padded.resize(nfft, 0.0);
184 ComplexArray d_fft(nfft, &(data_padded[0]));
185 gsl_fft_complex_forward(d_fft.ptr(), 1, nfft, wavetable, workspace);
186
187 vector<double> wavelet_padded(wavelet);
188 wavelet_padded.resize(nfft, 0.0);
189 ComplexArray s_fft(nfft, &(wavelet_padded[0]));
190 gsl_fft_complex_forward(s_fft.ptr(), 1, nfft, wavetable, workspace);
191 if (s_fft.rms() <= 0.0)
192 throw MsPASSError(base_error + "wavelet vector is all zeros",
193 ErrorSeverity::Invalid);
194
195 const double dt = shapingwavelet.sample_interval();
196 vector<double> pn = this->noise_power_spectrum(dt);
197 winv = ComplexArray(nfft);
198 max_gain_actual = 0.0;
199 noise_amplification = 0.0;
200 double spectral_power_peak = 0.0;
201 for (int k = 0; k < nfft; ++k)
202 spectral_power_peak = max(spectral_power_peak, norm(s_fft[k]));
203 const double mu_floor = mu_min * spectral_power_peak;
204 int usable_bins = 0;
205 for (int k = 0; k < nfft; ++k) {
206 Complex64 s = s_fft[k];
207 double absS2 = norm(s);
208 double absS = sqrt(absS2);
209 double snr = absS2 / (pn[k] + noise_floor);
210 double mu_noise = alpha * absS2 / (snr + 1.0e-12);
211 double mu_gain = max(0.0, absS / gain_max - absS2);
212 double mu = max({mu_floor, mu_noise, mu_gain});
213 double b = this->reliability_taper(snr);
214 Complex64 g(0.0, 0.0);
215 if ((absS2 + mu) > 0.0)
216 g = b * conj(s) / (absS2 + mu);
217 double gain = abs(g);
218 if (gain > gain_max) {
219 g *= gain_max / gain;
220 gain = gain_max;
221 }
222 double *ptr = winv.ptr(k);
223 ptr[0] = g.real();
224 ptr[1] = g.imag();
225 max_gain_actual = max(max_gain_actual, gain);
226 noise_amplification += gain * gain * pn[k];
227 if (b > 0.0 && gain > 0.0)
228 ++usable_bins;
229 }
230 noise_amplification = sqrt(noise_amplification / static_cast<double>(nfft));
231 effective_bandwidth_fraction =
232 static_cast<double>(usable_bins) / static_cast<double>(nfft);
233
234 ComplexArray rf_fft = winv * d_fft;
235 gsl_fft_complex_inverse(rf_fft.ptr(), 1, nfft, wavetable, workspace);
236 result = ExtractLagWindow(rf_fft, output_length, sample_shift);
237 processed = true;
238}
double * ptr()
Definition ComplexArray.cc:111
int sample_shift
Sample offset used to place zero lag in deconvolution outputs.
Definition FFTDeconOperator.h:97

References mspass::algorithms::deconvolution::ScalarDecon::data, mspass::algorithms::deconvolution::FFTDeconOperator::nfft, mspass::algorithms::deconvolution::ComplexArray::ptr(), mspass::algorithms::deconvolution::ScalarDecon::result, mspass::algorithms::deconvolution::ComplexArray::rms(), mspass::algorithms::deconvolution::ShapingWavelet::sample_interval(), mspass::algorithms::deconvolution::FFTDeconOperator::sample_shift, mspass::algorithms::deconvolution::ScalarDecon::shapingwavelet, mspass::algorithms::deconvolution::ScalarDecon::wavelet, mspass::algorithms::deconvolution::FFTDeconOperator::wavetable, mspass::algorithms::deconvolution::FFTDeconOperator::winv, and mspass::algorithms::deconvolution::FFTDeconOperator::workspace.

◆ QCMetrics()

Metadata mspass::algorithms::deconvolution::NoiseStableDecon::QCMetrics ( )
virtual

Return appropriate quality measures.

Each operator commonly has different was to measure the quality of the result. This method should return these in a generic Metadata object.

Implements mspass::algorithms::deconvolution::ScalarDecon.

290 {
291 Metadata md(this->BasicQCMetrics("NoiseStableDecon", processed));
292 md.put("decon_operator_nfft", nfft);
293 md.put("decon_operator_sample_shift", sample_shift);
294 md.put("ns_gid_gain_max_requested", gain_max);
295 md.put("ns_gid_gain_max_actual", max_gain_actual);
296 md.put("ns_gid_mu_min", mu_min);
297 md.put("ns_gid_alpha", alpha);
298 md.put("ns_gid_noise_amplification", noise_amplification);
299 md.put("ns_gid_effective_bandwidth_fraction",
300 effective_bandwidth_fraction);
301 md.put("ns_gid_operator_nfft", nfft);
302 md.put("ns_gid_use_reliability_taper", use_reliability_taper);
303 return md;
304}
mspass::utility::Metadata BasicQCMetrics(const std::string &operator_name, const bool processed)
Build QC Metadata fields common to scalar deconvolution operators.
Definition ScalarDecon.cc:61

References mspass::algorithms::deconvolution::ScalarDecon::BasicQCMetrics(), mspass::algorithms::deconvolution::FFTDeconOperator::nfft, mspass::utility::Metadata::put(), and mspass::algorithms::deconvolution::FFTDeconOperator::sample_shift.


The documentation for this class was generated from the following files: