时变传递函数
Time Varying Transfer Function
我有一个离散传递函数,其分子和分母来自输入端口。在每个采样时间,这些分子和分母向量都会发生变化。
例如
@t == 0
den == [1 0 -1]
@t==1
den == [1 0 0 -1]
我需要做什么才能让传递函数与此一起工作?
我试过:
- 具有可变长度信号。
SIMULINK 不喜欢并拒绝 运行,抱怨离散传递函数块无法处理可变大小的输入。
- 用许多前导零填充向量
这导致信号出现周期性尖峰。此外,如果您手动输入值而不是作为输入,Simulink 不允许您执行此操作,因此我认为这也不是执行此操作的方法。
非常感谢任何帮助。
这可以通过单个 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];
我有一个离散传递函数,其分子和分母来自输入端口。在每个采样时间,这些分子和分母向量都会发生变化。
例如
@t == 0
den == [1 0 -1]
@t==1
den == [1 0 0 -1]
我需要做什么才能让传递函数与此一起工作?
我试过:
- 具有可变长度信号。
SIMULINK 不喜欢并拒绝 运行,抱怨离散传递函数块无法处理可变大小的输入。
- 用许多前导零填充向量
这导致信号出现周期性尖峰。此外,如果您手动输入值而不是作为输入,Simulink 不允许您执行此操作,因此我认为这也不是执行此操作的方法。
非常感谢任何帮助。
这可以通过单个 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];