import numpy as np
from matplotlib import pyplot as plt
Time Series Generation
This tutorial covers the generation of time series signals. It is shown how to create linear interpolated signals and periodic signals (superimposing several frequencies).
1 Linear Signals
Linear interpolated time series signals can be created by specifying points in time t
and the corresponding values y
:
from trimes.signal_generation import linear_time_series
= (0, 2, 2, 3, 5)
t = (2, 2, 1.5, 1.2, 1.2)
y = 1e-3
sample_time
= linear_time_series(t, y, sample_time)
ts =True) ts.plot(grid
If y
is a list, several lines are generated:
= (0, 2, 2, 3, 5)
t = [(2, 2, 1.5, 1.2, 1.2), (0, 1, 1, 1, 1)]
y
= linear_time_series(t, y, sample_time)
ts = ("upper boundary", "lower boundary")
ts.columns =True) ts.plot(grid
Symmetric signals can also be created using mirror_y
(mirroring of the signal at a y-value):
from trimes.signal_generation import mirror_y
= ts.iloc[:, 0]
upper_boundary = mirror_y(upper_boundary, 1, inplace=True)
ts_envelope = ("upper boundary", "lower boundary")
ts_envelope.columns = ts_envelope.plot(grid=True)
a type(a)
matplotlib.axes._axes.Axes
2 Periodic Signals
The PeriodicSignal
class can be used to create periodic signals of any shape (flexibly set parameters like frequency, magnitude, offset and initial angle). By default, cosine signals are created:
from trimes.signal_generation import PeriodicSignal
= 1e-4
sample_time = 110 * np.sqrt(2) / np.sqrt(3)
mag = np.arange(0, 0.1, sample_time)
t = PeriodicSignal(t, f=50, mag=mag, offset=10, phi=np.pi * 0.3)
cosine_wave = cosine_wave.get_signal_series()
cosine_wave_series
cosine_wave_series.plot()
plt.grid() plt.show()
To create gradients, use tuples as parameters (don’t use lists).
"all")
plt.close(
= PeriodicSignal(
cosine_wave 0, 0.1, sample_time), f=(50, 150), mag=(0.9 * mag, 1.5 * mag)
np.arange(
)=True) cosine_wave.plot(grid
The plot_with_attributes
illustrates the signal as well as its parameters over time.
cosine_wave.plot_with_attributes() plt.grid()
Symmetric multi-phase signals can be created based on the PeriodicSignal
class by using get_signal_n_phases
(angular phase difference between signals is \(360/n\)):
= PeriodicSignal(
cosine_wave 0, 0.1, sample_time), f=(50, 55), mag=(0.9 * mag, 1.1 * mag)
np.arange(
)= cosine_wave.get_signal_n_phases(3)
cosine_wave_series_3_phase =True) cosine_wave_series_3_phase.plot(grid
Signals can be superimposed and concatenated by creating an array of signals. The rows of the array are superimposed and the resulting column is concatenated. The following signal is created: - two time periods (with varying frequencies) - 0-0.1 s - 0.1-0.2 s - several frequencies are superimposed: - fundamental: \(50\) Hz (actually varies between \(50\) and \(52\) Hz) - fifth harmonic: \(5*50=250\) Hz - negative sequence: rotating with \(-50\) Hz (actually varies between \(-50\) and \(-52\) Hz) - \(3\) phases
from trimes.signal_generation import (
superimpose_and_concat_periodic_signals,
)
= [np.arange(0, 0.1, sample_time), np.arange(0.1, 0.2, sample_time)]
time_spans = [
signals
[0], f=50, mag=mag),
PeriodicSignal(time_spans[0], f=5 * 50, mag=0.05 * mag),
PeriodicSignal(time_spans[0], f=-50, mag=0.03 * mag),
PeriodicSignal(time_spans[
],
[1], f=(50, 52), mag=mag),
PeriodicSignal(time_spans[1], f=(50 * 5, 52 * 5), mag=0.05 * mag),
PeriodicSignal(time_spans[1], f=(-50, -52), mag=0.03 * mag),
PeriodicSignal(time_spans[
],
]= superimpose_and_concat_periodic_signals(
res =True, num_phases=3
signals, angle_continuation
)
res.plot() plt.grid()
The parameters of the signals can be exctracted using get_attributes_of_superimposed_and_concatenated_signals_over_time
and illustrated:
from trimes.signal_generation import (
get_attributes_of_superimposed_and_concatenated_signals_over_time,
)
= get_attributes_of_superimposed_and_concatenated_signals_over_time(
attrs_of_columns
signals
)0].plot(title="fundamental")
attrs_of_columns[
plt.grid()1].plot(title="harmonic")
attrs_of_columns[
plt.grid()2].plot(title="negative sequence")
attrs_of_columns[ plt.grid()