专业编程基础技术教程

网站首页 > 基础教程 正文

如何将一个传递函数变成代码

ccvgpt 2024-08-09 11:50:59 基础教程 14 ℃

在做信号处理、控制等软件程序时,经常会需要将一个s域的传递函数变成实际可执行的代码。如果不是经常遇到,估计得查资料查半天才能找到方法。为了方便自己和大家以后遇到同样的问题不再走冤枉路,今天把整个顺序做一个记录和说明。

做信号处理,离不开强大的matlab,所以这里做的说明以matlab和C语言作为例子。如果要转换成别的语言,差别不大。

如何将一个传递函数变成代码

整体转换的顺序为:S域传递函数--->通过matlab转换为Z域传递函数---->转换为C代码。

首先,拿到一个S域的传递函数,其表达方式类似于如下图片所示:

那么如何将这个传递函数转换为Z域传递函数(数字化)呢?用matlab的c2d函数。

c2d最常用的参数形式为:

sysd = c2d(sys,Ts,method)

其中sys表示连续系统传递函数,Ts表示采样时间,method表示转换的方法。

method可以选5种:

  1. ‘zoh’,表示零阶保持器,这也是默认的方法。
  2. ‘foh’,表示三角近似法(修改的零阶保持器)。
  3. ‘impulse’,表示脉冲响应不变法。
  4. ‘tustin’,表示双线性变换法。
  5. ‘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])

然后将其变为数字系统的传递函数,采样时间为1ms:

HD=c2d(H,0.001,‘zoh’)

其他几种变换方法,大家可以自己试一下,看看结果有何不同。

好了,得到了Z域传递函数,接下去就是要把传递函数变为可执行的C代码,代码中x表示输入,y表示输出。把分子和分母都除以z^2可得:

用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代码中。

Tags:

最近发表
标签列表