Générer des rampes périodiques en Python avec UliEngineering

UliEngineering inclut un module UliEngineering.SignalProcessing.Ramp qui peut être utilisé pour générer des rampes avec des profils d’accélération et de décélération définis, ainsi que la possibilité de générer des traces continues C².

Exemple d’utilisation minimal :

generate_ramp.py
from UliEngineering.SignalProcessing.Ramp import periodic_ramp

# Générer le signal
y = periodic_ramp(
    frequency = 2.0,
    samplerate=1000,
    amplitude=10,
    rise_time=0.1,
    fall_time=0.2,
    high_time=0.1,
    acceleration=4000,
    length=1.0,
)

Minimal Ramp.svg

Script de tracé d’exemple détaillé

UliEngineering Ramp.svg

généré avec ce code Python

plot_ramp.py
#!/usr/bin/env python3
"""
Script d'exemple pour générer et tracer un signal de rampe périodique
à l'aide de `UliEngineering.SignalProcessing.Ramp.periodic_ramp`.

Utilisation :
    python3 examples/ramp_example.py

Les options permettent d'ajuster la fréquence d'échantillonnage, la fréquence,
l'amplitude, les temps de montée/descente, l'accélération (coude), le nombre
de périodes et le nom du fichier de sortie.
"""

import argparse
import numpy as np
import matplotlib.pyplot as plt
from UliEngineering.SignalProcessing.Ramp import periodic_ramp
plt.style.use("ggplot")

def main():
    p = argparse.ArgumentParser(description="Générer et tracer un signal de rampe périodique")
    p.add_argument('--samplerate', '-r', type=float, default=1.0, help='Échantillons par seconde')
    p.add_argument('--frequency', '-f', type=float, default=1.0/15000.0, help='Fréquence du signal en Hz')
    p.add_argument('--amplitude', '-a', type=float, default=1.05e8, help='Amplitude crête à crête')
    p.add_argument('--rise', type=float, default=3500.0, help='Temps de montée (secondes)')
    p.add_argument('--fall', type=float, default=3500.0, help='Temps de descente (secondes)')
    p.add_argument('--high', type=float, default=4000.0, help='Temps de maintien haut (secondes)')
    p.add_argument('--acceleration', '-A', type=float, default=50.0, help='Accélération du flanc (unités/s^2)')
    p.add_argument('--periods', type=int, default=2, help='Nombre de périodes à générer')
    p.add_argument('--outfile', '-o', default='ramp.svg', help='Nom du fichier pour sauvegarder le tracé')
    args = p.parse_args()

    # Calculer la longueur totale nécessaire pour générer le nombre de périodes demandé
    period = 1.0 / args.frequency
    length = args.periods * period

    # Générer le signal
    y = periodic_ramp(
        args.frequency,
        args.samplerate,
        amplitude=args.amplitude,
        rise_time=args.rise,
        fall_time=args.fall,
        high_time=args.high,
        acceleration=args.acceleration,
        length=length,
    )

    # Axe temporel
    t = np.arange(y.size) / args.samplerate

    # Tracer
    plt.figure(figsize=(10, 4))
    plt.plot(t, y, color='tab:red', linewidth=1.0)
    plt.xlabel('Temps [s]')
    plt.ylabel('Amplitude')
    plt.title(f'Rampe périodique (f={args.frequency:.6g} Hz, A={args.amplitude:g})')
    plt.grid(True)
    plt.tight_layout()
    plt.savefig(args.outfile, dpi=150)
    print(f"Tracé sauvegardé dans {args.outfile}")

    # Afficher interactivement (si disponible)
    try:
        plt.show()
    except Exception:
        pass


if __name__ == '__main__':
    main()

Consultez les articles similaires par catégorie : Python, UliEngineering, Data Science