信号与系统在仿真中的离散化

本文介绍了信号与系统中的离散化方法,包括一阶、二阶惯性环节和滞后环节的传递函数,以及Matlab中实现s域到z域变换的五种方法,如零阶保持法、双线性变换法等。同时,讨论了不同离散化方法对系统稳定性和频率响应的影响,特别强调了Tustin双线性变换法作为主流方法的原因。

几种信号与系统里的典型环节传递函数

给定一个跃阶信号输入,各个系统的响应如下各图:
一阶惯性环节的微分方程:
Tx˙+x=y T\dot x+x = y Tx˙+x=y
在这里插入图片描述

二阶惯性环节的微分方程:
T2x¨+2ζTx˙+x=y T^2\ddot x+ 2\zeta T\dot x +x = y T2x¨+2ζTx˙+x=y
在这里插入图片描述

滞后环节的微分方程:
x(t−τ)=y x(t-\tau) = y x(tτ)=y
滞后环节的图线是滞后一定时间的跃阶函数,这里就不画了。
一阶惯性环节的传递函数:
G(s)=1Ts+1 G(s) = \frac{1}{Ts+1} G(s)=Ts+11
二阶惯性环节的传递函数:
G(s)=1T2s2+2ζTs+1 G(s) = \frac{1}{T^2s^2+2\zeta Ts + 1} G(s)=T2s2+2ζTs+11
滞后环节的传递函数:
G(s)=exp(−τs) G(s) = exp(-\tau s) G(s)=exp(τs)

信号与系统中离散化的方法

Matlab中提供了五种离散连续信号的方法实现s域到z域的变换:

zoh零阶保持法;

foh一阶保持法;

tustin双线性变换法;

impulse脉冲响应法;

matched零极点匹配法。

根据z变换的理论,s域到z域最基本的映射关系是:
z=exp(Ts) z = exp(Ts) z=exp(Ts)
这种变化不会使频率发生畸变,但是会发生频率混叠现象,所以很少使用。实际计算中会对其进行简化处理,由连续信号传递函数转化得到近似的离散信号传递函数的模型。其中最简单的是由幂级数展开式的前两项进行变形得到关系式,用一阶后向差分的称为Euler法。
s=z−1T s = \frac{z-1}{T} s=Tz1
同样地,前向差分:
s=1−zT s = \frac{1-z}{T} s=T1z
前向差分和后向差分法近似关系比较简单,而且不改变系统的稳态增益。但是前向差分可能改变系统的稳定性,并产生较大的畸变,一般不采用。后向差分不改变系统的稳定性,同样会产生畸变,但不存在频率混叠。

Tustin双线性变换法(matlab默认方法,也是主流的方法):
s=2Tz−1z+1 s = \frac{2}{T}\frac{z-1}{z+1} s=T2z+1z1
用梯形面积取代数值积分;特点和后向差分类似。但线性范围比后向差分要大。

零极点匹配法:
G(s)=Ks(s+z1)(s+z2)...(s+p1)(s+p2)(s+p3)... G(s) = \frac{K_s(s+z_1)(s+z_2)...}{(s+p_1)(s+p_2)(s+p_3)...} G(s)=(s+p1)(s+p2)(s+p3)...Ks(s+z1)(s+z2)...

G(z)=Kz(z−e−z1T)(z−e−z2T)...(z−e−p1T)(z−e−p2T)(z−e−p3T)... G(z) = \frac{K_z(z-e^{-z_1T})(z-e^{-z_2T})...}{(z-e^{-p_1T})(z-e^{-p_2T})(z-e^{-p_3T})...} G(z)=(zep1T)(zep2T)(zep3T)...Kz(zez1T)(zez2T)...

映射关系为z变换,稳定性不变,频率混叠,没有畸变。

脉冲响应不变法和阶跃响应不变法(零阶保持器法):

多对一变换,频率混叠;稳态增益改变(工程意义不大,不用于控制器设计)

零阶保持器:
G(s)=1−e−Tss G(s) = \frac{1-e^{-Ts}}{s} G(s)=s1eTs

X(z)=(1−z−1)zz−1 X(z) = (1-z^{-1})\frac{z}{z-1} X(z)=(1z1)z1z

一阶保持器:
G(s)=T(1+Ts)(1−e−TsTs)2 G(s) = T(1+Ts)(\frac{1-e^{-Ts}}{Ts})^2 G(s)=T(1+Ts)(Ts1eTs)2

离散化的差分方程

同样地我们使用跃阶函数作为输入,下面gnuplot画出的是用cpp代码输出的图线。
一阶惯性环节的差分方程:
y(k+1)=y(k)+ΔtT(x(k)−y(k)) y(k+1) = y(k) + \frac{\Delta t}{T}(x(k)-y(k)) y(k+1)=y(k)+TΔt(x(k)y(k))

//transfer function is G(s) = 1/(T*s+1)
double FirstOrderOscillation(double y_b,double x,double dt,double T){
    double y;
    y = y_b + dt/T * (x - y_b);
    return y;
}

在这里插入图片描述

二阶惯性环节的差分方程:
y(k+2)=(2−2ζΔtT)y(k+1)+(2ζΔtT−1−Δt2T2y(k))+1T2x(k) y(k+2) = (2-\frac{2\zeta \Delta t}{T})y(k+1)+(\frac{2\zeta \Delta t}{T} - 1 - \frac{{\Delta t}^2}{T^2}y(k))+\frac{1}{T^2}x(k) y(k+2)=(2T2ζΔt)y(k+1)+(T2ζΔt1T2Δt2y(k))+T21x(k)

//transfer function is G(s) = 1/(Tˆ2*sˆ2+2*zeta*T*s+1)
double SecondOrderOscillation(double y_b,double y_bb,double x,double dt,double T,double zeta){
    double y;
    y = (2-2*zeta*dt/T)*y_b + (2*zeta*dt/T - 1 - dt*dt/(T*T))*y_bb + x/(T*T);
    return y;
}

在这里插入图片描述

滞后环节差分方程:
y(k)=x(k−nT) y(k) = x(k-nT) y(k)=x(knT)

static std::vector<double> input_delay;
//transfer function is G(s) = exp(-tau*s)
double Delay(double tau,double x,double dt){
    double y;
    int delayedsteps = int(tau/dt);
    input_delay.insert(input_delay.begin(),x);
    if(input_delay.size() == uint64_t(delayedsteps)){
        y = input_delay.back();
        input_delay.pop_back();
        }
    else {
        y = 0.;
        }
    std::cout<<y<<std::endl;
    return y;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值