00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Sum.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 Sum::Sum(mrs_string name):MarSystem("Sum",name)
00025 {
00026 addControls();
00027 }
00028
00029 Sum::Sum(const Sum& a): MarSystem(a)
00030 {
00031 ctrl_weight_ = getctrl("mrs_real/weight");
00032 ctrl_stereo_ = getctrl("mrs_bool/stereo");
00033 ctrl_mode_ = getctrl("mrs_string/mode");
00034 }
00035
00036
00037
00038 Sum::~Sum()
00039 {
00040 }
00041
00042 void
00043 Sum::addControls()
00044 {
00045 addctrl("mrs_real/weight", 1.0, ctrl_weight_);
00046 addctrl("mrs_bool/stereo", false, ctrl_stereo_);
00047 addctrl("mrs_string/mode", "orig", ctrl_mode_);
00048 }
00049
00050 MarSystem*
00051 Sum::clone() const
00052 {
00053 return new Sum(*this);
00054 }
00055
00056 void
00057 Sum::myUpdate(MarControlPtr sender)
00058 {
00059
00060
00061
00062 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00063 ctrl_onObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00064 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00065
00066
00067
00068
00069 mrs_string inObsName = stringSplit(ctrl_inObsNames_->to<mrs_string>(), ",")[0];
00070 ctrl_onObsNames_->setValue("Sum_" + inObsName+",", NOUPDATE);
00071
00072
00073
00074
00075
00076
00077 if(ctrl_mode_->to<mrs_string>() == "orig") {
00079 mrs_bool stereo = ctrl_stereo_->to<mrs_bool>();
00080 if (!stereo) {
00081 ctrl_onObservations_->setValue(1, NOUPDATE);
00082 } else {
00083 ctrl_onObservations_->setValue(2, NOUPDATE);
00084 }
00085 } else {
00086
00087
00088 if (ctrl_mode_->to<mrs_string>() == "sum_observations") {
00089 ctrl_onObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00090 ctrl_onSamples_->setValue(1, NOUPDATE);
00091 ctrl_osrate_->setValue(ctrl_israte_->to<mrs_real>() / ctrl_inSamples_->to<mrs_natural>(), NOUPDATE);
00092
00093 } else if (ctrl_mode_->to<mrs_string>() == "sum_samples") {
00094 ctrl_onObservations_->setValue(1, NOUPDATE);
00095 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00096 } else if (ctrl_mode_->to<mrs_string>() == "sum_whole") {
00097 ctrl_onObservations_->setValue(1, NOUPDATE);
00098 ctrl_onSamples_->setValue(1, NOUPDATE);
00099 }
00100 }
00101
00102
00103
00104 }
00105
00106
00107 void
00108 Sum::myProcess(realvec& in, realvec& out)
00109 {
00110 mrs_real weightValue = ctrl_weight_->to<mrs_real>();
00111 mrs_bool stereo = ctrl_stereo_->to<mrs_bool>();
00112 mrs_natural t,o,c;
00113
00114
00115
00116
00117 if (ctrl_mode_->to<mrs_string>() == "orig")
00118 {
00119
00120 if (!stereo)
00121 {
00122 for (t = 0; t < inSamples_; t++)
00123 {
00124 out(0, t) = 0;
00125 for (o = 0; o < inObservations_; o++)
00126 {
00127 out(0, t) += (weightValue * in(o, t));
00128 }
00129 }
00130 }
00131 else
00132 {
00133 for (t = 0; t < inSamples_; t++)
00134 for (c=0; c < 2; ++c)
00135 {
00136 out(c, t) = 0;
00137 for (o = c; o < inObservations_; o+=2)
00138 {
00139 out(c, t) += (weightValue * in(o, t));
00140 }
00141 }
00142 }
00143 } else {
00144
00145 for (o = 0; o < onObservations_; o++) {
00146 for (t = 0; t < onSamples_; t++) {
00147 out(o,t) = 0.0;
00148 }
00149 }
00150
00151
00152 if (ctrl_mode_->to<mrs_string>() == "sum_observations") {
00153 for (o = 0; o < inObservations_; o++) {
00154 for (t = 0; t < inSamples_; t++) {
00155 out(o,0) += in(o,t);
00156 }
00157 }
00158 } else if (ctrl_mode_->to<mrs_string>() == "sum_samples")
00159 {
00160 for (o = 0; o < inObservations_; o++) {
00161 for (t = 0; t < inSamples_; t++) {
00162 out(0,t) += in(o,t);
00163 }
00164 }
00165 } else if (ctrl_mode_->to<mrs_string>() == "sum_whole") {
00166 for (o = 0; o < inObservations_; o++) {
00167 for (t = 0; t < inSamples_; t++) {
00168 out(0,0) += in(o,t);
00169 }
00170 }
00171 }
00172 }
00173 }