WienerFilter.cpp

Go to the documentation of this file.
00001 #include "WienerFilter.h"
00002 #include "miscfunc.h"
00003 
00004 using namespace boost::numeric::ublas;
00005 
00006 namespace gplib
00007   {
00008 
00009     WienerFilter::WienerFilter(const int inputsize) :
00010       AdaptiveFilter(inputsize, inputsize), CorrMatrix(inputsize, inputsize),
00011           Weights(inputsize), lambda(0)
00012       {
00013       }
00014 
00015     WienerFilter::~WienerFilter()
00016       {
00017       }
00018 
00019     void WienerFilter::PrintWeights(std::ostream &output)
00020       {
00021         std::copy(Weights.begin(), Weights.end(),
00022             std::ostream_iterator<double>(output, "\n"));
00023       }
00024 
00025     void WienerFilter::AdaptFilter(const gplib::rvec &Input,
00026         const gplib::rvec &Desired)
00027       {
00028         const int inputsize = Input.size();
00029         vector<double> Cross(Input.size());
00030         vector<double> Auto(Input.size());
00031         Correl(Desired, Desired, Auto);
00032         Correl(Input, Desired, Cross);
00033         for (int i = 0; i < inputsize; ++i)
00034           for (int j = i; j < inputsize; ++j)
00035             {
00036               CorrMatrix(i, j) = Auto(j - i);
00037               CorrMatrix(j, i) = Auto(j - i);
00038             }
00039         CorrMatrix += lambda * identity_matrix<double> (inputsize);
00040         matrix<double> Inverse(inputsize, inputsize);
00041         //std::cout << "  Corr: " << CorrMatrix << std::endl;
00042         //std::cout << " Cross: " << Cross << std::endl;
00043 
00044 
00045         // NEEDS TO BE FIXED InvertMatrix(CorrMatrix,Inverse);
00046 
00047         //std::cout << "   Inv: " << Inverse << std::endl;
00048 
00049         axpy_prod(Inverse, Cross, Weights, true);
00050         //std::cout << "Weight: " << Weights << std::endl;
00051       }
00052 
00053     void WienerFilter::CalcOutput(const gplib::rvec &Input, gplib::rvec &Output)
00054       {
00055         vector<double> output(Input.size());
00056         Convolve(Input, Weights, Output);
00057         SetOutput(Output);
00058       }
00059   }

Generated on Tue May 4 16:52:15 2010 for GPLIB++ by  doxygen 1.5.8