00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Filter.h"
00020
00021
00022 using std::ostringstream;
00023 using std::ofstream;
00024 using std::endl;
00025
00026
00027 using namespace Marsyas;
00028
00029 Filter::Filter(mrs_string name)
00030 :
00031 MarSystem("Filter",name),
00032 norder_(2),
00033 dorder_(1),
00034 channels_(1),
00035 order_(2),
00036 fgain_(1.0)
00037 {
00038 ncoeffs_.create(norder_);
00039 dcoeffs_.create(dorder_);
00040 state_.create(channels_,order_-1);
00041
00042 ncoeffs_(0) = 1.0;
00043 dcoeffs_(0) = 1.0;
00044
00045 addControls();
00046 }
00047
00048 Filter::~Filter()
00049 {
00050
00051 }
00052
00053
00054 MarSystem*
00055 Filter::clone() const
00056 {
00057 return new Filter(*this);
00058 }
00059
00060 void
00061 Filter::addControls()
00062 {
00063 addctrl("mrs_realvec/ncoeffs", ncoeffs_);
00064 addctrl("mrs_realvec/dcoeffs", dcoeffs_);
00065 addctrl("mrs_real/fgain", fgain_);
00066 addctrl("mrs_natural/stateUpdate", mrs_natural(0));
00067 addctrl("mrs_realvec/state", state_);
00068
00069 setctrlState("mrs_realvec/ncoeffs", true);
00070 setctrlState("mrs_realvec/dcoeffs", true);
00071 setctrlState("mrs_realvec/state", true);
00072 }
00073
00074 void Filter::myUpdate(MarControlPtr sender)
00075 {
00076 (void) sender;
00077 MRSDIAG("Filter.cpp - Filter:myUpdate");
00078
00079 setctrl("mrs_natural/onSamples", getctrl("mrs_natural/inSamples"));
00080 setctrl("mrs_natural/onObservations", getctrl("mrs_natural/inObservations"));
00081 setctrl("mrs_real/osrate", getctrl("mrs_real/israte"));
00082
00083 ctrl_onObsNames_->setValue("Filter_" + ctrl_inObsNames_->to<mrs_string>() + "," , NOUPDATE);
00084
00085 if (getctrl("mrs_realvec/ncoeffs")->to<mrs_realvec>().getSize() != norder_)
00086 {
00087 ncoeffs_.create(getctrl("mrs_realvec/ncoeffs")->to<mrs_realvec>().getSize());
00088 norder_ = ncoeffs_.getSize();
00089 order_ = (norder_ > dorder_) ? norder_ : dorder_;
00090 channels_ = getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00091 state_.create(channels_,order_-1);
00092 setctrl("mrs_realvec/state", state_);
00093 }
00094
00095 if (getctrl("mrs_realvec/dcoeffs")->to<mrs_realvec>().getSize() != dorder_)
00096 {
00097
00098 dcoeffs_.create(getctrl("mrs_realvec/dcoeffs")->to<mrs_realvec>().getSize());
00099 dorder_ = dcoeffs_.getSize();
00100 order_ = (norder_ > dorder_) ? norder_ : dorder_;
00101 channels_ = getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00102 state_.create(channels_,order_-1);
00103 setctrl("mrs_realvec/state", state_);
00104 }
00105
00106 if (getctrl("mrs_natural/inObservations")->to<mrs_natural>() != channels_)
00107 {
00108 channels_ = getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00109 state_.create(channels_,order_-1);
00110 }
00111
00112 ncoeffs_ = getctrl("mrs_realvec/ncoeffs")->to<mrs_realvec>();
00113 dcoeffs_ = getctrl("mrs_realvec/dcoeffs")->to<mrs_realvec>();
00114
00115 if (getctrl("mrs_natural/stateUpdate")->to<mrs_natural>())
00116 state_ = getctrl("mrs_realvec/state")->to<mrs_realvec>();
00117
00118 mrs_real d0 = dcoeffs_(0);
00119 if (d0 != 1.0) {
00120 for (mrs_natural i = 0; i < dorder_; ++i){
00121 dcoeffs_(i) /= d0;
00122 }
00123
00124 for (mrs_natural i = 0; i < norder_; ++i){
00125 ncoeffs_(i) /= d0;
00126 }
00127 }
00128
00129 fgain_ = 1.0f;
00130 setctrl("mrs_real/fgain", 1.0);
00131 }
00132
00133 void
00134 Filter::write(mrs_string filename)
00135 {
00136 ofstream os(filename.c_str());
00137 os << (*this) << endl;
00138 }
00139
00140 void
00141 Filter::myProcess(realvec& in, realvec& out)
00142 {
00143
00144
00145 mrs_natural i,j,c;
00146 mrs_natural size = in.getCols();
00147 mrs_natural stateSize = state_.getCols();
00148 mrs_natural channels = in.getRows();
00149
00150 mrs_real gain = getctrl("mrs_real/fgain")->to<mrs_real>();
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 if (norder_ == dorder_){
00163 for (c = 0; c < channels; ++c) {
00164 for (i = 0; i < size; ++i){
00165 out(c,i) = ncoeffs_(0) * in(c,i) + state_(c,0);
00166 for (j = 0; j < stateSize - 1; j++)
00167 {
00168 state_(c,j) = ncoeffs_(j+1) * in(c,i) + state_(c,j+1) - dcoeffs_(j+1) * out(c,i);
00169 }
00170 state_(c,stateSize - 1) = ncoeffs_(order_-1) * in(c,i) - dcoeffs_(order_-1) * out(c,i);
00171 }
00172 }
00173 }
00174 else if (norder_ < dorder_){
00175 for (c = 0; c < channels; ++c) {
00176 for (i = 0; i < size; ++i){
00177 out(c,i) = ncoeffs_(0) * in(c,i) + state_(c,0);
00178 for (j = 0; j < norder_ - 1; j++)
00179 {
00180 state_(c,j) = ncoeffs_(j+1) * in(c,i) + state_(c,j+1) - dcoeffs_(j+1) * out(c,i);
00181 }
00182 for (j = norder_ - 1; j < stateSize - 1; j++)
00183 {
00184 state_(c,j) = state_(c,j+1) - dcoeffs_(j+1) * out(c,i);
00185 }
00186 state_(c,stateSize - 1) = -dcoeffs_(order_ - 1) * out(c,i);
00187 }
00188 }
00189 }
00190 else {
00191 for (c = 0; c < channels; ++c) {
00192 for (i = 0; i < size; ++i){
00193 out(c,i) = ncoeffs_(0) * in(c,i) + state_(c,0);
00194 for (j = 0; j < dorder_ - 1; j++)
00195 {
00196 state_(c,j) = ncoeffs_(j+1) * in(c,i) + state_(c,j+1) - dcoeffs_(j+1) * out(c,i);
00197 }
00198 for (j = dorder_ - 1; j < stateSize - 1; j++)
00199 {
00200 state_(c,j) = ncoeffs_(j+1) * in(c,i) + state_(c,j+1);
00201 }
00202 state_(c,stateSize - 1) = ncoeffs_(order_-1) * in(c,i);
00203 }
00204 }
00205 }
00206 out *= gain;
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 }