00001 #include "PeakInObservation.h"
00002
00003 using std::ostringstream;
00004 using namespace Marsyas;
00005
00006 PeakInObservation::PeakInObservation(mrs_string inName)
00007 :MarSystem("PeakInObservation",inName)
00008 {
00009 addControls();
00010 }
00011
00012 PeakInObservation::PeakInObservation(const PeakInObservation& inToCopy)
00013 :MarSystem(inToCopy)
00014 {
00015 ctrl_HystLength_ = getctrl("mrs_natural/HystLength");
00016 ctrl_HystFactor_ = getctrl("mrs_real/HystFactor");
00017
00018 HystLength_ = inToCopy.HystLength_;
00019 HystFactor_ = inToCopy.HystFactor_;
00020 }
00021
00022 PeakInObservation::~PeakInObservation(){}
00023
00024 MarSystem* PeakInObservation::clone() const
00025 {
00026 return new PeakInObservation(*this);
00027 }
00028
00029 void PeakInObservation::addControls()
00030 {
00031 addctrl("mrs_natural/HystLength",10,ctrl_HystLength_);
00032 addctrl("mrs_real/HystFactor",2.f,ctrl_HystFactor_);
00033
00034 ctrl_HystLength_->setState(true);
00035 ctrl_HystFactor_->setState(true);
00036
00037 HystLength_ = 10;
00038 HystFactor_ = 2.f;
00039 }
00040
00041 void PeakInObservation::myUpdate(MarControlPtr inSender)
00042 {
00043 MarSystem::myUpdate(inSender);
00044
00045 if (ctrl_HystLength_->to<mrs_natural>() > 0 &&
00046 ctrl_HystFactor_->to<mrs_real>() > 1.f)
00047 {
00048 HystLength_ = ctrl_HystLength_->to<mrs_natural>();
00049 HystFactor_ = ctrl_HystFactor_->to<mrs_real>();
00050 }else
00051 {
00052
00053 }
00054 }
00055
00056 void PeakInObservation::myProcess(realvec& inVec, realvec& outVec)
00057 {
00058
00059 outVec.setval(0.f);
00060
00061 int nmin = 0;
00062 mrs_real vmin = inVec(0);
00063 int nmax = 0;
00064 mrs_real vmax = inVec(0);
00065
00066 int nthresh = 0;
00067 bool theValid = true;
00068 bool theMaxFlag = true;
00069
00070 for (mrs_natural n = 1; n < inVec.getSize(); n++){
00071 if (theMaxFlag)
00072 if (inVec(n) > vmax){
00073
00074 vmax = inVec(n);
00075 nmax = n;
00076 nthresh = n;
00077 theValid = true;
00078
00079 vmin = vmax;
00080 nmin = nmax;
00081 }else{
00082 if (inVec(n)<vmax/HystFactor_ && nmax!=0){
00083
00084
00085 if ((mrs_natural)n > nthresh + HystLength_){
00086
00087 if (theValid){
00088 outVec(nmax) = vmax;
00089 theMaxFlag = false;
00090 }else{
00091
00092 vmax = inVec(n);
00093 nmax = n;
00094 nthresh = n;
00095 theValid = true;
00096
00097 vmin = vmax;
00098 nmin = nmax;
00099 }
00100
00101 }else{
00102
00103 if (inVec(n) < vmin){
00104 vmin = inVec(n);
00105 nmin = n;
00106 }
00107 }
00108 }else{
00109
00110 if (nthresh != (mrs_natural)n-1){
00111 theValid = false;
00112 if ((mrs_natural)n > nthresh + HystLength_){
00113
00114 vmax = inVec(n);
00115 nmax = n;
00116 nthresh = n;
00117 theValid = true;
00118
00119 vmin = vmax;
00120 nmin = nmax;
00121 }
00122 }else
00123 nthresh = n;
00124 }
00125 }
00126 else
00127 if (inVec(n) < vmin){
00128 vmin = inVec(n);
00129 nmin = n;
00130 }else
00131 if (inVec(n) > vmin*HystFactor_){
00132 vmax = inVec(n);
00133 nmax = n;
00134 nthresh = 0;
00135
00136 vmin = vmax;
00137 nmin = nmax;
00138 theValid = true;
00139 theMaxFlag = true;
00140 }
00141 }
00142 }