网站首页 > 技术文章 正文
在做信号处理、控制等软件程序时,经常会需要将一个s域的传递函数变成实际可执行的代码。如果不是经常遇到,估计得查资料查半天才能找到方法。为了方便自己和大家以后遇到同样的问题不再走冤枉路,今天把整个顺序做一个记录和说明。
做信号处理,离不开强大的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])
然后将其变为数字系统的传递函数,采样时间为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代码中。
猜你喜欢
- 2024-12-07 理工男用数学建模解锁“脱单攻略”,三天后就脱单了
- 2024-12-07 用C语言重新实现Matlab的FFT函数,不使用第三方库
- 2024-12-07 如何使用现有工具三分钟之内从无到有设计一款滤波器?
- 2024-12-07 基于 PID 控制的离散控制系统实现
- 2024-12-07 自动控制原理PID算法示例理解
- 2024-12-07 反激峰值电流光耦补偿设计基础
- 2024-12-07 IIR数字滤波器原理及实现方法
- 2024-12-07 Simulink的回调函数(一)
- 2024-12-07 自动控制原理-状态空间、多项式、零极点传递函数形式转换
- 2024-12-07 通信QPSK调制,为什么要对数据串并转换?
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)