00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "peakView.h"
00021
00022 using namespace std;
00023 using namespace Marsyas;
00024
00025 peakView::peakView(realvec& vec): vec_(vec), fs_(0), frameSize_(0)
00026 {
00027
00028 frameMaxNumPeaks_ = vec_.getRows() / nbPkParameters;
00029 numFrames_ = vec_.getCols();
00030 }
00031
00032 peakView::~peakView()
00033 {
00034
00035 }
00036
00037 mrs_natural
00038 peakView::getNumGroups()
00039 {
00040 mrs_natural numGroups = 0;
00041
00042 for(mrs_natural f=0; f < numFrames_; ++f)
00043 for(mrs_natural p = 0; p < this->getFrameNumPeaks(f); ++p)
00044 {
00045 if((*this)(p, pkGroup, f) > numGroups)
00046 numGroups = (mrs_natural)(*this)(p, pkGroup, f);
00047 }
00048 numGroups++;
00049 return numGroups;
00050 }
00051
00052 mrs_natural
00053 peakView::getFrameNumPeaks(const mrs_natural frame, const mrs_natural group) const
00054 {
00055 if(group==-1)
00056 {
00057
00058
00059
00060
00061 mrs_natural p;
00062 for(p=0; p < frameMaxNumPeaks_; ++p)
00063 {
00064 if((*this)(p, pkFrequency, frame) == 0)
00065 return p;
00066 }
00067 return frameMaxNumPeaks_;
00068 }
00069 else
00070 {
00071 mrs_natural numPeaks = 0;
00072 for(mrs_natural p = 0; p < frameMaxNumPeaks_; ++p)
00073 {
00074 if((*this)(p, pkFrequency, frame) == 0)
00075 return numPeaks;
00076
00077 if((*this)(p, pkGroup, frame) == group)
00078 numPeaks++;
00079 }
00080 return numPeaks;
00081 }
00082 }
00083
00084 mrs_natural
00085 peakView::getTotalNumPeaks(const mrs_natural group) const
00086 {
00087 mrs_natural numPeaks = 0;
00088 for(mrs_natural f=0; f < numFrames_; ++f)
00089 {
00090 numPeaks += this->getFrameNumPeaks(f, group);
00091 }
00092 return numPeaks;
00093 }
00094
00095 void
00096 peakView::removePeak (const mrs_natural peakIndex, const mrs_natural frame)
00097 {
00098 mrs_natural p,
00099 totalNumPeaks = getTotalNumPeaks ();
00100 for (mrs_natural i = peakIndex; i < totalNumPeaks -1; i++)
00101 {
00102 for (p = 0; p < nbPkParameters; p++)
00103 vec_(peakIndex + p * frameMaxNumPeaks_, frame) = vec_(peakIndex + 1 + p * frameMaxNumPeaks_, frame);
00104 }
00105 for (p = 0; p < nbPkParameters; p++)
00106 vec_(totalNumPeaks -1 + p * frameMaxNumPeaks_, frame) = 0;
00107 }
00108
00109 void
00110 peakView::getPeaksParam(vector<realvec>& result, const pkParameter param, mrs_natural startFrame, mrs_natural endFrame) const
00111 {
00112 if(startFrame < 0 || endFrame < 0)
00113 {
00114 MRSWARN("peakView::getPeaksParam: negative start/stop frame! Returning empty vector.");
00115 return;
00116 }
00117 if(startFrame >= vec_.getCols() || endFrame >= vec_.getCols())
00118 {
00119 MRSWARN("peakView::getPeaksParam: start/end frame bigger than vector column size! Returning empty vector.");
00120 return;
00121 }
00122
00123 mrs_natural numPeaks;
00124
00125 for(mrs_natural f = startFrame; f <= endFrame; ++f)
00126 {
00127
00128
00129 numPeaks = getFrameNumPeaks(f);
00130 realvec valVec(numPeaks);
00131
00132 for(mrs_natural p=0; p<numPeaks; ++p)
00133 valVec(p) = (*this)(p, param, f);
00134
00135 result.push_back(valVec);
00136 }
00137 }
00138
00139 mrs_string
00140 peakView::getParamName(mrs_natural paramIdx)
00141 {
00142 switch(paramIdx)
00143 {
00144 case 0:
00145 return "pkFrequency";
00146 break;
00147 case 1:
00148 return "pkAmplitude";
00149 break;
00150 case 2:
00151 return "pkPhase";
00152 break;
00153 case 3:
00154 return "pkDeltaFrequency";
00155 break;
00156 case 4:
00157 return "pkDeltaAmplitude";
00158 break;
00159 case 5:
00160 return "pkFrame";
00161 break;
00162 case 6:
00163 return "pkGroup";
00164 break;
00165 case 7:
00166 return "pkVolume";
00167 break;
00168 case 8:
00169 return "pkPan";
00170 break;
00171 case 9:
00172 return "pkBinLow";
00173 break;
00174 case 10:
00175 return "pkBin";
00176 break;
00177 case 11:
00178 return "pkBinHigh";
00179 break;
00180 case 12:
00181 return "nbPkParameters";
00182 break;
00183 default:
00184 return "MARSYAS_EMPTY";
00185 break;
00186 }
00187 }
00188
00189 void
00190 peakView::toTable(realvec& vecTable)
00191 {
00192
00193 vecTable.create(frameMaxNumPeaks_*numFrames_+1, nbPkParameters);
00194
00195
00196
00197 vecTable(0, 0) = -1;
00198 vecTable(0, 1) = fs_;
00199 vecTable(0, 2) = frameSize_;
00200 vecTable(0, 3) = frameMaxNumPeaks_;
00201 vecTable(0, 4) = numFrames_;
00202 vecTable(0, 5) = -1;
00203 vecTable(0, pkGroup) = -2;
00204 for (mrs_natural i = pkGroup+1 ; i < nbPkParameters ; ++i)
00205 vecTable(0, i)=0;
00206
00207
00208
00209 mrs_natural l = 1;
00210 for (mrs_natural j=0 ; j < vec_.getCols(); ++j)
00211 for (mrs_natural i=0 ; i < frameMaxNumPeaks_; ++i)
00212 {
00213
00214 if(vec_(i, j) != 0.0)
00215 {
00216 for(mrs_natural k = 0; k < nbPkParameters; k++)
00217 vecTable(l, k) = (*this)(i, pkParameter(k), j);
00218 l++;
00219 }
00220 }
00221
00222
00223
00224
00225 vecTable.stretch(l, nbPkParameters);
00226 }
00227
00228 void
00229 peakView::fromTable(const realvec& vecTable)
00230 {
00231
00232 fs_ = vecTable(0, 1);
00233 frameSize_ = (mrs_natural)vecTable(0, 2);
00234 frameMaxNumPeaks_ = (mrs_natural)vecTable(0, 3);
00235 numFrames_ = (mrs_natural)vecTable(0, 4);
00236
00237
00238 mrs_natural frame = (mrs_natural)vecTable(1, pkFrame);
00239
00240
00241
00242 vec_.create(frameMaxNumPeaks_*nbPkParameters, numFrames_+frame);
00243
00244 mrs_natural p = 0;
00245 mrs_natural r = 1;
00246
00247
00248 mrs_natural actualNbPkParams = (mrs_natural)min((mrs_real)nbPkParameters, (mrs_real)vecTable.getCols());
00249
00250
00251 while(r < vecTable.getRows()-1)
00252 {
00253
00254 for(mrs_natural prm = 0; prm < actualNbPkParams; ++prm)
00255 {
00256 (*this)(p, pkParameter(prm), frame) = vecTable(r, prm);
00257 }
00258 ++r;
00259 p++;
00260
00261
00262 if(vecTable(r, pkFrame) != frame)
00263 {
00264 frame = (mrs_natural)vecTable(r, pkFrame);
00265 p = 0;
00266 }
00267 }
00268 }
00269
00270 bool
00271 peakView::peakWrite(mrs_string filename, mrs_real fs, mrs_natural frameSize)
00272 {
00273
00274 if(fs != 0)
00275 fs_ = fs;
00276 if(frameSize != 0)
00277 frameSize_ = frameSize;
00278
00279
00280
00281 realvec resVec;
00282 this->toTable(resVec);
00283 return resVec.write(filename);
00284 }
00285
00286 bool
00287 peakView::peakRead(mrs_string filename)
00288 {
00289
00290 realvec vec_Table;
00291 if(vec_Table.read(filename))
00292 {
00293
00294 this->fromTable(vec_Table);
00295 return true;
00296 }
00297 else
00298 return false;
00299 }