00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "WaveletPyramid.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 WaveletPyramid::WaveletPyramid(mrs_string name):MarSystem("WaveletPyramid",name)
00025 {
00026 waveletStep_ = NULL;
00027
00028 addControls();
00029 }
00030
00031 WaveletPyramid::~WaveletPyramid()
00032 {
00033 delete waveletStep_;
00034 }
00035
00036
00037
00038 WaveletPyramid::WaveletPyramid(const WaveletPyramid& a):MarSystem(a)
00039 {
00040 waveletStep_ = NULL;
00041 }
00042
00043
00044
00045 MarSystem*
00046 WaveletPyramid::clone() const
00047 {
00048 return new WaveletPyramid(*this);
00049 }
00050
00051 void
00052 WaveletPyramid::addControls()
00053 {
00054 addctrl("mrs_bool/forward", true);
00055 }
00056
00057 void
00058 WaveletPyramid::myUpdate(MarControlPtr sender)
00059 {
00060 (void) sender;
00061
00062 if (waveletStep_ == NULL)
00063 {
00064
00065 waveletStep_ = new Daub4("daub4");
00066 }
00067
00068 MRSDIAG("WaveletPyramid.cpp - WaveletPyramid:myUpdate");
00069
00070 setctrl("mrs_natural/onSamples", getctrl("mrs_natural/inSamples"));
00071 setctrl("mrs_natural/onObservations", getctrl("mrs_natural/inObservations"));
00072 setctrl("mrs_real/osrate", getctrl("mrs_real/israte"));
00073
00074 waveletStep_->updControl("mrs_natural/inSamples", getctrl("mrs_natural/inSamples"));
00075 waveletStep_->updControl("mrs_natural/inObservations", getctrl("mrs_natural/inObservations"));
00076 waveletStep_->updControl("mrs_real/israte", getctrl("mrs_real/israte"));
00077
00078 }
00079
00080
00081 void
00082 WaveletPyramid::myProcess(realvec& in, realvec& out)
00083 {
00084 mrs_natural o,t;
00085 mrs_natural nn;
00086 mrs_natural n;
00087 mrs_bool forward;
00088
00089 n = getctrl("mrs_natural/inSamples")->to<mrs_natural>();
00090
00091 if (n < 4)
00092 {
00093
00094
00095 return;
00096 }
00097
00098
00099 for (o = 0; o < inObservations_; o++)
00100 {
00101 for (t = 0; t < inSamples_; t++)
00102 {
00103 out(o, t) = in(o, t);
00104 }
00105 }
00106
00107 forward = getctrl("mrs_bool/forward")->to<mrs_bool>();
00108
00109 waveletStep_->updControl("mrs_bool/forward", forward);
00110 if (forward)
00111 {
00112 for (nn = n; nn >=4; nn >>= 1)
00113 {
00114 waveletStep_->setctrl("mrs_natural/processSize", nn);
00115 waveletStep_->process(out, out);
00116 }
00117 }
00118 else
00119 {
00120 for (nn = 4; nn <= n; nn <<= 1)
00121 {
00122 waveletStep_->setctrl("mrs_natural/processSize", nn);
00123 waveletStep_->process(out, out);
00124 }
00125 }
00126
00127 }