00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "WHaSp.h"
00020 #include "peakView.h"
00021 #include "PeakFeatureSelect.h"
00022 #include "SelfSimilarityMatrix.h"
00023 #include "HWPS.h"
00024
00025 using namespace std;
00026 using namespace Marsyas;
00027
00028 WHaSp::WHaSp(mrs_string name):MarSystem("WHaSp", name)
00029 {
00030 HWPSnet_ = NULL;
00031
00032 addControls();
00033 }
00034
00035 WHaSp::WHaSp(const WHaSp& a) : MarSystem(a)
00036 {
00037 ctrl_histSize_ = getctrl("mrs_natural/histSize");
00038 ctrl_totalNumPeaks_ = getctrl("mrs_natural/totalNumPeaks");
00039 ctrl_frameMaxNumPeaks_ = getctrl("mrs_natural/frameMaxNumPeaks");
00040
00041 HWPSnet_ = NULL;
00042 }
00043
00044 WHaSp::~WHaSp()
00045 {
00046 delete HWPSnet_;
00047 }
00048
00049 MarSystem*
00050 WHaSp::clone() const
00051 {
00052 return new WHaSp(*this);
00053 }
00054
00055 void
00056 WHaSp::addControls()
00057 {
00058 addctrl("mrs_natural/histSize", 20, ctrl_histSize_);
00059 addctrl("mrs_natural/totalNumPeaks",0, ctrl_totalNumPeaks_);
00060 addctrl("mrs_natural/frameMaxNumPeaks", 0, ctrl_frameMaxNumPeaks_);
00061 }
00062
00063 void
00064 WHaSp::createSimMatrixNet()
00065 {
00066 if(HWPSnet_)
00067 return;
00068
00069 HWPSnet_ = new Series("HWPSnet");
00070
00071
00072
00073 MarSystem* peFeatSelect = new PeakFeatureSelect("peFeatSelect");
00074 peFeatSelect->updControl("mrs_natural/selectedFeatures",
00075 PeakFeatureSelect::pkFrequency | PeakFeatureSelect::pkSetFrequencies| PeakFeatureSelect::pkSetAmplitudes);
00076 HWPSnet_->addMarSystem(peFeatSelect);
00077
00078
00079 SelfSimilarityMatrix* simMat = new SelfSimilarityMatrix("simMat");
00080 simMat->addMarSystem(new HWPS("hwps"));
00081
00082 HWPSnet_->addMarSystem(simMat);
00083
00084
00085 HWPSnet_->getctrl("PeakFeatureSelect/peFeatSelect/mrs_natural/totalNumPeaks")->linkTo(ctrl_totalNumPeaks_, NOUPDATE);
00086 HWPSnet_->update();
00087
00088
00089 HWPSnet_->getctrl("PeakFeatureSelect/peFeatSelect/mrs_natural/frameMaxNumPeaks")->linkTo(ctrl_frameMaxNumPeaks_, NOUPDATE);
00090 HWPSnet_->update();
00091
00092
00093 HWPSnet_->getctrl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_natural/histSize")->linkTo(ctrl_histSize_, NOUPDATE);
00094 HWPSnet_->update();
00095
00096 HWPSnet_->setctrl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_natural/histSize", 20);
00097 HWPSnet_->update();
00098
00099 HWPSnet_->updControl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_bool/calcDistance", true);
00100
00101
00102 HWPSnet_->update();
00103
00104 }
00105
00106 void
00107 WHaSp::myUpdate(MarControlPtr sender)
00108 {
00109
00110 MarSystem::myUpdate(sender);
00111
00112 if(!HWPSnet_)
00113 createSimMatrixNet();
00114
00115
00116 HWPSnet_->setctrl("mrs_natural/inSamples",ctrl_inSamples_);
00117 HWPSnet_->setctrl("mrs_natural/inObservations", ctrl_inObservations_);
00118 HWPSnet_->setctrl("mrs_real/israte", ctrl_israte_);
00119 HWPSnet_->updControl("mrs_string/inObsNames", ctrl_inObsNames_);
00120 }
00121
00122 void
00123 WHaSp::myProcess(realvec& in, realvec& out)
00124 {
00125 peakView inPkView(in);
00126 peakView outPkView(out);
00127
00128
00129
00130 out = in;
00131
00132 mrs_natural numPeaks = inPkView.getFrameNumPeaks();
00133
00134 if(numPeaks > 0)
00135 {
00136 simMatrix_.create(numPeaks, numPeaks);
00137
00138 HWPSnet_->process(in, simMatrix_);
00139
00140 mrs_real maxDist = MINREAL;
00141 realvec volumes(numPeaks);
00142
00143 for(mrs_natural r=0; r<numPeaks; ++r)
00144 {
00145 outPkView(r, peakView::pkVolume) = 0;
00146 for(mrs_natural c=0; c < numPeaks; ++c)
00147 {
00148 if(r != c)
00149 outPkView(r, peakView::pkVolume) += simMatrix_(r, c)*outPkView(c, peakView::pkAmplitude);
00150 }
00151 if(outPkView(r, peakView::pkVolume) > maxDist)
00152 maxDist = outPkView(r, peakView::pkVolume);
00153 volumes(r) = outPkView(r, peakView::pkVolume);
00154 }
00155
00156 volumes.sort();
00157
00158
00159 mrs_natural nbSelected = 10;
00160
00161
00162 for(mrs_natural i=0; i < numPeaks; ++i)
00163 {
00164
00165 mrs_bool found=false;
00166 for (mrs_natural j=0 ; j< nbSelected ; j++)
00167 if(volumes(nbSelected-j-1) == outPkView(i, peakView::pkVolume))
00168 found=true;
00169
00170 if(!found)
00171 outPkView(i, peakView::pkAmplitude) = 0;
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 }
00183 }
00184
00185
00186
00187
00188
00189 }
00190
00191
00192
00193
00194
00195
00196
00197