stationary_nongaussian module

class SignalForge.stationary_nongaussian.StationaryNonGaussian(fpsd: ndarray, psd: ndarray, T: float, kurtosis: int, flims: list = None, fs: float = None, dfpsd: float = 0.5, skewness: int = 0, method: str = 'winter', params=None, name: str = '', var: str = 'x', unit: str = '$m/s^2$', seed: int = None, interp: str = 'lin')[source]

Bases: SingleChanSignal

Generates a stationary non-Gaussian signal with specified skewness and kurtosis using a transformation method applied to a Gaussian signal with a target PSD. StationaryNonGaussian is a child class of SingleChanSignal.

Parameters:
  • fpsd (np.ndarray) – frequency vector of the power spectral density

  • psd (np.ndarray) – power density vector of the power spectral density

  • T (float) – time length of the signal

  • kurtosis (int) – input kurtosis for the transformation model

  • dfpsd (float) – frequency discretization of the psd to be stored

  • skewness (int) – input kurtosis for the transformation model

  • method (str) – tranformation method to be used for generating the non-gaussian signal

  • params (dict) – optional parameters for the transformation model if optimization wants to be skipped

  • name (str) – name of the process (used for plots)

  • var (str) – name of the variable (used for plots)

  • unit (str) – unit of measure of the signal (used for plots)

  • seed (int) – seed for the random generator used in non-gaussian models

  • interp ('lin' or 'log') – interpolation rule for increasing resolution on given PSD

get_existing_methods()[source]

Returns a dictionary mapping method names to their corresponding functions.

Returns:

A dictionary where keys are method names (str) and values are callable functions for non-Gaussian transformation.

Return type:

dict

SignalForge.stationary_nongaussian.get_cubic_polynomial(signal: ndarray, input_kurtosis: float, input_skewness: float = 0, params=None)[source]

Applies a cubic polynomial transformation to a Gaussian signal to match specified skewness and kurtosis.

Parameters:
  • signal (np.ndarray) – Input Gaussian signal.

  • input_kurtosis (float) – Target excess kurtosis (e.g. 0 for Gaussian, >0 for leptokurtic).

  • input_skewness (float) – Target skewness.

  • params (dict {'a': [a0, a1, a2, a3]}, optional) – Bypass optimization with given parameters.

Returns:

  • ng_signal (np.ndarray) – Transformed non-Gaussian signal, rescaled to match input RMS.

  • opt_params (dict) – Dictionary of optimal parameters {‘a’: [a0, a1, a2, a3]}.

SignalForge.stationary_nongaussian.get_sarkani(signal: ndarray, input_kurtosis: float, input_skewness: float = 0, params=None)[source]

Applies Sarkani’s transformation to achieve a desired kurtosis and skewness.

Parameters:
  • signal (np.ndarray) – Input Gaussian signal.

  • input_kurtosis (float) – Target kurtosis.

  • input_skewness (float, optional) – Target skewness. If None, assumes symmetry.

  • param (dict {'b1': float, 'b2': float}) – Transformation parameters to bypass the optimization procedure

Returns:

  • ng_signal (np.ndarray) – Transformed signal

  • opt_params (dict) – Dictionary of optimal parameters

Source

  1. Sarkani, D. P. Kihl, e J. E. Beach, «Fatigue of welded joints under narrowband non-Gaussian loadings», Probabilistic Eng. Mech., vol. 9, fasc. 3, pp. 179–190, gen. 1994, doi: 10.1016/0266-8920(94)90003-5.

SignalForge.stationary_nongaussian.get_smallwood(fpsd: ndarray, psd: ndarray, T: float, input_kurtosis: float, input_skewness: float = None, seed: int = None, params=None)[source]

Uses the Smallwood filtered poisson shot to achieve a desired kurtosis.

Parameters:
  • fpsd (np.ndarray) – Frequency vector of the power spectral density

  • psd (np.ndarray) – Power density vector of the power spectral density

  • T (float) – Time length of the final signal

  • input_kurtosis (float) – Target kurtosis.

  • input_skewness (float, optional) – Target skewness. If None, assumes symmetry.

  • seed (int) – Seed for the random generator for the Poisson shot times and amplitudes.

  • param (dict {'lam': float, 'I': float, 'seed': int}) – Transformation parameters to bypass the optimization procedure

Returns:

  • ng_signal (np.ndarray) – Transformed signal

  • opt_params (dict) – Dictionary of optimal parameters

Source

    1. Smallwood, «Generation of Stationary Non-Gaussian Time Histories with a Specified Cross-spectral Density», Shock Vib., vol. 4, fasc. 5–6, pp. 361–377, 1997, doi: 10.1155/1997/713593.

SignalForge.stationary_nongaussian.get_steinwolf(signal: ndarray, fs: float, input_kurtosis: float, input_skewness: float = None, params=None)[source]

Applies the Steinwolf phase transformation to achieve a desired kurtosis.

Parameters:
  • signal (np.ndarray) – Input Gaussian signal.

  • fs (float) – Sampling frequency of the signal

  • input_kurtosis (float) – Target kurtosis (3 = Gaussian; >3 = leptokurtic / high peaks).

  • input_skewness (float, optional) – Target skewness. If None, assumes symmetry.

  • params (dict {'nd': int, 'seed': int}) – Transformation parameters to bypass the optimisation procedure.

Returns:

  • ng_signal (np.ndarray) – Transformed signal with the desired kurtosis.

  • opt_params (dict) – Dictionary of optimal parameters {‘nd’: int, ‘seed’: int}.

Source

  1. Steinwolf, «Random vibration testing with kurtosis control by IFFT phase manipulation», Mech. Syst. Signal Process., vol. 28, pp. 561–573, apr. 2012, doi: 10.1016/j.ymssp.2011.11.001.

SignalForge.stationary_nongaussian.get_vanbaren(fpsd: ndarray, psd: ndarray, T: float, input_kurtosis: float, input_skewness: float = 0, seed: int = None, params: dict = None)[source]

Uses the Van Baren filtered Poisson shot noise to achieve a desired kurtosis.

Parameters:
  • fpsd (np.ndarray) – Frequency vector of the power spectral density.

  • psd (np.ndarray) – Power spectral density vector.

  • T (float) – Time length of the final signal [s].

  • input_kurtosis (float) – Target excess kurtosis (e.g. 3 for Gaussian).

  • input_skewness (float, optional) – Target skewness. Only 0 is supported (symmetric process). Default is 0.

  • seed (int, optional) – Seed for reproducibility of Poisson shot times and amplitudes.

  • params (dict {'alpha': float, 'seed': int}, optional) – Bypass optimization with given parameters.

Returns:

  • ng_signal (np.ndarray) – Transformed non-Gaussian signal scaled to match input RMS.

  • opt_params (dict) – Dictionary of optimal parameters {‘alpha’: float, ‘seed’: int}.

Source

  1. Van Baren, ‘System and method for simultaneously controlling spectrum and kurtosis of a random vibration’, US20070185620.

SignalForge.stationary_nongaussian.get_winterstein(signal: ndarray, input_skewness: float, input_kurtosis: float, params: float = None) tuple[source]

Applies the Winterstein method to generate a non-Gaussian signal with specified skewness and kurtosis from a Gaussian input.

Parameters:
  • signal (np.ndarray) – Input signal.

  • input_skewness (float) – Desired skewness of the output signal.

  • input_kurtosis (float) – Desired kurtosis of the output signal.

  • params (float) – Optional dictionary of parameters. Currently supports: - 2 or 3, for second or third order Winterstein transformation.

Returns:

  • ng_signal (np.ndarray) – Transformed signal

  • opt_params (dict) – Dictionary of optimal parameters

Source

    1. Winerstein, «Nonlinear Vibration Models for Extremes and Fatigue», J. Eng. Mech., vol. 114, fasc. 10, pp. 1772-1790, ott. 1988, doi: 10.1061/(ASCE)0733-9399(1988)114:10(1772)

SignalForge.stationary_nongaussian.get_zheng(signal: ndarray, input_kurtosis: float, input_skewness: float = 0, params=None)[source]

Applies Zheng’s transformation to achieve a desired kurtosis and skewness.

Parameters:
  • signal (np.ndarray) – Input Gaussian signal.

  • input_kurtosis (float) – Target excess kurtosis (e.g. 0 for Gaussian).

  • input_skewness (float, optional) – Target skewness. Default is 0 (symmetric).

  • params (dict {'a': float, 'b': float}, optional) – Transformation parameters to bypass the optimization procedure.

Returns:

  • ng_signal (np.ndarray) – Transformed signal rescaled to original RMS.

  • opt_params (dict) – Dictionary of optimal parameters {‘a’: float, ‘b’: float}.

Source

  1. Zheng et al., Packag. Technol. Sci., vol. 30, no. 7, pp. 331-345, 2017.

SignalForge.stationary_nongaussian.get_zmnl(signal: ndarray, fs: float, input_kurtosis: float, input_skewness: float = 0, params=None)[source]

Applies the improved non linear transformation to achieve a desired kurtosis.

Parameters:
  • signal (np.ndarray) – Input Gaussian signal.

  • fs (float) – Sampling frequency of the signal

  • input_kurtosis (float) – Target kurtosis.

  • input_skewness (float, optional) – Target skewness. If None, assumes symmetry.

  • param (dict {'beta': float, 'n': float}) – Transformation parameters to bypass the optimization procedure

Returns:

  • ng_signal (np.ndarray) – Transformed signal

  • opt_params (dict) – Dictionary of optimal parameters

Source

  1. Wise, A. Traganitis, e J. Thomas, «The effect of a memoryless nonlinearity on the spectrum of a random process», IEEE Trans. Inf. Theory, vol. 23, fasc. 1, pp. 84–89, gen. 1977, doi: 10.1109/TIT.1977.1055658.