/*****************************************************************************
* *
* FOX Controller Library, Version 1.3.3. *
* *
* Copyright (C) 1998,1999,2000 Russell Smith (rl.smith@auckland.ac.nz) *
* *
* The FOX Controller Library is free software; you can redistribute it *
* and/or modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either version *
* 2 of the License, or (at your option) any later version. *
* *
* The FOX Controller Library is distributed in the hope that it will be *
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with the Fox Controller Library; see the file COPYING.LIB. *
* If not, write to the Free Software Foundation, Inc., 59 Temple Place - *
* Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
/*
Given a sequence of scalar values e0,e1,e2,...eT (time step `h' apart) this
class lets you compute the integral (sum)
delta(t) = sum (i=t...T) e(i) * C * A^(i-t)
where C is a 1*ny matrix and A is an ny*ny matrix.
This is a kind of "backwards" filter.
A buffer of `n' values is maintained, which limits the value of T-t to
at most n-2.
`ny' is the size of the Fox system y vector.
The maximum value of `ny' is currently 4
*/
#ifndef __TRACE_N_H
#define __TRACE_N_H
#include "cftype-n.h"
#include "atoi.h"
class TraceN {
int valid; // set to 1 if constructor was successfull
int ny;
cftype *C; // array of 1*ny matrix values (constant)
cftype *A; // array of ny*ny matrix values (constant)
int n; // size of buffer
cftype *lambda; // buffer of n ny-sized vectors (size=n*ny)
int T; // current time step (starts at 0)
int p; // position of current timestep in buffer
int T0; // time step at lambda[0]
cftype Lambda[MAX_NY]; // current integrated value of (e * C * A^i)
cftype CAtop[MAX_NY]; // current value of C*A^p (1*ny)
GetAtoi *atoi;
public:
TraceN (int _ny, cftype *_A, cftype *_C, int _n, GetAtoi *_atoi);
// Initialize for a given ny, matrices A and C, and buffer size n.
// The A and C matrices are referenced but not deallocated by this class.
// If initialization is unsuccessful in user mode a fatal error occurrs.
// If initialization is unsuccessful in kernel mode then the constructor
// returns and Valid() returns 0. The object can be safely destructed.
~TraceN();
int Valid() { return valid; }
void Reset();
// Reset to time 0.
void Next (cftype e);
// Set the next error e(i) value. The first time this is called is for
// time 0.
cftype * GetDelta (int t);
// Return an ny sized vector (\delta_t). The returned pointer points into
// a static storage area. This must not be called for more than n
// timesteps ago.
};
#endif