5 #include <Eigen/Cholesky> 7 #include <base/Eigen.hpp> 16 template <
unsigned int _Order,
unsigned int _DataDimension >
class IIR 21 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
34 Eigen::Matrix <double, _DataDimension, (_Order+1)*_DataDimension>
bMatrix,
aMatrix;
35 Eigen::Matrix <double, (_Order+1)*_DataDimension, (_Order+1)*_DataDimension>
crossCov;
47 IIR(
const Eigen::Matrix <double, _Order+1, 1> &b,
const Eigen::Matrix <double, _Order+1, 1> &a)
50 originalData.setZero();
51 filteredData.setZero();
52 originalDataCov.setZero();
53 filteredDataCov.setZero();
57 aMatrix.setZero(); bMatrix.setZero();
58 Eigen::Matrix<double, _DataDimension, _Order+1> aSubMatrix, bSubMatrix;
60 for (
register int i=0; i<static_cast<int>(_DataDimension); ++i)
62 aSubMatrix.row(i) = 1.0/a[0] * a.transpose();
63 bSubMatrix.row(i) = 1.0/a[0] * b.transpose();
66 for (
register int i=0; i<static_cast<int>(_DataDimension); ++i)
68 aMatrix.template block<_DataDimension, _Order+1> (0, i*(_Order+1)) = aSubMatrix;
69 bMatrix.template block<_DataDimension, _Order+1> (0, i*(_Order+1)) = bSubMatrix;
73 aMatrix.template block<_DataDimension, _DataDimension>(0,0) = Eigen::Matrix<double, _DataDimension, _DataDimension>::Zero();
84 Eigen::Matrix<double, _DataDimension, 1>
perform (
const Eigen::Matrix <double, _DataDimension, 1> &data)
86 Eigen::Matrix <double, _DataDimension, _DataDimension> dataCov; dataCov.setZero();
87 return this->
perform (data, dataCov,
false);
97 Eigen::Matrix<double, _DataDimension, 1>
perform (
const Eigen::Matrix <double, _DataDimension, 1> &data,
98 Eigen::Matrix <double, _DataDimension, _DataDimension> &dataCov,
99 const bool covariance =
true)
101 Eigen::Matrix<double, _DataDimension, 1> result;
104 originalData.template block<_DataDimension, _Order>(0,0) = originalData.template block<_DataDimension, _Order>(0,1);
105 originalData.col(_Order) = data;
107 #ifdef IIR_DEBUG_PRINTS 108 std::cout<<
"[IIR-FILTER] originalData.cols "<<originalData.cols()<<
" filteredData.cols "<<filteredData.cols()<<
"\n";
112 result = this->
iirFilter(bCoeff, aCoeff, originalData, filteredData);
115 if (covariance ==
true)
119 if (!base::isnotnan(dataCov))
121 #ifdef IIR_DEBUG_PRINTS 122 std::cout<<
"[IIR] dataCov has NaN values\n";
128 #ifdef IIR_DEBUG_PRINTS 129 std::cout<<
"[IIR] dataCov :\n"<<dataCov<<
"\n";
133 originalDataCov.template block<_Order*_DataDimension, _Order*_DataDimension>(0,0) =
134 originalDataCov.template block<_Order*_DataDimension, _Order*_DataDimension> (_DataDimension, _DataDimension);
135 originalDataCov.template block<_DataDimension, _DataDimension>(_Order*_DataDimension, _Order*_DataDimension) = dataCov;
137 crossCov.template block<_Order*_DataDimension, _Order*_DataDimension>(0,0) =
138 crossCov.template block<_Order*_DataDimension, _Order*_DataDimension> (_DataDimension, _DataDimension);
139 crossCov.template block<_DataDimension, _DataDimension>(_Order*_DataDimension, _Order*_DataDimension) = dataCov - (result * result.transpose());
141 dataCov = this->
iirFilterCov(bMatrix, aMatrix, originalDataCov, filteredDataCov);
143 #ifdef IIR_DEBUG_PRINTS 144 std::cout<<
"[IIR] ResultCov:\n"<<dataCov<<
"\n";
148 filteredDataCov.template block<_Order*_DataDimension, _Order*_DataDimension> (0,0) =
149 filteredDataCov.template block<_Order*_DataDimension, _Order*_DataDimension> (_DataDimension, _DataDimension);
152 #ifdef IIR_DEBUG_PRINTS 153 std::cout<<
"[IIR] Result:\n"<<result<<
"\n";
157 filteredData.template block<_DataDimension, _Order>(0,0) = filteredData.template block<_DataDimension, _Order>(0,1);
181 const Eigen::Matrix <double, _Order+1, 1> &b,
182 const Eigen::Matrix <double, _Order+1, 1> &a,
183 const Eigen::Matrix <double, _DataDimension, _Order+1> &x,
184 Eigen::Matrix <double, _DataDimension, _Order+1> &y)
187 register int i =
static_cast<int>(_Order);
189 Eigen::Matrix <double, _DataDimension, 1> tmpA, tmpB;
190 tmpB.setZero(); tmpA.setZero();
193 for(j=1; j<static_cast<int>(_Order+1); ++j)
195 tmpB += b[j-1]*x.col(i);
196 tmpA += a[j]*y.col(i-1);
200 tmpB += b[j-1]*x.col(i);
202 y.col(_Order) = 1.0/a[0] * (tmpB - tmpA);
204 return y.col(_Order);
225 const Eigen::Matrix <
double, _DataDimension, (_Order+1)*_DataDimension> &bMatrix,
226 const Eigen::Matrix <
double, _DataDimension, (_Order+1)*_DataDimension> &aMatrix,
227 const Eigen::Matrix <
double, (_Order+1)*_DataDimension, (_Order+1)*_DataDimension> &xCov,
228 Eigen::Matrix <
double, (_Order+1)*_DataDimension, (_Order+1)*_DataDimension> &yCov)
233 #ifdef IIR_DEBUG_PRINTS 234 std::cout<<
"[IIR-FILTER] bMatrix is\n"<<bMatrix<<
"\naMatrix is\n"<<aMatrix<<
"\n";
235 std::cout<<
"[IIR-FILTER] xCov is\n"<<xCov<<
"\nyCov is\n"<<yCov<<
"\n";
236 std::cout<<
"[IIR-FILTER] xyCov is\n"<<crossCov<<
"\n";
239 yCov.template block<_DataDimension, _DataDimension> (_Order*_DataDimension, _Order*_DataDimension) =
240 bMatrix * xCov * bMatrix.transpose() + aMatrix * yCov * aMatrix.transpose() - bMatrix * crossCov * aMatrix.transpose() - aMatrix * crossCov * bMatrix.transpose();
242 return yCov.template block<_DataDimension, _DataDimension> (_Order*_DataDimension, _Order*_DataDimension);
Eigen::Matrix< double, _DataDimension, _DataDimension > iirFilterCov(const Eigen::Matrix< double, _DataDimension,(_Order+1)*_DataDimension > &bMatrix, const Eigen::Matrix< double, _DataDimension,(_Order+1)*_DataDimension > &aMatrix, const Eigen::Matrix< double,(_Order+1)*_DataDimension,(_Order+1)*_DataDimension > &xCov, Eigen::Matrix< double,(_Order+1)*_DataDimension,(_Order+1)*_DataDimension > &yCov)
IIR filter Cov.
Definition: IIR.hpp:224
Implements an Infinite Impulse Response filter with order _Order specified as template parameters and...
Definition: IIR.hpp:16
Eigen::Matrix< double, _DataDimension, _Order+1 > originalData
Definition: IIR.hpp:30
Eigen::Matrix< double,(_Order+1)*_DataDimension,(_Order+1)*_DataDimension > filteredDataCov
Definition: IIR.hpp:33
Eigen::Matrix< double,(_Order+1)*_DataDimension,(_Order+1)*_DataDimension > originalDataCov
Definition: IIR.hpp:33
Eigen::Matrix< double, _DataDimension,(_Order+1)*_DataDimension > aMatrix
Definition: IIR.hpp:34
Eigen::Matrix< double, _DataDimension, 1 > iirFilter(const Eigen::Matrix< double, _Order+1, 1 > &b, const Eigen::Matrix< double, _Order+1, 1 > &a, const Eigen::Matrix< double, _DataDimension, _Order+1 > &x, Eigen::Matrix< double, _DataDimension, _Order+1 > &y)
IIR filter.
Definition: IIR.hpp:180
Eigen::Matrix< double,(_Order+1)*_DataDimension,(_Order+1)*_DataDimension > crossCov
Definition: IIR.hpp:35
Eigen::Matrix< double, _DataDimension, _Order+1 > filteredData
Definition: IIR.hpp:30
Eigen::Matrix< double, _DataDimension,(_Order+1)*_DataDimension > bMatrix
Definition: IIR.hpp:34
IIR(const Eigen::Matrix< double, _Order+1, 1 > &b, const Eigen::Matrix< double, _Order+1, 1 > &a)
Constructor.
Definition: IIR.hpp:47
Eigen::Matrix< double, _Order+1, 1 > aCoeff
Definition: IIR.hpp:27
Eigen::Matrix< double, _DataDimension, 1 > perform(const Eigen::Matrix< double, _DataDimension, 1 > &data, Eigen::Matrix< double, _DataDimension, _DataDimension > &dataCov, const bool covariance=true)
Definition: IIR.hpp:97
Eigen::Matrix< double, _Order+1, 1 > bCoeff
Definition: IIR.hpp:27
Eigen::Matrix< double, _DataDimension, 1 > perform(const Eigen::Matrix< double, _DataDimension, 1 > &data)
Definition: IIR.hpp:84