在控制系统的设计中,我们所设计得到的控制器和滤波器通常都是以s域传递函数的形式给出的,要想在嵌入式系统中实现上述的控制器和滤波器就必须进行传递函数的离散化;下面简单介绍几种由复频域到离散域的转换方法:
已知微分方程 y′=u(t) ,初值为0,离散步长Ts,
向前差分示意图如下
利用欧拉数值积分公式,则有:
yn+1=yn+u(tn)Ts
两边同时取z变换可得:
zY(z)=Y(z)+U(z)Ts
则:
G(z)=z−1Ts
对原式y′=u(t) 进行等式两边拉氏变换:
G(s)=s1
比较z变换与拉氏变换的结果,可得到:
s=Tsz−1
向前差分示意图如下
yn=yn−1+u(tn)Ts
两边同时取Z变换可得:
Y(z)=z−1Y(z)+U(z)Ts
则:
G(z)=z−1zTs
对原式y′=u(t) 进行双边拉氏变换:
G(s)=s1
比较Z变化与拉氏变换的结果,可得到:
s=zTsz−1
一阶向前、向后差分法的依据是积分的矩形法则,有时效果并不好,故出现了依据积分的梯形法则的双线性变换法。
利用梯形的数值积分形式:
yn=yn−1+21(u(tn)+u(tn−1))Ts
两边同时z变换
Y(z)=z−1Y(z)+21(U(z)+z−1U(z))Ts
U(z)Y(z)=2Ts1−z−11+z−1=2Tsz−1z+1
s=Ts2z+1z−1
针对一个用zpk表达的连续系统传函,
G(s)=ks∏i=1m(s−pi)∏i=1n(s−zi)
经双线性变换到离散域后的zpk形式:
G(z)=kz∏i=1m(z−pj′)∏j=1n(z−zi′)
其中
⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧kz=zi′=pj′=ks∏i=1m(2−Tspj)∏i=1n(2−Tszi)2−Tszi2+Tszi2−Tspj2+Tspj
针对三种方法变换后的一阶低通滤波器频响对比:Fs越高,吻合度越高,Fs≥100fc时吻合较为理想。
clc;clear;close all;
Fs=5000;
Ts=1/Fs;
tau=1/(2*pi)*0.02; % Fc=50Hz
n=100000;
fc=1/(tau)/(2*pi);
PosX=1000;
PosY=50;
Width=900;
Height=900;
PlotHiFreq=fc*10;
AxisxFreq=[0.5;PlotHiFreq];
znum1=[0 1];
zden1=[tau/Ts 1-tau/Ts];
znum2=[1 0];
zden2=[1+tau/Ts -tau/Ts];
znum3=[1 1];
zden3=[1+ 2*tau/Ts 1-2*tau/Ts];
[h1,w1]=freqz(znum1,zden1,n);
[h2,w2]=freqz(znum2,zden2,n);
[h3,w3]=freqz(znum3,zden3,n);
figure(1)
set(gcf,'position',[PosX PosY Width Height]);
subplot(2,1,1)
semilogx(w1/(2*pi)*Fs,20*log10(abs(h1)),'r-');hold on;grid on;
semilogx(w2/(2*pi)*Fs,20*log10(abs(h2)),'b-');
semilogx(w3/(2*pi)*Fs,20*log10(abs(h3)),'m-');
semilogx([fc;fc],[-20;0.1],'r');
hLen=legend('Forward Diff','Backward Diff','Tustin');
xlabel('Frequency(Hz)');
ylabel('Gain');
xlim(AxisxFreq);
ylim([-20,0.1]);
subplot(2,1,2)
semilogx(w1/(2*pi)*Fs,rad2deg(angle(h1)),'r-');hold on;grid on;
semilogx(w2/(2*pi)*Fs,rad2deg(angle(h2)),'b-');
semilogx(w3/(2*pi)*Fs,rad2deg(angle(h3)),'m-');
semilogx([fc;fc],[-180;0.1],'r');
hLen=legend('Forward Diff','Backward Diff','Tustin');
xlabel('Frequency(Hz)');
ylabel('Phase(°)');
xlim(AxisxFreq);
ylim([-180,1]);
参考:
https://blog.csdn.net/qq_39554681/article/details/89164395
https://www.docin.com/p-786664690.html