我有一个离散传递函数,其分子和分母来自输入端口。在每个采样时间,这些分子和分母向量都会发生变化。
E.g。
@ t == 0
den == [1 0 -1]
@ t == 1
den == [1 0 0 -1]
我需要做些什么才能使传输函数与此一起使用?
我试过了:
SIMULINK不喜欢这样,拒绝运行,抱怨离散传输功能块无法处理可变大小的输入。
这导致信号出现周期性峰值。此外,如果您手动输入值而不是输入值,Simulink不允许您这样做,所以我不认为这是这样做的方式。
非常感谢任何帮助。
答案 0 :(得分:0)
使用单个Simulink S-Function文件sfuntvf.m
可以解决这个问题,就像这样。
在那里,保存了具有y
和u
历史的自定义固定矢量状态,并且时变部分简单地应用于时间历史(以青色和黄色表示);这里是一个具有随机顺序的FIR滤波器(以洋红色描绘)。
其他内置实现应考虑调用之间的过度初始条件,并要求验证初始条件结构。所示的实现是最容易部署和理解的。
可以相应地修改A
和B
向量。
function [sys,x0,str,ts] = sfuntvf(t,x,u,flag)
N=20;
n=randi(N-2)+1;
A=[1;zeros(N-1,1)];
B=[1/n*ones(n,1);zeros(N-n,1)];
switch flag,
case 0, [sys,x0,str,ts] = mdlInitializeSizes(N);
case 2, sys = mdlUpdate(t,x,u,N,A,B);
case 3, sys = mdlOutputs(t,x,u,N,n);
case 9, sys = [];
otherwise DAStudio.error('Simulink:blocks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts] = mdlInitializeSizes(N)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 2*N;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = zeros(2*N,1);
str = [];
ts = [1 0];
function sys = mdlUpdate(t,x,u,N,A,B)
un=x(1:N,1);
yn=x(N+1:2*N,1);
y=-A(2:end)'*yn(2:end)+B'*un;
sys = [u;un(1:end-1);y;yn(1:end-1)];
function sys = mdlOutputs(t,x,u,N,n)
sys = [x(N+1);n];