做旗子暗记处理,离不开强大的matlab,以是这里做的解释以matlab和C措辞作为例子。如果要转换成别的措辞,差别不大。
整体转换的顺序为:S域通报函数--->通过matlab转换为Z域通报函数---->转换为C代码。
首先,拿到一个S域的通报函数,其表达办法类似于如下图片所示:

连续通报函数
那么如何将这个通报函数转换为Z域通报函数(数字化)呢?用matlab的c2d函数。
c2d最常用的参数形式为:
sysd = c2d(sys,Ts,method)
个中sys表示连续系统通报函数,Ts表示采样韶光,method表示转换的方法。
method可以选5种:
‘zoh’,表示零阶保持器,这也是默认的方法。‘foh’,表示三角近似法(修正的零阶保持器)。‘impulse’,表示脉冲相应不变法。‘tustin’,表示双线性变换法。‘matched’,表示零极点匹配法。那么sys又是怎么得到的呢?
掌握系统中的通报函数G(s)常日描述为:
通报函数表达式
在matlab中,用tf函数来得到:
sys = tf(num,den)
num=[b0 b1 b2 .... bm] 是分子,den=[a0 a1 a2 .... an]是分母。
好了,回到最初的例子,将其表达式转换为matlab模型:
H=tf([1 1],[1 4 5])
matlab结果
然后将其变为数字系统的通报函数,采样韶光为1ms:
HD=c2d(H,0.001,‘zoh’)
得到的离散数字域通报函数
其他几种变换方法,大家可以自己试一下,看当作果有何不同。
好了,得到了Z域通报函数,接下去便是要把通报函数变为可实行的C代码,代码中x表示输入,y表示输出。把分子和分母都除以z^2可得:
DSP形式的通报函数
按照这个公式带入
用C措辞的数组x[3],y[3],分别来存储输入和输出的值,x[0]=x(n),x[1]=x(n-1)..以此类推,上面的公式可以表示为:
y[0]=x[0]0+x[1]0.0009985-x[2]0.0009975+y[1]1.996-y[2]0.996;
x[2]=x[1];
x[1]=x[0];
y[2]=y[1];
y[1]=y[0];
代码中,y[0]就表示当前运算周期的输出,x[0]表示当前周期的输入。
到此,一个S域通报函数就被我们给搬到了C代码中。