WienerInterpolator.cpp

Go to the documentation of this file.
00001 #include "WienerInterpolator.h"
00002 #include <iostream>
00003 #include <iterator>
00004 #include <algorithm>
00005 
00006 namespace gplib
00007   {
00008 
00009     WienerInterpolator::WienerInterpolator(const int filterlength) :
00010       LSSOFilter(filterlength), xms(0.0)
00011       {
00012       }
00013 
00014     WienerInterpolator::~WienerInterpolator()
00015       {
00016       }
00017 
00018     void WienerInterpolator::AdaptFilter(const gplib::rvec &Input,
00019         const gplib::rvec &Desired)
00020       {
00021         const int size = Input.size();
00022         const int filterlength = GetWeights().size();
00023         gplib::rvec wk1(size);
00024         gplib::rvec wk2(size);
00025         gplib::rvec wkm(filterlength);
00026         double power = inner_prod(Input, Input);
00027         xms = power / size;
00028         std::fill_n(wkm.begin(), filterlength, 0.0);
00029 
00030         wk1(0) = Input(0);
00031         wk2(size - 2) = Input(size - 1);
00032         for (int i = 1; i < size - 1; ++i)
00033           {
00034             wk1(i) = Input(i);
00035             wk2(i - 1) = Input(i);
00036           }
00037         for (int j = 0; j < filterlength; ++j)
00038           {
00039             double num = 0.0;
00040             double denom = 0.0;
00041             for (int k = 0; k < (size - j - 1); ++k)
00042               {
00043                 num += wk1(k) * wk2(k);
00044                 denom += wk1(k) * wk1(k) + wk2(k) * wk2(k);
00045               }
00046             SetWeights()(j) = 2.0 * num / denom;
00047             xms *= (1.0 - GetWeights()(j) * GetWeights()(j));
00048             for (int k = 0; k < j; ++k)
00049               {
00050                 SetWeights()(k) = wkm(k) - GetWeights()(j) * wkm(j - k - 1);
00051               }
00052             if (j == filterlength - 1)
00053               {
00054                 reverse(SetWeights().begin(), SetWeights().end());
00055                 return;
00056               }
00057             for (int k = 0; k <= j; ++k)
00058               wkm(k) = GetWeights()(k);
00059             for (int k = 0; k < size - j - 2; ++k)
00060               {
00061                 wk1(k) -= wkm(j) * wk2(k);
00062                 wk2(k) = wk2(k + 1) - wkm(j) * wk1(k + 1);
00063               }
00064           }
00065       }
00066   }

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