00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00029 #include "PeakEnhancer.h"
00030 #include "HalfWaveRectifier.h"
00031 #include "Filter.h"
00032 #include "MarSystem.h"
00033
00034 using std::ostringstream;
00035 using namespace Marsyas;
00036
00037
00038 PeakEnhancer::PeakEnhancer(mrs_string name):MarSystem("PeakEnhancer", name)
00039 {
00040
00041
00042
00043
00044
00045
00046
00047 addControls();
00048 rect_=NULL;
00049 lowpass_=NULL;
00050 }
00051
00052 PeakEnhancer::PeakEnhancer(const PeakEnhancer& orig) : MarSystem(orig)
00053 {
00054
00055
00056
00057
00058 ctrl_itnum_ = getctrl("mrs_natural/itnum");
00059 if (orig.rect_!=NULL) rect_=orig.rect_->clone();
00060 else rect_=NULL;
00061 if (orig.lowpass_!=NULL) lowpass_=orig.lowpass_->clone();
00062 else lowpass_=NULL;
00063 }
00064
00065 PeakEnhancer::~PeakEnhancer()
00066 {
00067 if (rect_!=NULL) delete rect_;
00068 if (lowpass_!=NULL) delete lowpass_;
00069 }
00070
00071 MarSystem*
00072 PeakEnhancer::clone() const
00073 {
00074 return new PeakEnhancer(*this);
00075 }
00076
00077 void
00078 PeakEnhancer::addControls()
00079 {
00080
00081 addctrl("mrs_natural/itnum", (mrs_natural)1, ctrl_itnum_);
00082 }
00083
00084 void
00085 PeakEnhancer::myUpdate(MarControlPtr sender)
00086 {
00087 MarSystem::myUpdate(sender);
00088 mrs_string inObsNames = ctrl_inObsNames_->to<mrs_string>();
00089
00090 setControl("mrs_natural/onSamples", (mrs_natural)(ctrl_inSamples_->to<mrs_natural>()));
00091 setControl("mrs_natural/onObservations", (mrs_natural)(ctrl_inObservations_->to<mrs_natural>()));
00092
00093
00094
00095
00096
00097
00098
00099 mrs_realvec num_low;
00100 num_low.create(3);
00101 mrs_realvec denom_low;
00102 denom_low.create(3);
00103 num_low(0)=0.1207f; num_low(1)=0.2415f; num_low(2)=0.1207f;
00104 denom_low(0)=1.0f; denom_low(1)=-0.8058f; denom_low(2)=0.2888f;
00105
00106 if (rect_==NULL ) rect_=new HalfWaveRectifier("hwr");
00107 if (lowpass_==NULL) lowpass_=new Filter("lpf");
00108
00109 lowpass_->setctrl("mrs_realvec/ncoeffs", num_low);
00110 lowpass_->setctrl("mrs_realvec/dcoeffs", denom_low);
00111
00112 rect_->setControl("mrs_natural/inSamples",ctrl_inSamples_);
00113 rect_->setControl("mrs_natural/inObservations",ctrl_inObservations_);
00114
00115 rect_->setControl("mrs_natural/onSamples",ctrl_onSamples_);
00116 rect_->setControl("mrs_natural/onObservations",ctrl_onObservations_);
00117
00118 lowpass_->setControl("mrs_natural/inSamples",ctrl_inSamples_);
00119 lowpass_->setControl("mrs_natural/inObservations",ctrl_inObservations_);
00120
00121 lowpass_->setControl("mrs_natural/onSamples",ctrl_onSamples_);
00122 lowpass_->setControl("mrs_natural/onObservations",ctrl_onObservations_);
00123
00124
00125 }
00126
00127
00128 void
00129 PeakEnhancer::myProcess(realvec& in, realvec& out)
00130 {
00131 for (mrs_natural o=0;o<inObservations_;o++)
00132 {
00133
00134 mrs_realvec tempVec;
00135 tempVec.create(inSamples_);
00136 mrs_realvec& temp=tempVec;
00137 mrs_realvec temp2Vec;
00138 temp2Vec.create(inSamples_);
00139 mrs_realvec& temp2=temp2Vec;
00140 mrs_realvec temp3Vec;
00141 temp3Vec.create(inSamples_);
00142 mrs_realvec& temp3=temp3Vec;
00143
00144
00145 rect_->process(in, temp);
00146
00147 temp2.setval(0.0);
00148
00149
00150 for (mrs_natural i=0; i<inSamples_/ctrl_itnum_->to<mrs_natural>(); ++i)
00151 temp2(ctrl_itnum_->to<mrs_natural>()*i)=temp(i);
00152
00153 lowpass_->process(temp2, temp3);
00154
00155 for(mrs_natural i=0;i<inSamples_;++i)
00156 {
00157 out(i)=in(o,i)-temp3(i);
00158 }
00159 }
00160
00161
00162 }