# gensig
创建用以模拟系统响应的周期信号
函数库: TyControlSystems
# 语法
u, t = gensig(type, tau)
u, t = gensig(type, tau; Tf, Ts)
# 说明
u, t = gensig(type, tau) 生成具有指定类型和周期的单位振幅周期信号。使用信号 u 和相应的时间向量 t,使用 lsim 模拟单输入动态系统的时间响应。要为多输入系统创建信号,请重复调用 gensig 并将生成的 u 向量堆叠成矩阵。使用 u 和 t 模拟动态系统模型时, t 被认为具有时间单位 s 。
u, t = gensig(type, tau; Tf, Ts) 生成采样时间为 Ts,持续时间为 Tf 的信号。t 以 Ts 为增量从 0 迭代到 Tf。要生成用于模拟离散时间模型的信号,请使用此语法并将 Ts 设置为模型的采样时间。
# 示例
产生方波
生成一个周期为 2 秒的方波,用于用 lsim 模拟动态系统响应。
using TyControlSystems
using TyPlot
tau = 2
u, t = gensig(:square, tau)
gensig 返回信号作为矩阵 u 和相应的时间向量 t。当没有指定信号的持续时间时,gensig 生成一个运行 5 个周期的信号 (Tf = 5*tau)。若没有指定时间步长,gensig 默认为每个周期 64 个样本 (Ts = tau/64)。
因此,该信号运行 10 秒,时间步长为 0.03125 秒。
画出信号。
plot(t, u)
gensig 返回一个单位振幅的方波,从零开始。可以修改 u 来得到一个具有不同振幅和不同端点的方波。创建一个周期为 5 的方波,持续 15 秒,并在 -1 和 1 之间切换。
tau = 5
Tf = 15
u0, t = gensig(:square, tau, Tf=Tf)
u = 2 * u0 .- 1
画出信号。
plot(t, u)
用 lsim 模拟动态系统在 u 作用下 t 时间内的响应。
sys = tf(30, [1, 5, 30])
lsim(sys, u, t)

生成指定采样时间的信号
如果不指定时间步长(采样时间),gensig 默认为每个周期 64个样本,即 Ts = tau/64。
当想用 lsim 模拟一个离散时间模型时,时间步长必须等于模型的采样时间。为 gensig 提供这个采样时间以生成合适的信号。
例如,生成一个正弦波来模拟一个采样时间为 0.1s 的离散动态系统模型。
using TyControlSystems
tau = 3
Tf = 6
Ts = 0.1
u, t = gensig(:sin, tau, Tf=Tf, Ts=Ts)
模拟模型对生成信号的响应。
sys = zpk(Float64[], [-0.1, -0.5], 1, Ts)
lsim(sys, u, t)

生成模拟多输入系统的输入
要用 lsim 模拟多输入系统,可以将输入信号作为矩阵提供,其行表示应用于每个输入的信号。
要使用 gensig 生成这样的输入矩阵,需要为每个输入一起创建信号,并将它们堆叠在一个矩阵中。
例如,创建一个模拟双输入系统的信号,向第一个输入注入一个周期为 2 秒的方波,并每 1.5 秒向第二个输入注入一个脉冲。指定持续时间和采样时间,使两个向量具有相同的长度,这对于将它们组合成一个矩阵是必要的。
using TyControlSystems
using Random
using TyPlot
Tf = 8
Ts = 0.02
uSq, t = gensig(:square, 2, Tf=Tf, Ts=Ts)
uPu, t = gensig(:pulse, 1.5, Tf=Tf, Ts=Ts)
u = [uSq; uPu]
size(u)
ans = (2, 401)
u的每一列 u[:, i] 是在相应的时间 t[i] 作用于输入的信号 [u1, u2]。
也可以组合不是用 gensig 创建的信号,前提是它们具有相同的长度。
例如,假设想模拟一个三输入系统,将 uSq 应用于第一个输入,将 uPu 应用于第二个输入并对第三个输入应用从 0 开始,并在最终 Tf = 8 时增加到 1 的斜坡信号。
确保信号是一个与 uSq 和 uPu 长度相同的列向量。然后将其与其他信号结合起来创建输入矩阵。
uRa = LinRange(0, 1, 401)'
u = [uSq; uPu; uRa]
size(u)
ans = (3, 401)
绘制第三个输入信号
plot(t, u[3, :])
现在可以使用 u 和 t 来模拟一个三输入模型。生成一个三输入两输出的状态空间模型,并模拟其两个输出对 u 施加于输入的响应。
Random.seed!(1234)
sys = rss(3, 2, 3)
lsim(sys, u, t)

# 输入参数
type - 周期信号的类型符号
要生成的周期信号类型,指定为以下符号之一:
- :sin:正弦波信号;
- :square:方波信号;
- :pulse:周期性脉冲信号。
所有信号都具有单位振幅,且在 t=0 时初始值为 0。
数据类型: Symbol
tau - 周期正整数
所生成信号的周期,指定为正整数,以要使用 lsim 模拟的系统的时间单位(目前只支持:秒(seconds))进行表示。例如,如果要生成一个信号以模拟 30 秒周期的 sys,请将 tau 设置为 30。
数据类型: Int
# 名称-值对组参数
Tf - 持续时间正实数
模拟信号的持续时间,指定为正实数,默认为 5*tau。输出向量 t 的形式为 0:Ts:Tf,以要使用 lsim 模拟的系统的时间单位(目前只支持:秒(seconds))进行表示,其中时间步长由 Ts 设置。
数据类型: Float | Int
Ts - 时间步长正实数
时间步长,指定为正实数,默认为 tau/64。输出向量 t 的形式为 0:Ts:Tf,以要使用 lsim 模拟的系统的时间单位(目前只支持:秒(seconds))进行表示。当模拟离散时间模型时域响应时,将 Ts 设置为模型的采样时间。
数据类型: Float | Int
# 输出参数
u - 生成的信号向量
生成的信号,返回为与 t 长度相同的向量。信号的形状由类型 type 决定。信号具有单位振幅,基值为 0。
数据类型: Float | Int
t - 时间向量向量
时间向量,返回为 0:Ts:Tf 形式的向量。
数据类型: Float | Int