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:

GaussianNoise

Simple 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).

FieldRealisticNoise

Frequency-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.

MultiplicativeNoise

Log-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

add_gaussian_noise(response[, level, seed])

Convenience wrapper: add Gaussian noise at a given relative level.

add_noise(response[, noise_model, level, seed])

Apply a named or pre-built noise model to a forward response.

Classes

FieldRealisticNoise([base_level, ...])

Frequency-dependent noise model for MT/CSAMT training data.

GaussianNoise([level, apply_to, phase_level])

Add relative Gaussian noise to an EM forward response.

MultiplicativeNoise([sigma_log10])

Log-space (multiplicative) Gaussian noise.

class pycsamt.forward.noise.GaussianNoise(level=0.05, apply_to='rho_phase', phase_level=None)[source]#

Bases: _BaseNoiseModel

Add 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:
  • level (float) – Relative noise standard deviation (e.g. 0.05 = 5 %).

  • apply_to ({'rho_phase', 'z', 'both'}) – Which quantities to perturb. Default 'rho_phase'.

  • phase_level (float or None) – Separate noise level for phase in degrees. If None, level is used scaled to the typical 45° phase range.

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 ForwardResponse with noise added.

Parameters:
  • response (ForwardResponse) – Clean forward response.

  • seed (int or None) – Random seed for reproducibility.

Return type:

ForwardResponse

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: _BaseNoiseModel

Frequency-dependent noise model for MT/CSAMT training data.

Simulates three dominant noise sources present in field data:

  1. Power-line harmonics — Gaussian spikes at 50 Hz, 100 Hz, 150 Hz (or 60/120/180 Hz for North American data).

  2. MT dead band — elevated noise at ~1 000–3 000 s period (≈ 3×10⁻⁴ – 10⁻³ Hz) due to reduced natural source energy.

  3. 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 ForwardResponse with noise added.

Parameters:
  • response (ForwardResponse) – Clean forward response.

  • seed (int or None) – Random seed for reproducibility.

Return type:

ForwardResponse

plot_profile(freqs, ax=None)[source]#

Visualise the noise level vs frequency. Returns Axes.

Parameters:

freqs (ndarray)

class pycsamt.forward.noise.MultiplicativeNoise(sigma_log10=0.05)[source]#

Bases: _BaseNoiseModel

Log-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.05 corresponds to ≈ ±12 % variation.

apply(response, *, seed=None)[source]#

Return a new ForwardResponse with noise added.

Parameters:
  • response (ForwardResponse) – Clean forward response.

  • seed (int or None) – Random seed for reproducibility.

Return type:

ForwardResponse

pycsamt.forward.noise.add_gaussian_noise(response, level=0.05, *, seed=None)[source]#

Convenience wrapper: add Gaussian noise at a given relative level.

Parameters:
Returns:

New response with noise applied.

Return type:

ForwardResponse

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:

ForwardResponse