SpectralPeakArray.hxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
00003  *                         UNIVERSITAT POMPEU FABRA
00004  *
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  */
00021 
00023 // Class SpectralPeakArray: Processing Data class to store an array of spectral peaks
00025 // Description:
00026 //  This processing data class offers an interface for storing an array of spectral
00027 //  peaks while maintaining efficient data access. This is accomplished by actually
00028 //  storing in memory an independent buffer for each of the attributes of a spectral
00029 //  peak. The interface to use SpectralPeak class is simulated adding an interface
00030 //  that constructs these objects on the fly, whenever a Peak is accessed.
00031 //  Furthermore, this class holds an array of indices that can be used for different
00032 //  purposes such as sorting, assigning tracks...Any peak can be accessed throug its
00033 //  actual position in the array or its associated index
00035 
00036 
00037 
00038 #ifndef _SpectralPeakArray_
00039 #define _SpectralPeakArray_
00040 
00041 #include "DynamicType.hxx"
00042 #include "Array.hxx"
00043 #include "IndexArray.hxx"
00044 #include "DataTypes.hxx"
00045 #include "OSDefines.hxx"
00046 #include "Err.hxx"
00047 #include "ProcessingData.hxx"
00048 #include "SpectralPeak.hxx"
00049 
00050 
00051 
00052 namespace CLAM{
00053 
00054 
00068 class SpectralPeakArray : public ProcessingData
00069 {
00070 public:
00071         DYNAMIC_TYPE_USING_INTERFACE (SpectralPeakArray, 8, ProcessingData);
00072         DYN_ATTRIBUTE (0, public, EScale, Scale);
00073         DYN_ATTRIBUTE (1, public, DataArray, MagBuffer);
00074         DYN_ATTRIBUTE (2, public, DataArray, FreqBuffer);
00075         DYN_ATTRIBUTE (3, public, DataArray, PhaseBuffer);
00076         DYN_ATTRIBUTE (4, public, DataArray, BinPosBuffer);
00077         DYN_ATTRIBUTE (5, public, DataArray, BinWidthBuffer);
00078         DYN_ATTRIBUTE (6, public, IndexArray, IndexArray);
00079         DYN_ATTRIBUTE (7, public, bool, MinimizeResizes);
00080 
00081 protected:
00082         void DefaultInit();
00083 public:
00084 
00090         SpectralPeakArray(const SpectralPeak& prototype);
00091 
00097         void InitFromPrototype(const SpectralPeak& spectralPeak);
00098 
00104         void InitPeak(SpectralPeak& spectralPeak) const;
00105 
00106 
00111         TData GetMag(TIndex pos) const{return GetMagBuffer()[pos];}
00116         TData GetFreq(TIndex pos)const{return GetFreqBuffer()[pos];}
00121         TData GetPhase(TIndex pos)const{return GetPhaseBuffer()[pos];}
00126         TData GetBinPos(TIndex pos)const{return GetBinPosBuffer()[pos];}
00131         int GetBinWidth(TIndex pos)const{return int(GetBinWidthBuffer()[pos]);}
00136         void SetMag(TIndex pos,TData newMag){GetMagBuffer()[pos]=newMag;}
00141         void SetFreq(TIndex pos,TData newFreq){GetFreqBuffer()[pos]=newFreq;}
00146         void SetPhase(TIndex pos,TData newPhase){GetPhaseBuffer()[pos]=newPhase;}
00151         void SetBinPos(TIndex pos,TData newBinPos){GetBinPosBuffer()[pos]=newBinPos;}
00156         void SetBinWidth(TIndex pos,int newBinWidth){GetBinWidthBuffer()[pos]=TData(newBinWidth);}
00157 
00161         TIndex GetMaxMagPos() const;
00162 
00166         TIndex GetMaxMagIndex() const;
00167 
00168 
00175         void InitSpectralPeak(SpectralPeak& spectralPeak) const;
00181         bool IsCorrectPrototype(const SpectralPeak& spectralPeak) const;
00187         SpectralPeak GetSpectralPeak(TIndex pos) const;
00193         SpectralPeak GetThruIndexSpectralPeak(TIndex pos) const;
00200         void SetSpectralPeak(TIndex pos,const SpectralPeak& spectralPeak,TIndex index=-1);
00210         void InsertSpectralPeak(TIndex pos,const SpectralPeak& spectralPeak,
00211                                                         bool insertIndex=false,TIndex index=-1);
00219         void AddSpectralPeak(const SpectralPeak& spectralPeak,bool addIndex=false,TIndex index=-1);
00226         void DeleteSpectralPeak(TIndex pos,bool deleteIndex=false);
00227 
00228 
00229 
00230 /* index handling */
00231 
00235         int GetnIndexedPeaks() const;
00236 
00241         TIndex GetPositionFromIndex(TIndex index) const;
00242 
00247         void SetIndex(TIndex pos,TIndex index){GetIndexArray()[pos]=index;};
00252         TIndex GetIndex(TIndex pos) const {return GetIndexArray()[pos];}
00256         void DeleteIndex (TIndex index);
00261         void ResetIndices();
00266         void InitIndices();
00271         void SetIndicesTo(TIndex val);
00275         void AddIndex(TIndex index);
00276 
00282         TIndex GetFirstNonValidIndexPosition(TIndex beginAt) const;
00287         bool IsValidIndex(TIndex position) const;
00292         TIndex IsIndexExisting(TIndex index) const;
00296         TIndex GetMaxIndex() const;
00297 
00298 /* Peak Array size handling*/
00299 
00305         TSize GetnPeaks() const
00306         {
00307                 if(HasMagBuffer()) return GetMagBuffer().Size();
00308                 if(HasFreqBuffer()) return GetFreqBuffer().Size();
00309                 if(HasPhaseBuffer()) return GetPhaseBuffer().Size();
00310                 if(HasBinPosBuffer()) return GetBinPosBuffer().Size();
00311                 if(HasBinWidthBuffer()) return GetBinWidthBuffer().Size();
00312                 else return 0;
00313         }
00314 
00319 // I think we need the Resize() as well. It does not hurt at least. - Yushen Han
00320 
00321         void SetnPeaks(TSize npeaks)
00322         {
00323                 if (npeaks>GetnMaxPeaks()) SetnMaxPeaks(npeaks);
00324                 if(HasMagBuffer()) {
00325                         GetMagBuffer().Resize(npeaks);
00326                         GetMagBuffer().SetSize(npeaks);}
00327                 if(HasFreqBuffer()) {
00328                         GetFreqBuffer().Resize(npeaks);
00329                         GetFreqBuffer().SetSize(npeaks);}
00330                 if(HasPhaseBuffer()){
00331                         GetPhaseBuffer().Resize(npeaks);
00332                         GetPhaseBuffer().SetSize(npeaks);}
00333                 if(HasBinPosBuffer()) {
00334                         GetBinPosBuffer().Resize(npeaks);
00335                         GetBinPosBuffer().SetSize(npeaks);}
00336                 if(HasBinWidthBuffer()) {
00337                         GetBinWidthBuffer().Resize(npeaks);
00338                         GetBinWidthBuffer().SetSize(npeaks);}
00339                 if(HasIndexArray()) {
00340                         GetIndexArray().Resize(npeaks);
00341                         GetIndexArray().SetSize(npeaks);}
00342 
00343 
00344         }
00345 
00349         void SetnMaxPeaks(TSize npeaks)
00350         {
00351                 if(HasMagBuffer()){
00352                         GetMagBuffer().Resize(npeaks);
00353                         if(GetMinimizeResizes())
00354                                 GetMagBuffer().SetStep(npeaks);}
00355                 if(HasFreqBuffer()){
00356                         GetFreqBuffer().Resize(npeaks);
00357                         if(GetMinimizeResizes())
00358                                 GetFreqBuffer().SetStep(npeaks);}
00359                 if(HasPhaseBuffer()){
00360                         GetPhaseBuffer().Resize(npeaks);
00361                         if(GetMinimizeResizes())
00362                                 GetPhaseBuffer().SetStep(npeaks);}
00363                 if(HasBinPosBuffer()){
00364                         GetBinPosBuffer().Resize(npeaks);
00365                         if(GetMinimizeResizes())
00366                                 GetBinPosBuffer().SetStep(npeaks);}
00367                 if(HasBinWidthBuffer()){
00368                         GetBinWidthBuffer().Resize(npeaks);
00369                         if(GetMinimizeResizes())
00370                                 GetBinWidthBuffer().SetStep(npeaks);}
00371                 if(HasIndexArray()){
00372                         GetIndexArray().Resize(npeaks);
00373                         if(GetMinimizeResizes())
00374                                 GetIndexArray().SetStep(npeaks);}
00375         }
00376 
00382         TSize GetnMaxPeaks() const
00383         {
00384                 if(HasMagBuffer()) return GetMagBuffer().AllocatedSize();
00385                 if(HasFreqBuffer()) return GetFreqBuffer().AllocatedSize();
00386                 if(HasPhaseBuffer()) return GetPhaseBuffer().AllocatedSize();
00387                 if(HasBinPosBuffer()) return GetBinPosBuffer().AllocatedSize();
00388                 if(HasBinWidthBuffer()) return GetBinWidthBuffer().AllocatedSize();
00389                 else return 0;
00390         }
00391 
00392         //index getters and setters
00393         double GetThruIndexFreq(TIndex pos) const;
00394         double GetThruIndexMag(TIndex pos) const;
00395         double GetThruIndexPhase(TIndex pos) const;
00396         double GetThruIndexBinPos(TIndex pos) const;
00397         TSize  GetThruIndexBinWidth(TIndex pos) const;
00398         void   SetThruIndexFreq(TIndex pos,double freq);
00399         void   SetThruIndexMag(TIndex pos,double mag) ;
00400         void   SetThruIndexPhase(TIndex pos,double phase) ;
00401         void   SetThruIndexBinPos(TIndex pos,double binPos);
00402         void   SetThruIndexBinWidth(TIndex pos,TSize binWidth);
00403         void   SetThruIndexSpectralPeak(TIndex pos,SpectralPeak& peak);
00404 
00405         void SetIsIndexUpToDate(bool isUpToDate)
00406         {
00407                 mIsIndexUpToDate = isUpToDate;
00408         }
00409 
00411         void TodB();
00413         void ToLinear();
00414 
00420         void CopyMembers(SpectralPeakArray& sourceSpectralPeakArray);
00421 
00422         SpectralPeakArray operator+(const SpectralPeakArray& in);
00423 private:
00424         bool mIsIndexUpToDate;
00425 
00426 };
00427 
00428 }; // namespace CLAM
00429 
00430 #endif
00431 
Generated by  doxygen 1.6.3