pycsamt.forward.noise#
Noise models for synthetic EM training data.
Noise injection turns clean forward responses into realistic training samples that improve neural-network generalisation. Two families are provided:
GaussianNoiseSimple additive relative Gaussian noise, identical at all frequencies/times. Fast and widely used in the literature (e.g. Puzyrev 2021 applies 1–2 % relative noise).
FieldRealisticNoiseFrequency-dependent noise model that mimics real-world MT/CSAMT data quality:
Cultural EM noise peaks at 50/60 Hz power-line frequencies.
Dead-band effect (elevated noise at ~1 000–3 000 s period) due to reduced natural signal in the MT spectrum.
Early-time TEM noise from transmitter turn-off and system bandwidth.
MultiplicativeNoiseLog-space additive noise — useful when the dynamic range of the data spans several decades (log₁₀ space perturbation).
All noise classes follow the same interface:
noisy_resp = noise_model.apply(clean_resp)
or the functional helpers add_gaussian_noise / add_noise can be
used directly.
References
Puzyrev, V. & Swidinsky, A. (2021). Inversion of 1D frequency- and time-domain EM data with CNNs. Computers & Geosciences, 149, 104681.
Egbert, G.D. (1997). Robust multiple station magnetotelluric data processing. Geophysical Journal International, 130, 475–496.
Functions
|
Convenience wrapper: add Gaussian noise at a given relative level. |
|
Apply a named or pre-built noise model to a forward response. |
Classes
|
Frequency-dependent noise model for MT/CSAMT training data. |
|
Add relative Gaussian noise to an EM forward response. |
|
Log-space (multiplicative) Gaussian noise. |
- class pycsamt.forward.noise.GaussianNoise(level=0.05, apply_to='rho_phase', phase_level=None)[source]#
Bases:
_BaseNoiseModelAdd relative Gaussian noise to an EM forward response.
For MT/CSAMT the noise is applied to log₁₀(ρ_a) and the phase independently. For TEM it is applied to log₁₀(|dBz/dt|).
- Parameters:
Examples
>>> import numpy as np >>> from pycsamt.forward.em1d import MT1DForward >>> from pycsamt.forward.synthetic import LayeredModel >>> from pycsamt.forward.noise import GaussianNoise >>> m = LayeredModel([100, 10, 500], [300, 800]) >>> resp = MT1DForward(np.logspace(-3, 4, 20)).run(m) >>> noisy = GaussianNoise(level=0.05).apply(resp, seed=0) >>> noisy.rho_a.shape (20,)
- apply(response, *, seed=None)[source]#
Return a new
ForwardResponsewith noise added.- Parameters:
response (ForwardResponse) – Clean forward response.
seed (int or None) – Random seed for reproducibility.
- Return type:
- class pycsamt.forward.noise.FieldRealisticNoise(base_level=0.02, powerline_freq=50.0, powerline_level=0.3, dead_band=True, dead_band_freq_range=(0.0003, 0.001), dead_band_level=0.15)[source]#
Bases:
_BaseNoiseModelFrequency-dependent noise model for MT/CSAMT training data.
Simulates three dominant noise sources present in field data:
Power-line harmonics — Gaussian spikes at 50 Hz, 100 Hz, 150 Hz (or 60/120/180 Hz for North American data).
MT dead band — elevated noise at ~1 000–3 000 s period (≈ 3×10⁻⁴ – 10⁻³ Hz) due to reduced natural source energy.
Background floor — minimum noise level applied uniformly.
- Parameters:
base_level (float) – Background relative noise floor. Default 0.02 (2 %).
powerline_freq (float) – Fundamental power-line frequency [Hz]. 50 or 60.
powerline_level (float) – Additional noise at power-line harmonics (relative).
dead_band (bool) – If
True, inflate noise in the MT dead band.dead_band_freq_range ((low, high)) – Frequency range [Hz] of the dead band. Default (3e-4, 1e-3).
dead_band_level (float) – Additional noise level in the dead band. Default 0.15.
- noise_profile(freqs)[source]#
Return the frequency-dependent noise level array.
- Parameters:
freqs (ndarray) – Frequencies [Hz].
- Returns:
sigma – Relative noise standard deviation at each frequency.
- Return type:
ndarray, same shape as freqs
- apply(response, *, seed=None)[source]#
Return a new
ForwardResponsewith noise added.- Parameters:
response (ForwardResponse) – Clean forward response.
seed (int or None) – Random seed for reproducibility.
- Return type:
- class pycsamt.forward.noise.MultiplicativeNoise(sigma_log10=0.05)[source]#
Bases:
_BaseNoiseModelLog-space (multiplicative) Gaussian noise.
Equivalent to a log-normal perturbation on the data value. Appropriate when the data spans many orders of magnitude.
- Parameters:
sigma_log10 (float) – Standard deviation of the log₁₀ perturbation.
sigma_log10=0.05corresponds to ≈ ±12 % variation.
- apply(response, *, seed=None)[source]#
Return a new
ForwardResponsewith noise added.- Parameters:
response (ForwardResponse) – Clean forward response.
seed (int or None) – Random seed for reproducibility.
- Return type:
- pycsamt.forward.noise.add_gaussian_noise(response, level=0.05, *, seed=None)[source]#
Convenience wrapper: add Gaussian noise at a given relative level.
- Parameters:
response (ForwardResponse)
level (float) – Relative noise standard deviation.
seed (int or None)
- Returns:
New response with noise applied.
- Return type:
- pycsamt.forward.noise.add_noise(response, noise_model='gaussian', level=0.05, *, seed=None, **kwargs)[source]#
Apply a named or pre-built noise model to a forward response.
- Parameters:
response (ForwardResponse)
noise_model (str or noise instance) –
'gaussian','multiplicative','field', or an already-instantiated noise object.level (float) – Base noise level (used when constructing named models).
seed (int or None)
**kwargs – Extra keyword arguments forwarded to the noise model constructor.
- Return type: