SignalForge documentation

SignalForge is an open-source Python package that provides a comprehensive set of tools for analyzing and generating non-Gaussian, non-stationary signals in engineering applications. While traditional signal processing methods often rely on assumptions of Gaussianity and stationarity, real-world signals—especially those found in mechanical systems—frequently deviate from these idealized models. SignalForge bridges this gap by offering advanced, yet user-friendly tools to simulate, inspect, and manipulate signals with complex statistical properties. Whether you’re designing loads for testing, exploring time-varying behavior, or developing new algorithms, SignalForge enables you to work with signals that better reflect real operating conditions. Built with extensibility and clarity in mind, the package is suitable for researchers, practitioners, and students working across mechanical engineering, signal processing, and beyond.

Installation

SignalForge is available on PyPI. To install it, run:

pip install signalforge

Alternatively, you can clone the repository from GitHub and install it in editable mode:

git clone https://github.com/GiulioCurti/SignalForge.git
cd SignalForge
pip install -e .

Quick Start Examples

Generating a Stationary Gaussian Signal

Stationary Gaussian signals can be generated using the StationaryGaussian class.

from SignalForge import StationaryGaussian

fpsd = [10, 20]  # Frequency vector [Hz]
psd = [1, 1]     # Power density vector [(m/s^2)^2/Hz]
fs = 200         # Sampling frequency [Hz]
T = 200          # Time duration [s]

gauss_signal = StationaryGaussian(
    fpsd=fpsd,
    psd=psd,
    fs=fs,
    T=T,
    name='Stationary Gaussian',
    unit='$m/s^2$'
)

gauss_signal.plot()      # Plotting Time history
gauss_signal.plot_psd()  # Plotting Power Spectral Density

Generating a Stationary Non-Gaussian Signal

To generate stationary non-Gaussian signals with a target kurtosis, use the StationaryNonGaussian class.

from SignalForge import StationaryNonGaussian

fpsd = [10, 20]  # Frequency vector [Hz]
psd = [1, 1]     # Power density vector [(m/s^2)^2/Hz]
fs = 200         # Sampling frequency [Hz]
T = 200          # Time duration [s]
input_kurtosis = 6

nongauss_signal = StationaryNonGaussian(
    fpsd=fpsd,
    psd=psd,
    T=T,
    kurtosis=input_kurtosis,
    fs=fs,
    method='zmnl',
    name='Stationary NonGaussian',
    unit='$m/s^2$'
)

nongauss_signal.plot()      # Plotting Time history
nongauss_signal.plot_psd()  # Plotting Power Spectral Density

Generating a Non-Stationary Non-Gaussian Signal

For non-stationary behaviors (e.g., amplitude or frequency modulation), use the NonStationaryNonGaussian class.

from SignalForge import NonStationaryNonGaussian

fpsd = [10, 20]  # Frequency vector [Hz]
psd = [1, 1]     # Power density vector [(m/s^2)^2/Hz]
fs = 200         # Sampling frequency [Hz]
T = 200          # Time duration [s]
params = {'input_kurtosis': 10}

nonstat_signal = NonStationaryNonGaussian(
    fpsd=fpsd,
    psd=psd,
    T=T,
    params=params,
    fs=fs,
    method='trapp_am',
    name='NonStationary NonGaussian',
    unit='$m/s^2$'
)

nonstat_signal.plot()       # Plotting Time history
nonstat_signal.plot_stft()   # Plotting Short Time Fourier Transform