CLAM-Development  1.4.0
SpectralPeakDescriptors.hxx
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
3  * UNIVERSITAT POMPEU FABRA
4  *
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 
22 #ifndef __SpectralPeakDescriptors_H__
23 #define __SpectralPeakDescriptors_H__
24 #include <typeinfo>
25 #include "Descriptor.hxx"
26 
27 /*
28  * This class holds Descriptors computed from SpectralPeak data
29  *
30  *
31  */
32 
33 namespace CLAM {
34 
35 
36  class SpectralPeakArray;
37 
38 
40  public:
47  DYN_ATTRIBUTE (0, public, TData, MagnitudeMean);
59  DYN_ATTRIBUTE (1, public, TData, HarmonicCentroid);
78  DYN_ATTRIBUTE (2, public, TData, HarmonicDeviation);
84  DYN_ATTRIBUTE (3, public, TData, FirstTristimulus);
89  DYN_ATTRIBUTE (4, public, TData, SecondTristimulus);
94  DYN_ATTRIBUTE (5, public, TData, ThirdTristimulus);
101  DYN_ATTRIBUTE (6, public, TData, OddHarmonics);
110  DYN_ATTRIBUTE (7, public, TData, EvenHarmonics);
124  DYN_ATTRIBUTE (8, public, TData, OddToEvenRatio);
125  DYN_ATTRIBUTE (9,public, Array<TData>, HPCP); // Harmonic Pitch Class Profile
126 
127  public:
128  SpectralPeakDescriptors(SpectralPeakArray* pSpectralPeakArray);
130 
132  void SetpSpectralPeakArray(SpectralPeakArray* pSpectralPeakArray);
133  void ConcreteCompute();
134 
135  private:
136  void DefaultInit();
137  void CopyInit(const SpectralPeakDescriptors & copied);
138 
139  TData ComputeCentroid();
140  TData ComputeFirstTristimulus();
141  TData ComputeSecondTristimulus();
142  TData ComputeThirdTristimulus();
143  TData ComputeHarmonicDeviation();
144  TData ComputeOddHarmonics();
145  TData ComputeEvenHarmonics();
146  TData ComputeOddToEvenRatio();
147 
148  private:
149  const SpectralPeakArray* mpSpectralPeakArray;
150  CrossCenterOfGravity<1> mCentroid;
151 
152  };
153 
154 
159 
160 template<>
162 {
163  SpectralPeakDescriptors tmpD(a);
164 
165  if (a.HasMagnitudeMean() && b.HasMagnitudeMean())
166  {
167  if(b.GetMagnitudeMean()>a.GetMagnitudeMean())
168  tmpD.SetMagnitudeMean(b.GetMagnitudeMean());
169  }
170  if (a.HasHarmonicCentroid() && b.HasHarmonicCentroid())
171  {
172  if(b.GetHarmonicCentroid()>a.GetHarmonicCentroid())
173  tmpD.SetHarmonicCentroid(b.GetHarmonicCentroid());
174  }
175  if (a.HasFirstTristimulus() && b.HasFirstTristimulus())
176  {
177  if(b.GetFirstTristimulus()>a.GetFirstTristimulus())
178  tmpD.SetFirstTristimulus(b.GetFirstTristimulus());
179  }
180  if (a.HasSecondTristimulus() && b.HasSecondTristimulus())
181  {
182  if(b.GetSecondTristimulus()>a.GetSecondTristimulus())
183  tmpD.SetSecondTristimulus(b.GetSecondTristimulus());
184  }
185  if (a.HasThirdTristimulus() && b.HasThirdTristimulus())
186  {
187  if(b.GetThirdTristimulus()>a.GetThirdTristimulus())
188  tmpD.SetThirdTristimulus(b.GetThirdTristimulus());
189  }
190  if (a.HasHarmonicDeviation() && b.HasHarmonicDeviation())
191  {
192  if(b.GetHarmonicDeviation()>a.GetHarmonicDeviation())
193  tmpD.SetHarmonicDeviation(b.GetHarmonicDeviation());
194  }
195  if (a.HasOddHarmonics() && b.HasOddHarmonics())
196  {
197  if(b.GetOddHarmonics()>a.GetOddHarmonics())
198  tmpD.SetOddHarmonics(b.GetOddHarmonics());
199  }
200  if (a.HasEvenHarmonics() && b.HasEvenHarmonics())
201  {
202  if(b.GetEvenHarmonics()>a.GetEvenHarmonics())
203  tmpD.SetEvenHarmonics(b.GetEvenHarmonics());
204  }
205  if (a.HasOddToEvenRatio() && b.HasOddToEvenRatio())
206  {
207  if(b.GetOddToEvenRatio()>a.GetOddToEvenRatio())
208  tmpD.SetOddToEvenRatio(b.GetOddToEvenRatio());
209  }
210 
211  return tmpD;
212 }
213 
214 template<>
216 {
217  SpectralPeakDescriptors tmpD(a);
218 
219  if (a.HasMagnitudeMean() && b.HasMagnitudeMean())
220  {
221  if(b.GetMagnitudeMean()<a.GetMagnitudeMean())
222  tmpD.SetMagnitudeMean(b.GetMagnitudeMean());
223  }
224  if (a.HasHarmonicCentroid() && b.HasHarmonicCentroid())
225  {
226  if(b.GetHarmonicCentroid()<a.GetHarmonicCentroid())
227  tmpD.SetHarmonicCentroid(b.GetHarmonicCentroid());
228  }
229  if (a.HasFirstTristimulus() && b.HasFirstTristimulus())
230  {
231  if(b.GetFirstTristimulus()<a.GetFirstTristimulus())
232  tmpD.SetFirstTristimulus(b.GetFirstTristimulus());
233  }
234  if (a.HasSecondTristimulus() && b.HasSecondTristimulus())
235  {
236  if(b.GetSecondTristimulus()<a.GetSecondTristimulus())
237  tmpD.SetSecondTristimulus(b.GetSecondTristimulus());
238  }
239  if (a.HasThirdTristimulus() && b.HasThirdTristimulus())
240  {
241  if(b.GetThirdTristimulus()<a.GetThirdTristimulus())
242  tmpD.SetThirdTristimulus(b.GetThirdTristimulus());
243  }
244  if (a.HasHarmonicDeviation() && b.HasHarmonicDeviation())
245  {
246  if(b.GetHarmonicDeviation()<a.GetHarmonicDeviation())
247  tmpD.SetHarmonicDeviation(b.GetHarmonicDeviation());
248  }
249  if (a.HasOddHarmonics() && b.HasOddHarmonics())
250  {
251  if(b.GetOddHarmonics()<a.GetOddHarmonics())
252  tmpD.SetOddHarmonics(b.GetOddHarmonics());
253  }
254  if (a.HasEvenHarmonics() && b.HasEvenHarmonics())
255  {
256  if(b.GetEvenHarmonics()<a.GetEvenHarmonics())
257  tmpD.SetEvenHarmonics(b.GetEvenHarmonics());
258  }
259  if (a.HasOddToEvenRatio() && b.HasOddToEvenRatio())
260  {
261  if(b.GetOddToEvenRatio()<a.GetOddToEvenRatio())
262  tmpD.SetOddToEvenRatio(b.GetOddToEvenRatio());
263  }
264 
265  return tmpD;
266 }
267 
268 
269 
270 }
271 
272 
273 #endif /* __SpectralPeakDescriptors_H__ */
274