时变传递函数

时间:2017-05-11 14:28:23

标签: matlab simulink

我有一个离散传递函数,其分子和分母来自输入端口。在每个采样时间,这些分子和分母向量都会发生变化。

E.g。

@ t == 0

den == [1 0 -1]

@ t == 1

den == [1 0 0 -1]

我需要做些什么才能使传输函数与此一起使用?

我试过了:

  1. 拥有可变长度的信号。
  2. SIMULINK不喜欢这样,拒绝运行,抱怨离散传输功能块无法处理可变大小的输入。

    1. 用许多前导零填充向量
    2. 这导致信号出现周期性峰值。此外,如果您手动输入值而不是输入值,Simulink不允许您这样做,所以我不认为这是这样做的方式。

      非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用单个Simulink S-Function文件sfuntvf.m可以解决这个问题,就像这样。

在那里,保存了具有yu历史的自定义固定矢量状态,并且时变部分简单地应用于时间历史(以青色和黄色表示);这里是一个具有随机顺序的FIR滤波器(以洋红色描绘)。

其他内置实现应考虑调用之间的过度初始条件,并要求验证初始条件结构。所示的实现是最容易部署和理解的。

可以相应地修改AB向量。

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];

Model Plot