signalutils est une librairie Python pour la manipulation d'accélérogrammes, de spectres de réponse (SRO) et de Densités Spectrales de Puissance (DSP). Elle offre des outils pour générer des signaux, calculer des spectres de réponse, et effectuer des conversions entre différents types de signaux.
- Génération de signaux : Sinus, demi-sinus, dent de scie, signaux aléatoires.
- Traitement du signal : FFT, PSD (Periodogramme, Welch), rééchantillonnage, interpolation.
- Spectre de Réponse (SRO) : Calcul de SRO à partir de signaux temporels (méthodes NIGAM, HARMO, Kelly-Richman, Smallwood).
- Spectre de Réponse Extrême (ERS) : Calcul de SRO à partir d'une DSP (formules de Vanmarcke).
- Manipulation : Intégration, dérivation, mise à l'échelle.
Le projet utilise uv pour la gestion des dépendances, mais peut être installé via pip si les dépendances sont satisfaites.
pip install numpy scipy tqdmSi vous clonez le dépôt :
git clone https://github.com/votre-repo/signalutils.git
cd signalutils
pip install .Voici quelques exemples pour démarrer avec signalutils.
Vous pouvez générer des signaux simples comme des sinusoïdes ou des signaux aléatoires.
import numpy as np
import matplotlib.pyplot as plt
from signalutils.samplers import Sampler
from signalutils.generators import sinewave, random_signal
# Définition de l'échantillonnage : durée de 5 secondes avec un pas de temps de 1ms
S = Sampler(dt=1e-3, duration=5)
# Génération d'un sinus de 4 Hz et d'amplitude 10
sinus = sinewave(amplitude=10, frequency=4, **S)
# Génération d'un signal aléatoire
bruit = random_signal(amplitude=2, freq_filtre=100, **S)
# Affichage
plt.plot(sinus.x, sinus.y, label='Sinus')
plt.plot(bruit.x, bruit.y, label='Bruit')
plt.legend()
plt.show()Calculez le spectre de réponse d'un signal temporel (par exemple pour l'analyse sismique).
from signalutils.samplers import Sampler
from signalutils.generators import sinewave
# Signal d'entrée
S = Sampler(dt=1e-3, duration=5)
sinus = sinewave(amplitude=10, frequency=4, **S)
# Définition des fréquences pour le calcul du SRO
SR = Sampler(freq_coupure=100, n=200) # Jusqu'à 100 Hz
# Calcul du SRO avec un amortissement de 5%
# Retourne un dictionnaire avec les spectres de déplacement (0), vitesse (1) et accélération (2)
sro_dict = sinus.SRO(SR.liste_freq, xi=0.05, method='NIGAM')
spectre_accel = sro_dict[0.05][2] # Spectre d'accélération pour xi=0.05
print(f"ZPA (Zero Period Acceleration): {spectre_accel.ZPV}")
print(f"Accélération max: {spectre_accel.max}")Convertissez un signal temporel en DSP ou manipulez directement des DSP.
# Calcul de la DSP d'un signal temporel
dsp = sinus.psd(method='periodogram')
# Calcul de la valeur RMS depuis la DSP
rms_val = dsp.rms
print(f"Valeur RMS: {rms_val}")# Intégration (Accélération -> Vitesse)
vitesse = sinus.integrate()
# Dérivation (Vitesse -> Accélération)
accel = vitesse.derivative()
# Rééchantillonnage
nouveau_temps = np.linspace(0, 5, 100)
signal_resample = sinus.resample(nouveau_temps)signalutils/signals.py: Classes principales (Signal,TimeSignal,Spectrum,PsdSpectrum).signalutils/generators.py: Générateurs de signaux (sinus, etc.).signalutils/samplers.py: Gestion de l'échantillonnage (Sampler).signalutils/utils/: Algorithmes de calcul (NIGAM, filtres, etc.).
Les tests sont écrits avec le framework unittest. Pour les lancer :
python -m unittest discover testsNote : Certaines méthodes optimisées (NIGAM_C) nécessitent une compilation C/Cython qui peut ne pas être présente par défaut. Le code bascule automatiquement sur la version Python si nécessaire.