1. 传递函数严格离散化
傅里叶变换、拉普拉斯变换,以及
Z
Z
Z变换的定义如下所示:
傅里叶变换
:
{
F
(
ω
)
=
∫
−
∞
∞
f
(
t
)
e
−
j
ω
t
d
t
f
(
t
)
=
1
2
π
∫
−
∞
∞
F
(
ω
)
e
j
ω
t
d
ω
傅里叶变换:\left\{ \begin{array}{l} F\left( \omega \right) = \int_{ - \infty }^\infty {f\left( t \right){e^{ - j\omega t}}dt} \\ f\left( t \right) = \frac{1}{{2\pi }}\int_{ - \infty }^\infty {F\left( \omega \right){e^{j\omega t}}d\omega } \end{array} \right.
傅里叶变换:{F(ω)=∫−∞∞f(t)e−jωtdtf(t)=2π1∫−∞∞F(ω)ejωtdω
拉普拉斯变换 : { F ( s ) = ∫ − ∞ ∞ f ( t ) e − s t d t f ( t ) = 1 2 π j ∫ σ − j ∞ σ + j ∞ F ( s ) e s t d s 拉普拉斯变换:\left\{ \begin{array}{l} F\left( s \right) = \int_{ - \infty }^\infty {f\left( t \right){e^{ - st}}dt} \\ f\left( t \right) = \frac{1}{{2\pi j}}\int_{\sigma - j\infty }^{\sigma + j\infty } {F\left( s \right){e^{st}}ds} \end{array} \right. 拉普拉斯变换:{F(s)=∫−∞∞f(t)e−stdtf(t)=2πj1∫σ−j∞σ+j∞F(s)estds
Z 变换 : { F ( z ) = ∑ f [ n ] z − n f [ n ] = 1 2 π j ∮ F ( z ) z n − 1 d z Z变换:\left\{ \begin{array}{l} F\left( z \right) = \sum {f\left[ n \right]{z^{ - n}}} \\ f\left[ n \right] = \frac{1}{{2\pi j}}\oint {F\left( z \right){z^{n - 1}}dz} \end{array} \right. Z变换:{F(z)=∑f[n]z−nf[n]=2πj1∮F(z)zn−1dz
可以利用如下映射关系,实现传递函数 F ( s ) F(s) F(s)、 F ( ω ) F(\omega) F(ω)与 F ( z ) F(z) F(z)之间的等价转换,详见《信号与系统》的“离散系统的Z域分析”章节:
s = j ω = 1 T ln z ,或, z = e s T = e j ω T s = j\omega = \frac{1}{T}\ln z,或,z = {e^{sT}} = {e^{j\omega T}} s=jω=T1lnz,或,z=esT=ejωT
2. 离散化方法,前向欧拉,前向差分
对于一个连续函数
y
(
t
)
y(t)
y(t)在
k
T
kT
kT时刻的微分可以做以下近似:
y
′
(
k
)
≈
y
(
k
+
1
)
−
y
(
k
)
T
y'(k) \approx \frac{{y(k + 1) - y(k)}}{T}
y′(k)≈Ty(k+1)−y(k)
对上式的左右两端分别进行拉氏变换和Z变换,可以得到如下映射关系:
s
Y
(
s
)
↔
z
−
1
T
Y
(
z
)
sY(s) \leftrightarrow \frac{{z - 1}}{T}Y(z)
sY(s)↔Tz−1Y(z)
因此,可以令 s = z − 1 T s = \frac{{z - 1}}{T} s=Tz−1实现S域传递函数到Z域传递函数的转换。值得注意的是,这种传递函数离散化是近似的, s = 1 T ln z s=\frac{1}{T}\ln z s=T1lnz才是严格的,但并不方便数字实现。实际上, s = z − 1 T s = \frac{{z - 1}}{T} s=Tz−1正是 s = 1 T ln z s=\frac{1}{T}\ln z s=T1lnz,在 s = 0 s=0 s=0即 z = 1 z=1 z=1时的近似表示。这种方法将 s s s域左半平面映射到 z z z域 z < 1 z<1 z<1区域,显然包含不稳定区域,因此稳定的连续系统变换所得离散系统可能不稳定,这种方法很少用。
3. 离散化方法,后向欧拉,后向差分
同理还有后向差分,将
y
(
t
)
y(t)
y(t)在
k
T
kT
kT时刻的微分做以下近似:
y
′
(
k
)
≈
y
(
k
)
−
y
(
k
−
1
)
T
y'(k) \approx \frac{{y(k) - y(k - 1)}}{T}
y′(k)≈Ty(k)−y(k−1)
对上式的左右两端分别进行拉氏变换和Z变换,可以得到如下映射关系:
s
Y
(
s
)
↔
1
−
z
−
1
T
Y
(
z
)
sY(s) \leftrightarrow \frac{{1 - z^{-1}}}{T}Y(z)
sY(s)↔T1−z−1Y(z)
因此,可以令
s
=
1
−
z
−
1
T
s = \frac{{1 - z^{-1}}}{T}
s=T1−z−1实现S域传递函数到Z域传递函数的转换。实际上,
s
=
1
−
z
−
1
T
s = \frac{{1 - z^{-1}}}{T}
s=T1−z−1也是
s
=
1
T
ln
z
s=\frac{1}{T}\ln z
s=T1lnz,在
s
=
0
s=0
s=0即
z
=
1
z=1
z=1时的近似表示。这种方法将
s
s
s域左半平面映射到
z
z
z域以0.5为圆心0.5为半径的圆,也就是说,原来连续系统稳定,则离散系统稳定。
4. 离散化方法,双线性变换,Tustin
由于
z
=
e
s
T
=
e
s
T
/
2
e
−
s
T
/
2
≈
1
+
s
T
/
2
1
−
s
T
/
2
z = {e^{sT}} = \frac{{{e^{sT/2}}}}{{{e^{ - sT/2}}}} \approx \frac{{1 + sT/2}}{{1 - sT/2}}
z=esT=e−sT/2esT/2≈1−sT/21+sT/2,分子分母进行一阶泰勒线性展开,故得名双线性变换。进一步可以得到:
s
=
2
T
1
−
z
−
1
1
+
z
−
1
s = \frac{2}{T}\frac{{1 - z^{-1}}}{{1 + z^{-1}}}
s=T21+z−11−z−1
该方法将且s左半平面映射到z域单位圆内,这是我们很希望看到的结果。
5. 离散化方法,预矫正双线性变换,Tustin with Pre-Warping
5.1 问题描述
上述方法均可实现连续系统的离散化,但因为离散化过程中采用了近似化手段,不可避免地引入了误差,使得离散化后的频域特性并不完全等价于连续系统,以下以双线性变换为例,进行说明。设计电网系统的五次谐波消抑制传递函数:
C
a
(
s
)
=
K
i
s
s
2
+
(
2
π
∗
250
)
2
{C_a}(s){\rm{ = }}\frac{{{K_i}s}}{{{s^2} + {{(2\pi {\rm{*}}250)}^2}}}
Ca(s)=s2+(2π∗250)2Kis
取
K
i
=
1
K_i=1
Ki=1,采用双线性变换
s
=
2
T
z
−
1
z
+
1
s=\frac{2}{T} \frac{z-1}{z+1}
s=T2z+1z−1进行离散化,其中T取0.001,得到离散化后的传递函数:
C
d
(
z
)
=
C
a
(
s
)
∣
s
=
2
T
z
−
1
z
+
1
=
K
i
(
2
T
z
−
1
z
+
1
)
(
2
T
z
−
1
z
+
1
)
2
+
(
2
π
∗
250
)
2
=
2000
z
2
−
2000
[
2000
2
+
(
2
π
∗
250
)
2
]
z
2
+
2
[
(
2
π
∗
250
)
2
−
2000
2
]
z
+
[
(
2
π
∗
250
)
2
+
2000
2
]
{C_d}(z) = {C_a}(s){|_{s = \frac{2}{T}\frac{{z - 1}}{{z + 1}}}}{\rm{ = }}\frac{{{K_i}(\frac{2}{T}\frac{{z - 1}}{{z + 1}})}}{{{{\left( {\frac{2}{T}\frac{{z - 1}}{{z + 1}}} \right)}^2} + {{(2\pi {\rm{*}}250)}^2}}} = \frac{{2000{z^2} - 2000}}{{\left[ {{{2000}^2} + {{(2\pi {\rm{*}}250)}^2}} \right]{z^2} + 2\left[ {{{(2\pi {\rm{*}}250)}^2} - {{2000}^2}} \right]z + \left[ {{{(2\pi {\rm{*}}250)}^2} + {{2000}^2}} \right]}}
Cd(z)=Ca(s)∣s=T2z+1z−1=(T2z+1z−1)2+(2π∗250)2Ki(T2z+1z−1)=[20002+(2π∗250)2]z2+2[(2π∗250)2−20002]z+[(2π∗250)2+20002]2000z2−2000
利用如下代码,对比连续传递函数和离散传递函数的波特图:
a=(2*pi*250)^2;
b=2000^2;
Ca = tf([1,0],[1 0 a]);
Cd = tf([2000 0 -2000],[b+a 2*a-2*b b+a],0.001);
bode(Ca, Cd)
legend('Ca','Cd')
当然,也可以利用matlab实现双线性变换,两者效果是一致的(更多函数介绍请参考matlab函数用法:传递函数tf,波特图bode,离散化c2d):
Ca = tf([1,0],[1 0 (2*pi*250)^2]);
Cd = c2d(Ca,0.001,'tustin');
bode(Ca, Cd);
legend('Ca','Cd')
连续传递函数和离散传递函数的波特图对比结果如下所示。可以看出,近似的离散化过程使得离散传递函数特性发生了改变,离散化后传递函数的特性与所设计连续传递函数的特性不一致。
5.2 解决方案
对离散化所引入的误差进行分析,
C
d
(
z
)
C_d(z)
Cd(z)代表数字控制器,
C
a
(
s
)
C_a(s)
Ca(s)代表模拟控制器,两者之间的转换关系如下:
C
a
(
s
)
∣
s
=
2
T
z
−
1
z
+
1
=
C
d
(
z
)
{C_a}(s){|_{s = \frac{2}{T}\frac{{z - 1}}{{z + 1}}}} = {C_d}(z)
Ca(s)∣s=T2z+1z−1=Cd(z)
下面探究一下
C
a
(
s
)
∣
s
=
2
T
z
−
1
z
+
1
{C_a}(s){|_{s = \frac{2}{T}\frac{{z - 1}}{{z + 1}}}}
Ca(s)∣s=T2z+1z−1所对应的真实连续系统,注:
sin
α
=
−
j
0.5
(
e
j
α
−
e
−
j
α
)
,
cos
α
=
0.5
(
e
j
α
+
e
−
j
α
)
\sin \alpha = - j0.5\left( {{e^{j\alpha }} - {e^{ - j\alpha }}} \right), \cos \alpha = 0.5\left( {{e^{j\alpha }} + {e^{ - j\alpha }}} \right)
sinα=−j0.5(ejα−e−jα),cosα=0.5(ejα+e−jα):
{
c
C
a
(
s
)
∣
s
=
2
T
z
−
1
z
+
1
=
C
a
(
2
T
e
s
T
−
1
e
s
T
+
1
)
=
C
a
(
2
T
e
j
ω
T
−
1
e
j
ω
T
+
1
)
=
C
a
[
2
T
e
j
ω
T
2
(
e
j
ω
T
2
−
e
−
j
ω
T
2
)
e
j
ω
T
2
(
e
j
ω
T
2
+
e
−
j
ω
T
2
)
]
=
C
a
[
j
∗
2
T
tan
(
ω
T
2
)
]
\left\{ \begin{aligned}{c} {C_a}(s){|_{s = \frac{2}{T}\frac{{z - 1}}{{z + 1}}}} &= {C_a}(\frac{2}{T}\frac{{{e^{sT}} - 1}}{{{e^{sT}} + 1}})\\ &= {C_a}\left( {\frac{2}{T}\frac{{{e^{j\omega T}} - 1}}{{{e^{j\omega T}} + 1}}} \right)\\ &= {C_a}\left[ {\frac{2}{T}\frac{{{e^{j{\textstyle{{\omega T} \over 2}}}}\left( {{e^{j{\textstyle{{\omega T} \over 2}}}} - {e^{ - j{\textstyle{{\omega T} \over 2}}}}} \right)}}{{{e^{j{\textstyle{{\omega T} \over 2}}}}\left( {{e^{j{\textstyle{{\omega T} \over 2}}}} + {e^{ - j{\textstyle{{\omega T} \over 2}}}}} \right)}}} \right]\\ &= {C_a}\left[ {j*\frac{2}{T}\tan \left( {\frac{{\omega T}}{2}} \right)} \right] \end{aligned} \right.
⎩
⎨
⎧cCa(s)∣s=T2z+1z−1=Ca(T2esT+1esT−1)=Ca(T2ejωT+1ejωT−1)=Ca
T2ej2ωT(ej2ωT+e−j2ωT)ej2ωT(ej2ωT−e−j2ωT)
=Ca[j∗T2tan(2ωT)]
C d ( z ) {C_d}(z) Cd(z)并不对应 C a ( j ω ) {C_a}(j\omega) Ca(jω),而对应 C a [ j 2 T tan ( ω 2 T ) ] {C_a}\left[ {j\frac{2}{T}\tan \left( {\frac{\omega }{2}T} \right)} \right] Ca[jT2tan(2ωT)],离散系统的 ω \omega ω会映射到连续系统的 2 T tan ( ω T 2 ) \frac{2}{T}\tan \left( {\frac{\omega T}{2}} \right) T2tan(2ωT),这就是频率畸变现象。也就是说,分别以 ω \omega ω为横轴画出 C d ( z ) C_d(z) Cd(z)的波特图,和以 2 T tan ( ω 2 T ) \frac{2}{T}\tan \left( {\frac{\omega }{2}T} \right) T2tan(2ωT)为横轴画出 C a ( s ) C_a(s) Ca(s)的波特图,两个波形图应该是完全对应的。当 ω T 2 \frac{\omega T}{2} 2ωT足够小时, j 2 T tan ( ω 2 T ) {j\frac{2}{T}\tan \left( {\frac{\omega }{2}T} \right)} jT2tan(2ωT)是近似等于 j ω j\omega jω的。但对于高频谐波,或者特定频率的分析,就不得不考虑这部分影响了。
回顾上述所设计 C a ( s ) C_a(s) Ca(s)时,对于 2 π ∗ 250 2\pi*250 2π∗250 rad/s的角速度变化,传递函数取得最大值。由于离散系统的 ω \omega ω会映射到连续系统的 2 T tan ( ω T 2 ) \frac{2}{T}\tan \left( {\frac{\omega T}{2}} \right) T2tan(2ωT),利用 2 T tan ( ω T 2 ) = 2 π ∗ 250 \frac{2}{T}\tan \left( {\frac{\omega T}{2}} \right) = 2\pi*250 T2tan(2ωT)=2π∗250求解离散系统的原始 ω \omega ω,解得 ω = 1331.5 \omega = 1331.5 ω=1331.5 rad/s,这与上述波特图结果是一致的。
解决方案:离散系统的 ω d \omega_d ωd会映射到连续系统的 ω a = 2 T tan ( ω d T 2 ) \omega_a = \frac{2}{T}\tan \left( {\frac{\omega_d T}{2}} \right) ωa=T2tan(2ωdT),基于 ω a \omega_a ωa完成连续传递函数的设计,采用双线性变换得到目标离散传递函数。正确的设计思路为:(1)首先,明确所需要的离散传递函数的特性,如希望在 ω d = 2 π ∗ 250 \omega_d = 2\pi*250 ωd=2π∗250 rad/s时,离散传递函数取最大值;(2)计算上述离散频率所映射的连续频率, ω a = 2 T tan ( ω d T 2 ) = 2000 \omega_a = \frac{2}{T}\tan \left( {\frac{\omega_d T}{2}} \right) = 2000 ωa=T2tan(2ωdT)=2000 rad/s = 318 Hz;(3) 基于映射的连续角频率 ω a \omega_a ωa设计连续传递函数, C a ( s ) = K i s s 2 + 200 0 2 {C_a}(s){\rm{ = }}\frac{{{K_i}s}}{{{s^2} + {2000^2}}} Ca(s)=s2+20002Kis,并完成离散化, C d ( z ) = C a ( s ) ∣ s = 2 T z − 1 z + 1 = K i ( 2 T z − 1 z + 1 ) ( 2 T z − 1 z + 1 ) 2 + 200 0 2 {C_d}(z) = {C_a}(s){|_{s = \frac{2}{T}\frac{{z - 1}}{{z + 1}}}}{\rm{ = }}\frac{{{K_i}(\frac{2}{T}\frac{{z - 1}}{{z + 1}})}}{{{{\left( {\frac{2}{T}\frac{{z - 1}}{{z + 1}}} \right)}^2} + {2000^2}}} Cd(z)=Ca(s)∣s=T2z+1z−1=(T2z+1z−1)2+20002Ki(T2z+1z−1)。
基于如下代码重绘波特图。可以看出,尽管连续传递函数在2000 rad/s (318Hz)处实现最大增益,离散传递函数在目标频率点1570 rad/s (250Hz)处取得最大增益,与预期一致。
Ca = tf([1,0],[1 0 (2000)^2]);
Cd = c2d(Ca,0.001,'tustin');
bode(Ca, Cd);
legend('Ca','Cd')
6. 总结
对离散化的简单场景,优先考虑后向差分离散化方法;对于频率有较高准确度的场景,如谐振控制器,建议使用预矫正双线性变换方法。