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 }