如何在simulink中测量信号长度?

时间:2018-03-17 17:19:06

标签: matlab simulink

我有“matlab功能块”的模型,其中我有递归最小二乘法。递归算法需要知道输入信号的长度才能正常工作。但是当我使用命令N = length(y)时,它返回我的长度N = 1.但我认为它应该给我更高的长度。 Simulink model

Matlab功能块代码“rls_iden6”

function [P,N] = fcn(u,y)
  %% 
  N = length(y);
  sigma=1;       
  C = sigma*eye(2);      %p
  P = ones(2,1);

  z= [y; u];
  lamda=1;
  for n=1:N
  sample_out = y(n);
  C = (C - ( (C*z*z'*C)/( lamda+(z'*C*z) ) ))/lamda;
  P = P + (C*z* (sample_out - (z'*P)));  
  end

我的最终代码看起来如下所示,因为它在matlab工作区中有效。 Simulink应该给我5个参数,而不仅仅是2个。

load data_cela.mat
  u=U; %input
  y=Y; %output

  %%
  input = 3;
  output = 2;
  system = input + output;   
  N = length(y);              
  %initial conditions
  sigma = 1;        
  C = sigma*eye(system);      
  P = ones(system,1);        
  lamda = 1;               %forgetting factor

  for n=3:N
      for i=1:2
          W(i) = y(n-i);          %output
      end
      for i=1:3
          V(i) = u(n-i+1);        %input
      end
      z = [V';W'];
      sample_out = y(n);
      pom(n)= z' * P;
      error(n) = y(n) - pom(n); 
      C = (C - ( (C*z*z'*C)/( lamda+(z'*C*z) ) ))/lamda;

      P = P + (C*z* (sample_out - (z'*P) ) );
      change(1:system,n) = P;
  end
  f_param = [P(1:3);-P(4:5)];
  num = [P(1:3,1)];
  den = [1;-P(4:5,1)];
  num1 = num(3,1);
  trasferfunction = tf(num1,den',1)

结果:

0.002879
----------------------
z^2 - 1.883 z + 0.8873

1 个答案:

答案 0 :(得分:0)

您需要在信号之前添加一个缓冲区,以将标量转换为矩阵。然后在添加缓冲区后,将缓冲区大小设置为所需的数据量,即通过将其设置为2将产生2行1列。这将帮助您获取数据,但是,为了正确设置延迟,您需要将缓冲区重叠设置为1。

希望这会有所帮助。