时变传递函数

Time Varying Transfer Function

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

例如

@t == 0

den == [1 0 -1]

@t==1

den == [1 0 0 -1]

我需要做什么才能让传递函数与此一起工作?

我试过:

  1. 具有可变长度信号。

SIMULINK 不喜欢并拒绝 运行,抱怨离散传递函数块无法处理可变大小的输入。

  1. 用许多前导零填充向量

这导致信号出现周期性尖峰。此外,如果您手动输入值而不是作为输入,Simulink 不允许您执行此操作,因此我认为这也不是执行此操作的方法。

非常感谢任何帮助。

这可以通过单个 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];