00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ZeroCrossings.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 ZeroCrossings::ZeroCrossings(mrs_string name):MarSystem("ZeroCrossings",name)
00025 {
00026 }
00027
00028
00029 ZeroCrossings::~ZeroCrossings()
00030 {
00031 }
00032
00033
00034 MarSystem*
00035 ZeroCrossings::clone() const
00036 {
00037 return new ZeroCrossings(*this);
00038 }
00039
00040 void
00041 ZeroCrossings::myUpdate(MarControlPtr sender)
00042 {
00043 (void) sender;
00044 MRSDIAG("ZeroCrossings.cpp - ZeroCrossings:myUpdate");
00045 ctrl_onSamples_->setValue((mrs_natural)1, NOUPDATE);
00046 ctrl_onObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00047 ctrl_osrate_->setValue(ctrl_israte_->to<mrs_real>() / ctrl_inSamples_->to<mrs_natural>());
00048 ctrl_onObsNames_->setValue("ZeroCrossings_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00049 }
00050
00051
00052
00053
00054 void
00055 ZeroCrossings::myProcess(realvec& in, realvec& out)
00056 {
00057 mrs_natural o,t;
00058
00059 for (o=0; o < inObservations_; o++)
00060 {
00061 zcrs_ = 1.0;
00062 for (t = 1; t < inSamples_; t++)
00063 {
00064 if (((in(o, t-1) > 0) && (in(o,t) < 0)) ||
00065 ((in(o, t-1) < 0) && (in(o,t) > 0)))
00066 {
00067 zcrs_++;
00068 }
00069 }
00070 out(o,0) = zcrs_ / inSamples_;
00071 }
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081