00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Delta.h"
00011
00012 using std::ostringstream;
00013 using namespace Marsyas;
00014
00015 Delta::Delta(mrs_string name): MarSystem("Delta", name)
00016 {
00017 addControls();
00018 }
00019
00020 Delta::Delta(const Delta& a): MarSystem(a)
00021 {
00022 ctrl_absolute_ = getctrl("mrs_bool/absolute");
00023 ctrl_sum_ = getctrl("mrs_bool/sum");
00024 ctrl_normalize_ = getctrl("mrs_bool/normalize");
00025 ctrl_normSize_ = getctrl("mrs_natural/normSize");
00026 ctrl_positive_ = getctrl("mrs_bool/positive");
00027 }
00028
00029 Delta::~Delta()
00030 {
00031 }
00032
00033 MarSystem*
00034 Delta::clone() const
00035 {
00036 return new Delta(*this);
00037 }
00038
00039 void
00040 Delta::addControls()
00041 {
00042 addControl("mrs_bool/absolute", false, ctrl_absolute_);
00043 addControl("mrs_bool/sum", false, ctrl_sum_);
00044 addControl("mrs_bool/normalize", false, ctrl_normalize_);
00045 addControl("mrs_natural/normSize", 10, ctrl_normSize_);
00046 addControl("mrs_bool/positive", false, ctrl_positive_);
00047 }
00048
00049 void
00050 Delta::myUpdate(MarControlPtr sender)
00051 {
00052 mrs_natural o;
00053 (void)sender;
00054 absolute_ = ctrl_absolute_->to<mrs_bool>();
00055 sum_ = ctrl_sum_->to<mrs_bool>();
00056 normalize_ = ctrl_normalize_->to<mrs_bool>();
00057 size_ = ctrl_normSize_->to<mrs_natural>();
00058 positive_ = ctrl_positive_->to<mrs_bool>();
00059
00060 if(sum_){
00061 ctrl_onObservations_->setValue(1, NOUPDATE);
00062 } else {
00063 ctrl_onObservations_->setValue(inObservations_, NOUPDATE);
00064 }
00065 ctrl_onSamples_->setValue(inSamples_, NOUPDATE);
00066 ctrl_osrate_->setValue(israte_, NOUPDATE);
00067
00068 ostringstream oss;
00069 for(o=0; o<ctrl_onObservations_->to<mrs_natural>(); o++){
00070 oss << "Delta_" << o << ",";
00071 }
00072 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00073
00074
00075 if(normalize_ && inSamples_ == 1){
00076 delta_.create(inObservations_, size_);
00077 } else {
00078 delta_.create(inObservations_, inSamples_);
00079 }
00080 prevData_.create(inObservations_, 1);
00081 if(sum_){
00082 normVec_.create(1,size_);
00083 } else {
00084 normVec_.create(inObservations_, size_);
00085 }
00086
00087 }
00088
00089 void
00090 Delta::myProcess(realvec& in, realvec& out)
00091 {
00092 mrs_natural i, j, k;
00093 if(inSamples_ > 0){
00094 for(j=0; j<onObservations_; j++){
00095 for(i=0; i<onSamples_; ++i){
00096 out(j,i) = 0.0;
00097 }
00098 }
00099
00100 if(inSamples_ == 1){
00101 if(normalize_){
00102 for(j=0; j<inObservations_; j++){
00103 for(i=0; i<size_-1; ++i){
00104 delta_(j,i) = delta_(j,i+1);
00105 }
00106 }
00107 for(j=0; j<inObservations_; j++){
00108 delta_(j,size_-1) = in(j,0) - prevData_(j,0);
00109 }
00110 } else {
00111 for(j=0; j<inObservations_; j++){
00112 delta_(j,0) = in(j,0) = prevData_(j,0);
00113 }
00114 }
00115 } else {
00116 for(j=0; j<inObservations_; j++){
00117 delta_(j,0) = in(j,0);
00118 }
00119 for(j=0; j<inObservations_; j++){
00120 for(i=1; i<inSamples_; ++i){
00121 delta_(j,i) = in(j,i)-in(j,i-1);
00122 }
00123 }
00124 }
00125
00126 if(positive_){
00127 for(j=0; j<inObservations_; j++){
00128 for(i=0; i<delta_.getCols(); ++i){
00129 if(delta_(j,i) < 0){
00130 delta_(j,i) = 0.0;
00131 }
00132 }
00133 }
00134 } else if(absolute_){
00135 for(j=0; j<inObservations_; j++){
00136 for(i=0; i<delta_.getCols(); ++i){
00137 if(delta_(j,i) < 0){
00138 delta_(j,i) = -delta_(j,i);
00139 }
00140 }
00141 }
00142 }
00143
00144 if(inSamples_ == 1){
00145 for(j=0; j<inObservations_; j++){
00146 prevData_(j,0) = in(j,0);
00147 }
00148 }
00149
00150 if(normalize_){
00151 if(inSamples_ == 1){
00152 if(sum_){
00153 for(i=0; i<size_; ++i){
00154 normVec_(0,i) = 0.0;
00155 }
00156 for(j=0; j<inObservations_; j++){
00157 for(i=0; i<size_; ++i){
00158 normVec_(0,i) += delta_(j,i);
00159 }
00160 }
00161 } else {
00162 normVec_ = delta_;
00163 }
00164 normVec_.normObsMinMax();
00165 for(j=0; j<normVec_.getRows(); j++){
00166 out(j,0) = normVec_(j,size_-1);
00167 }
00168 } else {
00169 for(k=0; k<size_/2; k++){
00170 for(i=size_/2-k; i<size_; ++i){
00171 if(sum_){
00172 normVec_(0,i) = 0.0;
00173 for(j=0; j<inObservations_; j++){
00174 normVec_(0,i) += delta_(j,i-size_/2+k);
00175 }
00176 } else {
00177 for(j=0; j<inObservations_; j++){
00178 normVec_(j,i) = delta_(j,i-size_/2+k);
00179 }
00180 }
00181 }
00182 normVec_.normObsMinMax();
00183 for(j=0; j<normVec_.getRows(); j++){
00184 out(j,k) = normVec_(j,size_/2);
00185 }
00186 }
00187 for(k=size_/2; k<inSamples_-size_/2; k++){
00188 for(i=0; i<size_; ++i){
00189 if(sum_){
00190 normVec_(0,i) = 0.0;
00191 for(j=0; j<inObservations_; j++){
00192 normVec_(0,i) += delta_(j,i+k-size_/2);
00193 }
00194 } else {
00195 for(j=0; j<inObservations_; j++){
00196 normVec_(j,i) = delta_(j,i+k-size_/2);
00197 }
00198 }
00199 }
00200 normVec_.normObsMinMax();
00201 for(j=0; j<normVec_.getRows(); j++){
00202 out(j,k) = normVec_(j,size_/2);
00203 }
00204 }
00205 for(k=inSamples_-size_/2; k<inSamples_; k++){
00206 for(i=k-size_/2; i<inSamples_; ++i){
00207 if(sum_){
00208 normVec_(0,i+size_/2-k) = 0.0;
00209 for(j=0; j<inObservations_; j++){
00210 normVec_(0,i+size_/2-k) += delta_(j,i);
00211 }
00212 } else {
00213 for(j=0; j<inObservations_; j++){
00214 normVec_(j,i+size_/2-k) = delta_(j,i);
00215 }
00216 }
00217 }
00218 }
00219 }
00220 } else {
00221 if(sum_){
00222 for(j=0; j<inObservations_; j++){
00223 for(i=0; i<inSamples_; ++i){
00224 out(0,i) += delta_(j,i);
00225 }
00226 }
00227 } else {
00228 for(j=0; j<inObservations_; j++){
00229 for(i=0; i<inSamples_; ++i){
00230 out(j,i) = delta_(j,i);
00231 }
00232 }
00233 }
00234 }
00235
00236 }
00237 }
00238