Как генерировать периодические рампы в Python с использованием UliEngineering

UliEngineering включает модуль UliEngineering.SignalProcessing.Ramp, который может использоваться для генерации рамп, включая определённые профили ускорения и замедления, а также возможность генерации C²-непрерывных кривых.

Минимальный пример использования:

generate_ramp.py
from UliEngineering.SignalProcessing.Ramp import periodic_ramp

# Генерация сигнала
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

Подробный скрипт для построения графика

UliEngineering Ramp.svg

сгенерированный с использованием этого кода на Python

plot_ramp.py
#!/usr/bin/env python3
"""
Пример скрипта для генерации и построения графика периодического сигнала рампы с использованием
`UliEngineering.SignalProcessing.Ramp.periodic_ramp`.

Использование:
    python3 examples/ramp_example.py

Опции позволяют настраивать частоту дискретизации, частоту, амплитуду, время нарастания/спада,
ускорение (изгиб), количество периодов и имя выходного файла.
"""

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="Генерация и построение графика периодического сигнала рампы")
    p.add_argument('--samplerate', '-r', type=float, default=1.0, help='Отсчётов в секунду')
    p.add_argument('--frequency', '-f', type=float, default=1.0/15000.0, help='Частота сигнала в Гц')
    p.add_argument('--amplitude', '-a', type=float, default=1.05e8, help='Размах амплитуды')
    p.add_argument('--rise', type=float, default=3500.0, help='Время нарастания (секунды)')
    p.add_argument('--fall', type=float, default=3500.0, help='Время спада (секунды)')
    p.add_argument('--high', type=float, default=4000.0, help='Время удержания на высоком уровне (секунды)')
    p.add_argument('--acceleration', '-A', type=float, default=50.0, help='Ускорение фронта (единиц/с^2)')
    p.add_argument('--periods', type=int, default=2, help='Количество периодов для генерации')
    p.add_argument('--outfile', '-o', default='ramp.svg', help='Имя файла для сохранения графика')
    args = p.parse_args()

    # Вычисление общей длины, необходимой для генерации запрошенного количества периодов
    period = 1.0 / args.frequency
    length = args.periods * period

    # Генерация сигнала
    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,
    )

    # Ось времени
    t = np.arange(y.size) / args.samplerate

    # Построение графика
    plt.figure(figsize=(10, 4))
    plt.plot(t, y, color='tab:red', linewidth=1.0)
    plt.xlabel('Время [с]')
    plt.ylabel('Амплитуда')
    plt.title(f'Периодическая рампа (f={args.frequency:.6g} Гц, A={args.amplitude:g})')
    plt.grid(True)
    plt.tight_layout()
    plt.savefig(args.outfile, dpi=150)
    print(f"График сохранён в {args.outfile}")

    # Интерактивный показ (если доступно)
    try:
        plt.show()
    except Exception:
        pass


if __name__ == '__main__':
    main()

Check out similar posts by category: Python, UliEngineering, Data Science