Octave相当于MATLAB ltitr.m函数

时间:2014-09-18 16:31:15

标签: matlab signal-processing octave

我试图让一些MATLAB脚本在Octave中运行,但是对以下代码行有问题:

x = ltitr( a, b, u, x0 ) ;

在Octave中抛出错误。

在线研究表明,ltitr函数是一个内部MATLAB函数,它返回给定输入的线性时不变时间响应内核。这听起来好像它应该是一个常见的DSP要求,所以我觉得这必须直接在Octave中实现,或者在Source Forge的最新Control包中实现。但是,我似乎无法找到Octave等效物。我已经阅读了最新Octave Control软件包的文档,也许我应该使用lsim.m或ss.m或dss.m或impulse.m这些函数,但我并不确定。

任何人都可以开导我吗?如果它没有在Octave中实现,也许在线参考我可以用来编写我自己的ltitr函数的代码?

1 个答案:

答案 0 :(得分:3)

如果您在MATLAB命令提示符中实际输入help ltitr,则会提供此文档:

%LTITR  Linear time-invariant time response kernel.
%
%   X = LTITR(A,B,U) calculates the time response of the
%   system:
%           x[n+1] = Ax[n] + Bu[n]
%
%   to input sequence U.  The matrix U must have as many columns as
%   there are inputs u.  Each row of U corresponds to a new time 
%   point.  LTITR returns a matrix X with as many columns as the
%   number of states x, and with as many rows as in U.
%
%   LTITR(A,B,U,X0) can be used if initial conditions exist.
%   Here is what it implements, in high speed:
%
%   for i=1:n
%          x(:,i) = x0;
%          x0 = a * x0 + b * u(i,:).';
%   end
%   x = x.';

%   Copyright 1984-2007 The MathWorks, Inc.
%   $Revision: 1.1.6.4 $  $Date: 2007/05/23 18:54:41 $

% built-in function

因此,他们几乎已经为您提供了代码。但是,我假设这是用MEX编写的,所以这就是为什么它是内置的并且速度非常快。因此,如果要将其移植到Octave,则只需使用上面引用的代码即可。它不会像MATLAB的版本那么快,但for循环基本上是实现它的基本方法。

然而,为了完整起见,让我们为它编写我们自己的Octave函数:

function x = ltitr(A, B, U, x0)

%// Number of rows in U is the number of time points
num_points = size(U, 1);

%// Number of columns in U is how many inputs we have
num_inputs = size(U, 2);

x = zeros(num_inputs, num_points); %// Pre-allocate output

%// For each time point we have ...
for idx = 1 : num_points
    x(:,idx) = x0; %// Output the corresponding time point
    x0 = A*x0 + B*U(idx,:).'; %// Compute next time point
end
x = x.';

上面的函数几乎与你在MATLAB中看到的代码类似,但是我做了一些额外的步骤,例如预先分配矩阵以提高效率,以及获取一些相关变量来帮助计算。另请注意,输出矩阵x的定义为翻转。原因是因为在这种状态下计算每个时间点的输出更容易计算。如果不这样做,那么您将不得不对x0 = ...语句中定义的其他变量进行不必要的转置。因此,在转置矩阵中进行计算更容易。完成后,转置结果矩阵,为您提供最终输出矩阵x

我假设x0的默认状态将全部为零,因此如果要将其用作默认状态,请指定x0 = zeros(n,1);其中n为总数LTI系统的输入数量。