# 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

# 另请参阅

lsim