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
00042
00043
00044
00045
00046
00047
00048
00049 axpy_prod(Inverse, Cross, Weights, true);
00050
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 }