00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __SpectralDescriptors_H__
00023 #define __SpectralDescriptors_H__
00024
00025
00026 #include "Array.hxx"
00027 #include "Descriptor.hxx"
00028 #include "Spectrum.hxx"
00029
00030
00031
00032
00033
00034
00035
00036 namespace CLAM {
00037
00038 class SpectralDescriptors : public Descriptor {
00039 public:
00040 DYNAMIC_TYPE_USING_INTERFACE (SpectralDescriptors, 21, Descriptor);
00041
00050 DYN_ATTRIBUTE (0, public, TData, Mean);
00063 DYN_ATTRIBUTE (1, public, TData, GeometricMean);
00070 DYN_ATTRIBUTE (2, public, TData, Energy);
00078 DYN_ATTRIBUTE (3, public, TData, Centroid);
00079 DYN_ATTRIBUTE (4, public, TData, Moment2);
00080 DYN_ATTRIBUTE (5, public, TData, Moment3);
00081 DYN_ATTRIBUTE (6, public, TData, Moment4);
00082 DYN_ATTRIBUTE (7, public, TData, Moment5);
00083 DYN_ATTRIBUTE (8, public, TData, Moment6);
00084 DYN_ATTRIBUTE (9, public, TData, Flatness);
00085 DYN_ATTRIBUTE (10,public, TData, MagnitudeKurtosis);
00086 DYN_ATTRIBUTE (11,public, Array<TData>, MFCC);
00091 DYN_ATTRIBUTE (12,public, TData, MaxMagFreq);
00098 DYN_ATTRIBUTE (13,public, TData, LowFreqEnergyRelation);
00104 DYN_ATTRIBUTE (14,public, TData, Spread);
00105 DYN_ATTRIBUTE (15,public, TData, MagnitudeSkewness);
00115 DYN_ATTRIBUTE (16,public, TData, Rolloff);
00121 DYN_ATTRIBUTE (17,public, TData, Slope);
00131 DYN_ATTRIBUTE (18,public, TData, HighFrequencyContent);
00132 DYN_ATTRIBUTE (19,public, Array<SpectralDescriptors>, BandDescriptors);
00133
00134 DYN_ATTRIBUTE (20,public, Array<TData>,PCP);
00135
00136 public:
00137 SpectralDescriptors(Spectrum* pSpectrum);
00138 SpectralDescriptors(TData initVal);
00139
00140 const Spectrum* GetpSpectrum() const;
00141 void SetpSpectrum(Spectrum* pSpectrum);
00142 void ConcreteCompute();
00143
00144
00145 void DefaultInit();
00146 void CopyInit(const SpectralDescriptors & copied);
00147
00148 TData ComputeSpectralFlatness();
00149 TData ComputeHighFrequencyContent();
00150 TData ComputeMaxMagFreq();
00151 TData ComputeLowFreqEnergyRelation();
00152 TData ComputeRolloff();
00153 TData ComputeSpread();
00154 TData ComputeSlope();
00155
00156 private:
00157 const Spectrum* mpSpectrum;
00159 double mDeltaFreq;
00160 };
00161
00162 SpectralDescriptors operator * (const SpectralDescriptors& a,TData mult);
00163 SpectralDescriptors operator * (TData mult,const SpectralDescriptors& a);
00164 SpectralDescriptors operator / (const SpectralDescriptors& a,TData div);
00165 SpectralDescriptors operator * (const SpectralDescriptors& a,const SpectralDescriptors& b) ;
00166 SpectralDescriptors operator + (const SpectralDescriptors& a, const SpectralDescriptors& b);
00167
00168 template<>
00169 inline SpectralDescriptors CLAM_max (const SpectralDescriptors& a,const SpectralDescriptors& b)
00170 {
00171 SpectralDescriptors tmpD(a);
00172 if(a.HasMean() && b.HasMean() )
00173 {
00174 if(b.GetMean()>a.GetMean())
00175 tmpD.SetMean(b.GetMean());
00176 }
00177 if(a.HasGeometricMean() && b.HasGeometricMean() )
00178 {
00179 if(b.GetGeometricMean()>a.GetGeometricMean())
00180 tmpD.SetGeometricMean(b.GetGeometricMean());
00181 }
00182 if(a.HasEnergy() && b.HasEnergy() )
00183 {
00184 if(b.GetEnergy()>a.GetEnergy())
00185 tmpD.SetEnergy(b.GetEnergy());
00186 }
00187 if(a.HasCentroid() && b.HasCentroid() )
00188 {
00189 if(b.GetCentroid()>a.GetCentroid())
00190 tmpD.SetCentroid(b.GetCentroid());
00191 }
00192 if(a.HasMoment2() && b.HasMoment2() )
00193 {
00194 if(b.GetMoment2()>a.GetMoment2())
00195 tmpD.SetMoment2(b.GetMoment2());
00196 }
00197 if(a.HasMoment3() && b.HasMoment3() )
00198 {
00199 if(b.GetMoment3()>a.GetMoment3())
00200 tmpD.SetMoment3(b.GetMoment3());
00201 }
00202 if(a.HasMoment4() && b.HasMoment4() )
00203 {
00204 if(b.GetMoment4()>a.GetMoment4())
00205 tmpD.SetMoment4(b.GetMoment4());
00206 }
00207 if(a.HasMoment5() && b.HasMoment5())
00208 {
00209 if(b.GetMoment5()>a.GetMoment5())
00210 tmpD.SetMoment5(b.GetMoment5());
00211 }
00212 if(a.HasMoment6() && b.HasMoment6() )
00213 {
00214 if(b.GetMoment6()>a.GetMoment6())
00215 tmpD.SetMoment6(b.GetMoment6());
00216 }
00217 if(a.HasFlatness() && b.HasFlatness() )
00218 {
00219 if(b.GetFlatness()>a.GetFlatness())
00220 tmpD.SetFlatness(b.GetFlatness());
00221 }
00222 if(a.HasMagnitudeKurtosis() && b.HasMagnitudeKurtosis() )
00223 {
00224 if(b.GetMagnitudeKurtosis()>a.GetMagnitudeKurtosis())
00225 tmpD.SetMagnitudeKurtosis(b.GetMagnitudeKurtosis());
00226 }
00227 if(a.HasMaxMagFreq() && b.HasMaxMagFreq() )
00228 {
00229 if(b.GetMaxMagFreq()>a.GetMaxMagFreq())
00230 tmpD.SetMaxMagFreq(b.GetMaxMagFreq());
00231 }
00232 if(a.HasLowFreqEnergyRelation() && b.HasLowFreqEnergyRelation() )
00233 {
00234 if(b.GetLowFreqEnergyRelation()>a.GetLowFreqEnergyRelation())
00235 tmpD.SetLowFreqEnergyRelation(b.GetLowFreqEnergyRelation());
00236 }
00237 if(a.HasSpread() && b.HasSpread() )
00238 {
00239 if(b.GetSpread()>a.GetSpread())
00240 tmpD.SetSpread(b.GetSpread());
00241 }
00242 if(a.HasMagnitudeSkewness() && b.HasMagnitudeSkewness() )
00243 {
00244 if(b.GetMagnitudeSkewness()>a.GetMagnitudeSkewness())
00245 tmpD.SetMagnitudeSkewness(b.GetMagnitudeSkewness());
00246 }
00247 if(a.HasRolloff() && b.HasRolloff() )
00248 {
00249 if(b.GetRolloff()>a.GetRolloff())
00250 tmpD.SetRolloff(b.GetRolloff());
00251 }
00252 if(a.HasSlope() && b.HasSlope() )
00253 {
00254 if(b.GetSlope()>a.GetSlope())
00255 tmpD.SetSlope(b.GetSlope());
00256 }
00257 if(a.HasHighFrequencyContent() && b.HasHighFrequencyContent() )
00258 {
00259 if(b.GetHighFrequencyContent()>a.GetHighFrequencyContent())
00260 tmpD.SetHighFrequencyContent(b.GetHighFrequencyContent());
00261 }
00262 if(a.HasBandDescriptors() && b.HasBandDescriptors() )
00263 {
00264
00265
00266
00267
00268 }
00269 if(a.HasMFCC() && b.HasMFCC() )
00270 {
00271
00272
00273
00274 }
00275 return tmpD;
00276
00277 }
00278
00279 template<>
00280 inline SpectralDescriptors CLAM_min (const SpectralDescriptors& a,const SpectralDescriptors& b)
00281 {
00282 SpectralDescriptors tmpD(a);
00283 if(a.HasMean() && b.HasMean() )
00284 {
00285 if(b.GetMean()<a.GetMean())
00286 tmpD.SetMean(b.GetMean());
00287 }
00288 if(a.HasGeometricMean() && b.HasGeometricMean() )
00289 {
00290 if(b.GetGeometricMean()<a.GetGeometricMean())
00291 tmpD.SetGeometricMean(b.GetGeometricMean());
00292 }
00293 if(a.HasEnergy() && b.HasEnergy() )
00294 {
00295 if(b.GetEnergy()<a.GetEnergy())
00296 tmpD.SetEnergy(b.GetEnergy());
00297 }
00298 if(a.HasCentroid() && b.HasCentroid() )
00299 {
00300 if(b.GetCentroid()<a.GetCentroid())
00301 tmpD.SetCentroid(b.GetCentroid());
00302 }
00303 if(a.HasMoment2() && b.HasMoment2() )
00304 {
00305 if(b.GetMoment2()<a.GetMoment2())
00306 tmpD.SetMoment2(b.GetMoment2());
00307 }
00308 if(a.HasMoment3() && b.HasMoment3() )
00309 {
00310 if(b.GetMoment3()<a.GetMoment3())
00311 tmpD.SetMoment3(b.GetMoment3());
00312 }
00313 if(a.HasMoment4() && b.HasMoment4() )
00314 {
00315 if(b.GetMoment4()<a.GetMoment4())
00316 tmpD.SetMoment4(b.GetMoment4());
00317 }
00318 if(a.HasMoment5() && b.HasMoment5())
00319 {
00320 if(b.GetMoment5()<a.GetMoment5())
00321 tmpD.SetMoment5(b.GetMoment5());
00322 }
00323 if(a.HasMoment6() && b.HasMoment6() )
00324 {
00325 if(b.GetMoment6()<a.GetMoment6())
00326 tmpD.SetMoment6(b.GetMoment6());
00327 }
00328 if(a.HasFlatness() && b.HasFlatness() )
00329 {
00330 if(b.GetFlatness()<a.GetFlatness())
00331 tmpD.SetFlatness(b.GetFlatness());
00332 }
00333 if(a.HasMagnitudeKurtosis() && b.HasMagnitudeKurtosis() )
00334 {
00335 if(b.GetMagnitudeKurtosis()<a.GetMagnitudeKurtosis())
00336 tmpD.SetMagnitudeKurtosis(b.GetMagnitudeKurtosis());
00337 }
00338 if(a.HasMaxMagFreq() && b.HasMaxMagFreq() )
00339 {
00340 if(b.GetMaxMagFreq()<a.GetMaxMagFreq())
00341 tmpD.SetMaxMagFreq(b.GetMaxMagFreq());
00342 }
00343 if(a.HasLowFreqEnergyRelation() && b.HasLowFreqEnergyRelation() )
00344 {
00345 if(b.GetLowFreqEnergyRelation()<a.GetLowFreqEnergyRelation())
00346 tmpD.SetLowFreqEnergyRelation(b.GetLowFreqEnergyRelation());
00347 }
00348 if(a.HasSpread() && b.HasSpread() )
00349 {
00350 if(b.GetSpread()<a.GetSpread())
00351 tmpD.SetSpread(b.GetSpread());
00352 }
00353 if(a.HasMagnitudeSkewness() && b.HasMagnitudeSkewness() )
00354 {
00355 if(b.GetMagnitudeSkewness()<a.GetMagnitudeSkewness())
00356 tmpD.SetMagnitudeSkewness(b.GetMagnitudeSkewness());
00357 }
00358 if(a.HasRolloff() && b.HasRolloff() )
00359 {
00360 if(b.GetRolloff()<a.GetRolloff())
00361 tmpD.SetRolloff(b.GetRolloff());
00362 }
00363 if(a.HasSlope() && b.HasSlope() )
00364 {
00365 if(b.GetSlope()<a.GetSlope())
00366 tmpD.SetSlope(b.GetSlope());
00367 }
00368 if(a.HasHighFrequencyContent() && b.HasHighFrequencyContent() )
00369 {
00370 if(b.GetHighFrequencyContent()<a.GetHighFrequencyContent())
00371 tmpD.SetHighFrequencyContent(b.GetHighFrequencyContent());
00372 }
00373 if(a.HasBandDescriptors() && b.HasBandDescriptors() )
00374 {
00375
00376
00377
00378 }
00379 if(a.HasMFCC() && b.HasMFCC() )
00380 {
00381
00382
00383
00384 }
00385
00386 return tmpD;
00387
00388 }
00389
00390 }
00391
00392 #endif
00393