【问题标题】:Time Varying Transfer Function时变传递函数
【发布时间】:2017-05-11 14:28:23
【问题描述】:

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

例如

@t == 0

den == [1 0 -1]

@t == 1

den == [1 0 0 -1]

我必须做什么才能让传输函数使用它?

我试过了:

  1. 具有可变长度信号。

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

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

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

非常感谢任何帮助。

【问题讨论】:

  • 分母(或任何其他过滤器参数)多久更改一次?它们会随着t 的每次变化而变化,还是会交替变化、周期性变化或非周期性变化?它不能开箱即用也就不足为奇了,因为许多内置的 MATLAB/SIMULINK 函数都假定时间不变性。
  • @fiveclubs。他们不会在每一步都改变。它们每隔几秒(约 5-15 秒)就会改变一次,频率不是恒定的,因为它是由事件驱动的。
  • 使用单个积分器和增益块构建您的传递函数,并在其间包含事件驱动开关。
  • @thewaywewalk。我不完全确定我明白你的意思。你能扩大一点吗?
  • 每个传递函数都由积分器和微分器组成,每个都有一个增益。因此,请尝试将您的传递函数分解为尽可能多的单个块。优选使用积分器。这样你就可以控制每一个增益。

标签: matlab simulink


【解决方案1】:

这可以通过单个 Simulink S-Function 文件 sfuntvf.m 轻松解决,就像这样。

在那里,保存了具有yus 历史的自定义固定向量状态,并且时变部分简单地应用于时间历史(以青色和黄色表示);这里是一个随机顺序的 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];

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多