Matlab 用 c2d 函数进行连续时间到离散时间的变换。c2d 提供了 zoh foh impulse tustin matched least-squares 几种离散化方法,能满足大多数应用需求。但有时你可能希望实现自己的离散化方法,这正是本文要讲的内容。

c2d 函数

常用的离散化方法是 ZOH(零阶保持)和 Tustin 近似(双线性近似),在 c2d 函数中分别称为 zoh 和 tustin。c2d 的语法是

sysd = c2d(sys,Ts)
sysd = c2d(sys,Ts,method)
sysd = c2d(sys,Ts,opts)
[sysd,G] = c2d(sys,Ts,method)
[sysd,G] = c2d(sys,Ts,opts)

ZOH(后向差分)

z=\cfrac{1}{1-sT_s}
s=\cfrac{1-z^{-1}}{T_s}

Tustin 近似

不做频率预畸变

在连续时间系统和离散化系统之间,Tustin(双线性)近似在频域上的匹配效果最好。

z=e^{sT_s}\approx\cfrac{1+sT_s/2}{1-sT_s/2}
s=\cfrac{2}{T_s}\cfrac{1-z^{-1}}{1+z^{-1}}

做频率预畸变

这种方法保证连续时间响应和离散时间响应在预畸变频率处相匹配。

s=\cfrac{\omega_{prewarp}}{\tan(\omega_{prewarp}T_s/2)}\cfrac{1-z^{-1}}{1+z^{-1}}

任意离散化

我们可以用 Matlab 的符号运算实现任意离散化。以一阶低通滤波器(LPF)为例

H_{LPF}(s) = \cfrac{\omega_c}{s+\omega_c}

假设 \omega_c=200\pi\ \mathrm{rad/s},T_s=10^{-3}\ s,用 c2d

omega_s = 200*pi;
T_s     = 1e-3;
Hs_LPF  = tf(omega_s, [1 omega_s]);
Hz_LPF  = c2d(Hs_LPF,T_s,'tustin');

结果是

Hz_LPF =

  0.2391 z + 0.2391
  -----------------
     z - 0.5219

Sample time: 0.001 seconds
Discrete-time transfer function.

符号运算

syms s z
Ss_LPF = omega_s / (s + omega_s);
Sz_LPF = subs(Ss_LPF,s,2/T_s * (1-z^-1) / (1+z^-1));
[Snum,Sden] = numden(Sz_LPF);

num = flip(eval(coeffs(Snum)));
den = flip(eval(coeffs(Sden)));

num = num./den(1);
den = den./den(1);

Hz_LPF = tf(num,den,T_s);

得到的 Hz_LPF 与 c2d 的结果相同。

Hz_LPF =

  0.2391 z + 0.2391
  -----------------
     z - 0.5219

Sample time: 0.001 seconds
Discrete-time transfer function.

说明

subs

符号替换。subs(s,old,new) 返回 s 的一个副本,把其中所有的 old 替换为 new,然后对 s 求值。

numden

提取分子和分母。[N,D] = numden(A) 将 A 化为有理形式,其分子和分母是互质的整系数多项式。该函数返回表达式有理形式的分子和分母。

如果 A 是符号矩阵或数值矩阵,则 N 是由分子组成的符号矩阵,D 是由分母组成的符号矩阵。N 和 D 都是与 A 大小相同的矩阵。

coeffs

多项式的系数。C = coeffs(p) 返回多项式 p 关于 symvar 在 p 中确定的所有变量的系数。系数按从低次到高次的顺序排列。 例如:

syms x
c = coeffs(16*x^2 + 19*x + 11)
>> c = [ 11, 19, 16]

因此,需要用 flip 函数把结果转换成 tf(num,den) 的格式。


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注