00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "LPCC.h"
00020
00021 using std::ostringstream;
00022 using namespace Marsyas;
00023
00024 LPCC::LPCC(mrs_string name):MarSystem("LPCC",name)
00025 {
00026 addControls();
00027 }
00028
00029 LPCC::LPCC(const LPCC& a) : MarSystem(a)
00030 {
00031 ctrl_order_ = getctrl("mrs_natural/order");
00032 }
00033
00034 LPCC::~LPCC()
00035 {
00036 }
00037
00038 MarSystem*
00039 LPCC::clone() const
00040 {
00041 return new LPCC(*this);
00042 }
00043
00044 void
00045 LPCC::addControls()
00046 {
00047
00048 addctrl("mrs_natural/order", 1, ctrl_order_);
00049 }
00050
00051 void
00052 LPCC::myUpdate(MarControlPtr sender)
00053 {
00054 (void) sender;
00055 MRSDIAG("LPCC.cpp - LPCC:myUpdate");
00056
00057 ctrl_onSamples_->setValue(ctrl_inSamples_);
00058 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00059
00060
00061
00062 mrs_natural order = ctrl_inObservations_->to<mrs_natural>() - 2;
00063 ctrl_order_->setValue(order, NOUPDATE);
00064 ctrl_onObservations_->setValue(order, NOUPDATE);
00065
00066
00067 ostringstream oss;
00068 for (mrs_natural i = 0; i < ctrl_order_->to<mrs_natural>(); ++i)
00069 oss << "LPCC_" << i+1 << ",";
00070 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00071
00072 tmp_.create(ctrl_onObservations_->to<mrs_natural>()+1, ctrl_onSamples_->to<mrs_natural>());
00073 }
00074
00075 void
00076 LPCC::myProcess(realvec& in, realvec& out)
00077 {
00078 mrs_real sum;
00079 mrs_natural order = ctrl_order_->to<mrs_natural>();
00080
00081
00082
00083
00084
00085
00086
00087 tmp_.setval(0.0);
00088 tmp_(0) = -log(in(order+1));
00089 for (mrs_natural m = 1; m <= order; m++)
00090 {
00091 sum = 0.0;
00092 for (mrs_natural k=1; k <= m-1; k++)
00093 sum = sum + (mrs_real)(m-k) * in(k-1) * tmp_(m-k);
00094 tmp_(m) = +in(m-1) + sum / (mrs_real)m;
00095
00096 out(m-1) = tmp_(m);
00097 }
00098
00099
00100
00101
00102 }