双线性变换对系统进行离散化
01 系统离散化
一、双线性方法
对于一个连续系统的系统函数, 使用双线性方法可以非常简便的将其转换成离散时间系统。 这是双线性转换公式, 其中的 Ts 是离散时间间隔。 这是对该系统进行离散化之后, 对应的离散时间系统有理分式。 下面对 Ts 取不同数值, 测试一下对应系统的单位冲激响应。
from headm import *
from sympy import symbols,simplify,expand,print_latex
from sympy import *
s,z,t = symbols('s,z,t')
Ts = symbols('T_s')
s = 2/Ts*(1-1/z)/(1+1/z)
Hz = 4/(s+1)/(s+4)
result = cancel(Hz)
print_latex(result)
_=tspexecutepythoncmd("msg2latex")
clipboard.copy(str(result))
二、仿真结果
下面通过 Python 对离散化的系统进行仿真。 这是离散系统时间间隔为 1 秒时系统的单位冲激响应。 可以看到离散时间系统的序列波形于连续时间系统还是有很大的差别的。 这是将时间间隔缩短到0.5秒, 系统的单位冲激响应更加密集, 和连续时间系统单位冲激响应还是有区别。 将时间间隔缩短到0.1秒, 此时离散时间系统输出序列与连续时间系统波形基本重叠了。 这里显示了时间间隔从1秒钟到0.02秒变化过程对应的输出序列波形。
from headm import *
from scipy import signal
T_range = 10
pltgif = PlotGIF()
def Hz(Ts):
num = int(T_range/Ts)
td = linspace(0, T_range, num)
td, yd = signal.dimpulse(([2*Ts**2, 4*Ts**2, 2*Ts**2],
[(2*Ts**2+5*Ts+2),(4*Ts**2-4),(2*Ts**2-5*Ts+2)], Ts), t=td)
t = linspace(0, T_range, 10000)
t,y = signal.impulse(([4],[1,5,4]), T=t)
plt.clf()
plt.plot(t,y,lw=1)
markerline,_,_ = plt.stem(td, squeeze(yd)/Ts, 'r')
plt.setp(markerline, markersize=5)
plt.title('Ts=%f'%Ts)
plt.xlabel("t")
plt.ylabel("y(t)")
plt.grid(True)
plt.tight_layout()
plt.draw()
plt.pause(.01)
pltgif.append(plt)
for i in range(50):
Hz(1/(i+1))
pltgif.save()
printf('a')
▲ 图1.1.1 Ts等于1s 对应的单位冲激响应
▲ 图1.1.2 不同 Ts 对应的单位冲激响应
※ 总 结 ※
本文对于双线性变换方法 将连续时间系统进行离散化进行了测试, 对于不同的离散时间间隔, 仿真了离散时间系统与连续时间系统的单位冲激响应的波形。 可以看到, 当时间间隔越小, 离散时间系统的单位冲激响应越接近连续时间系统。 这一点与脉冲信号不变方法不同, 双线性方法在一定程度上避免了系统中频率混叠的问题。
● 相关图表链接: