作者schizophrena (你很记者你很脑残)
看板C_and_CPP
标题Re: [问题] 转移函数转成C语言
时间Fri Nov 6 02:50:41 2015
双线性转换其实他是有出现频率扭曲的情况
在从s plane 到 z plane上 并不是全部都能对应上的
只能说 在稳定的区间对应是大约对应的 可以去看一下他的推导
在s domain上 是属於 连续时间的控制
而他代表意义是讯号在动态情况之下发生的行为
所以如果你要分析一个转换函数 你可以将他改变成时域的行为
例如: 系统是一个 1/s (s domain) 输入讯号为 f(t) (time domain)
输出就变成 1/s*F(s) ( F(s) = Laplace(f(t))
--> 在时域上就变成 ∫f(t)dt 而在运算的实现就可以用积分的数值方法去作.
但是在z domain就比较简单了
通常一个系统都可写成
Cn*z^n + Cn-1*z^n-1 + ... + Cn2z^2 + Cn1z^1 + Cn0z^0....
(Z转换公式 Sum(Cn*z^(-n))
这就是滤波器的形式
所以你先输入的讯号 就先跟系统较早的状态相乘 也就是作
convolution 你就可以得到结果
例如:
系统是 1*z^0 + 2*z^-1 + 3*z^-3
那就写成 [1, 2, 3]
假设 输入讯号在t=0时为3, t=1时2, t=3时1 是 [3,2,1]
则t=0时, 输出为 1*3 = 3
t=1 3*2+2*1 = 8
t=2时 3*3+2*2+1*1 = 14
.....
我想下面应该可以自己推导出来...
好 作个结论:
1. 知道系统在s-domain的状态 转成大约的z转移函数
2. z转移函数转成幂级数
3. 以输入讯号和系统作convolution 即可得到系统当时的输出值
如果你是要即时得到滤波讯号的结果, 这麽作就可以
通常转移函数是用来作分析的
因为如果你的输入讯号是不可预测的, 你也不会知道你的输入会是什麽函数.
而既然知道s,z domain的系统状态, 你就一定会以回推时域的系统状态.
但是在双线性转换要先提醒的是, 你要先知道你的系统的频率.
数位讯号系统很重要的是取样频, 在s domain里, s可以代成 jw
j代表虚数符号, w = 2pi/T, T就是取样频.
你要转成z domain, 你也要先知道取样频, 你才能作之後的转换.
※ 引述《Jhih8051 (ARM)》之铭言:
: 更新一下目前进度,
: 依照上次各位大大的建议,读了一些z trasform的资料,
: 目前需要将s domain转换至z domain,
: 但却不知该如何转换,
: 信号与系统似乎也没教这一块...
: 不过网路上有找到s to z互相转换的表
: 网址 : http://lpsa.swarthmore.edu/LaplaceZTable/LaplaceZFuncTable.html
: 另外也在网路上看到一个叫tustin(中文 : 双线性转换)的定理,
: 主要是把s 代成 2(z-1)/T(z+1)
: 但我发现转换後与s to z转换表结果居然不一样(例如: 1/s代出来不会是z/z-1),
: 不知道究竟哪一个才是对的...
: 另外最近也先尝试用C实现一些简单的z domain的函式,
: 发现如果函式很复杂,还真不知该如何实现,
: 不知道这方面有没有书或资料可以参考?
: 感谢各位大大的指导<(_ _)>
: ※ 引述《Jhih8051 (ARM)》之铭言:
: : 请问各位大大,
: : 如何将控制系统中的转移函数(transfer function)用C语言来实现呢?
: : 在MATLAB与Simulink都可以直接使用S domain来表示,
: : 例如G(s) = (S-1) / (S-2)(S-3)(S-4)
: : 这在上述的模拟软体中,都可以很值观的照着key,
: : 但对於如何用C语言来实作是完全没有概念...
: : 顺便一提,小弟的专长是用C语言写单晶片控制,
: : 但碰到这个却完全没有头绪...
: : 还请各位大大解惑,感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.13.187
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1446749445.A.CE4.html
※ 编辑: schizophrena (123.195.13.187), 11/06/2015 02:54:40
※ 编辑: schizophrena (123.195.13.187), 11/06/2015 03:15:34
1F:推 laladeer: 我试试看 谢谢罗 11/06 09:39