39 "Spectral Peak Descriptors require a linear magnitude SpectralPeakArray");
41 mpSpectralPeakArray=pSpectralPeakArray;
50 SetMagnitudeMean(initVal);
51 SetHarmonicCentroid(initVal);
52 SetFirstTristimulus(initVal);
53 SetSecondTristimulus(initVal);
54 SetThirdTristimulus(initVal);
55 SetHarmonicDeviation(initVal);
56 SetOddHarmonics(initVal);
57 SetEvenHarmonics(initVal);
58 SetOddToEvenRatio(initVal);
61 void SpectralPeakDescriptors::DefaultInit() {
62 mpSpectralPeakArray=0;
66 void SpectralPeakDescriptors::CopyInit(
const SpectralPeakDescriptors & copied) {
67 mpSpectralPeakArray=copied.mpSpectralPeakArray;
72 return mpSpectralPeakArray;
78 "Spectral Peak Descriptors require a linear magnitude SpectralPeakArray");
79 mpSpectralPeakArray=pSpectralPeakArray;
81 InitStats(&mpSpectralPeakArray->GetMagBuffer());
89 if (HasMagnitudeMean())
91 if (HasHarmonicCentroid())
92 SetHarmonicCentroid(ComputeCentroid());
93 if(HasFirstTristimulus())
94 SetFirstTristimulus(ComputeFirstTristimulus());
95 if(HasSecondTristimulus())
96 SetSecondTristimulus(ComputeSecondTristimulus());
97 if(HasThirdTristimulus())
98 SetThirdTristimulus(ComputeThirdTristimulus());
99 if(HasHarmonicDeviation())
100 SetHarmonicDeviation(ComputeHarmonicDeviation());
101 if(HasOddHarmonics())
102 SetOddHarmonics(ComputeOddHarmonics());
103 if(HasEvenHarmonics())
104 SetEvenHarmonics(ComputeEvenHarmonics());
105 if(HasOddToEvenRatio())
106 SetOddToEvenRatio(ComputeOddToEvenRatio());
109 TData SpectralPeakDescriptors::ComputeCentroid()
111 unsigned size = mpSpectralPeakArray->
GetnPeaks();
112 if (size<=0)
return 0;
113 const Array<TData> & magnitudes = mpSpectralPeakArray->GetMagBuffer();
114 const Array<TData> & frequencies = mpSpectralPeakArray->GetFreqBuffer();
115 TData crossProduct=0.0;
116 for (
unsigned i = 0; i < size; i++)
118 crossProduct += magnitudes[i]*frequencies[i];
123 TData SpectralPeakDescriptors::ComputeFirstTristimulus()
125 if (mpSpectralPeakArray->
GetnPeaks()<=0)
return 0;
126 const TData firstHarmonicMag=mpSpectralPeakArray->GetMagBuffer()[0];
130 TData SpectralPeakDescriptors::ComputeSecondTristimulus()
132 if (mpSpectralPeakArray->
GetnPeaks()<=3)
return 0;
134 const TData secondHarmonicMag=mpSpectralPeakArray->GetMagBuffer()[1];
135 const TData thirdHarmonicMag=mpSpectralPeakArray->GetMagBuffer()[2];
136 const TData fourthHarmonicMag=mpSpectralPeakArray->GetMagBuffer()[3];
138 return (secondHarmonicMag*secondHarmonicMag+thirdHarmonicMag*thirdHarmonicMag+
142 TData SpectralPeakDescriptors::ComputeThirdTristimulus()
144 if (mpSpectralPeakArray->
GetnPeaks()<=4)
return 0;
145 const DataArray& a=mpSpectralPeakArray->GetMagBuffer();
146 return accumulate(a.GetPtr()+4,a.GetPtr()+a.Size(),0.,Power<2>())/
mpStats->
GetEnergy();
149 TData SpectralPeakDescriptors::ComputeHarmonicDeviation()
151 const unsigned size=mpSpectralPeakArray->
GetnPeaks();
152 if (size<4)
return 0.0;
158 const TData tmp0 = log10((data[0]+data[1])/2);
159 const TData logdata0=log10(data[0]);
163 for (
unsigned i=1;i<size-1;i++)
165 const TData tmpi = log10((data[i-1]+data[i]+data[i+1])/3);
166 const TData logdatai=log10(data[i]);
171 const TData tmpN = log10((data[size-2]+data[size-1])/2);
172 const TData logdataN=log10(data[size-1]);
179 TData SpectralPeakDescriptors::ComputeOddHarmonics()
181 const unsigned size=mpSpectralPeakArray->
GetnPeaks();
182 if (size<3)
return 0;
183 const DataArray& data=mpSpectralPeakArray->GetMagBuffer();
184 TData oddEnergy = 0.0;
185 for (
unsigned i=2;i<size;i+=2)
187 oddEnergy+=data[i]*data[i];
192 TData SpectralPeakDescriptors::ComputeEvenHarmonics()
194 const unsigned size=mpSpectralPeakArray->
GetnPeaks();
195 if (size<2)
return 0;
196 const DataArray& data=mpSpectralPeakArray->GetMagBuffer();
197 TData evenEnergy = 0.0;
198 for (
unsigned i=1;i<size;i+=2)
200 evenEnergy+=data[i]*data[i];
205 TData SpectralPeakDescriptors::ComputeOddToEvenRatio()
207 if (mpSpectralPeakArray->
GetnPeaks()<=1)
return 0.5;
209 if (HasOddHarmonics()) odd=GetOddHarmonics();
210 else odd=ComputeOddHarmonics();
211 if (HasEvenHarmonics()) even=GetEvenHarmonics();
212 else even=ComputeEvenHarmonics();
214 return odd/(even+odd);
221 if (a.HasMagnitudeMean())
223 tmpD.SetMagnitudeMean(a.GetMagnitudeMean()*mult);
225 if (a.HasHarmonicCentroid())
227 tmpD.SetHarmonicCentroid(a.GetHarmonicCentroid()*mult);
229 if (a.HasFirstTristimulus())
231 tmpD.SetFirstTristimulus(a.GetFirstTristimulus()*mult);
233 if (a.HasSecondTristimulus())
235 tmpD.SetSecondTristimulus(a.GetSecondTristimulus()*mult);
237 if (a.HasThirdTristimulus())
239 tmpD.SetThirdTristimulus(a.GetThirdTristimulus()*mult);
241 if (a.HasHarmonicDeviation())
243 tmpD.SetHarmonicDeviation(a.GetHarmonicDeviation()*mult);
245 if (a.HasOddHarmonics())
247 tmpD.SetOddHarmonics(a.GetOddHarmonics()*mult);
249 if (a.HasEvenHarmonics())
251 tmpD.SetEvenHarmonics(a.GetEvenHarmonics()*mult);
253 if (a.HasOddToEvenRatio())
255 tmpD.SetOddToEvenRatio(a.GetOddToEvenRatio()*mult);
258 tmpD.SetHPCP(
Multiply(mult,a.GetHPCP()));
267 if (a.HasMagnitudeMean() && b.HasMagnitudeMean())
269 tmpD.AddMagnitudeMean();
271 tmpD.SetMagnitudeMean(a.GetMagnitudeMean()*b.GetMagnitudeMean());
273 if (a.HasHarmonicCentroid() && b.HasHarmonicCentroid())
275 tmpD.AddHarmonicCentroid();
277 tmpD.SetHarmonicCentroid(a.GetHarmonicCentroid()*b.GetHarmonicCentroid());
279 if (a.HasFirstTristimulus() && b.HasFirstTristimulus())
281 tmpD.AddFirstTristimulus();
283 tmpD.SetFirstTristimulus(a.GetFirstTristimulus()*b.GetFirstTristimulus());
285 if (a.HasSecondTristimulus() && b.HasSecondTristimulus())
287 tmpD.AddSecondTristimulus();
289 tmpD.SetSecondTristimulus(a.GetSecondTristimulus()*b.GetSecondTristimulus());
291 if (a.HasThirdTristimulus() && b.HasThirdTristimulus())
293 tmpD.AddThirdTristimulus();
295 tmpD.SetThirdTristimulus(a.GetThirdTristimulus()*b.GetThirdTristimulus());
297 if (a.HasHarmonicDeviation() && b.HasHarmonicDeviation())
299 tmpD.AddHarmonicDeviation();
301 tmpD.SetHarmonicDeviation(a.GetHarmonicDeviation()*b.GetHarmonicDeviation());
303 if (a.HasOddHarmonics() && b.HasOddHarmonics())
305 tmpD.AddOddHarmonics();
307 tmpD.SetOddHarmonics(a.GetOddHarmonics()*b.GetOddHarmonics());
309 if (a.HasEvenHarmonics() && b.HasEvenHarmonics())
311 tmpD.AddEvenHarmonics();
313 tmpD.SetEvenHarmonics(a.GetEvenHarmonics()*b.GetEvenHarmonics());
315 if (a.HasOddToEvenRatio() && b.HasOddToEvenRatio())
317 tmpD.AddOddToEvenRatio();
319 tmpD.SetOddToEvenRatio(a.GetOddToEvenRatio()*b.GetOddToEvenRatio());
321 if (a.HasHPCP() && b.HasHPCP())
325 tmpD.SetHPCP(
Multiply(a.GetHPCP(),b.GetHPCP()));
335 if (a.HasMagnitudeMean() && b.HasMagnitudeMean())
337 tmpD.AddMagnitudeMean();
339 tmpD.SetMagnitudeMean(a.GetMagnitudeMean()+b.GetMagnitudeMean());
341 if (a.HasHarmonicCentroid() && b.HasHarmonicCentroid())
343 tmpD.AddHarmonicCentroid();
345 tmpD.SetHarmonicCentroid(a.GetHarmonicCentroid()+b.GetHarmonicCentroid());
347 if (a.HasFirstTristimulus() && b.HasFirstTristimulus())
349 tmpD.AddFirstTristimulus();
351 tmpD.SetFirstTristimulus(a.GetFirstTristimulus()+b.GetFirstTristimulus());
353 if (a.HasSecondTristimulus() && b.HasSecondTristimulus())
355 tmpD.AddSecondTristimulus();
357 tmpD.SetSecondTristimulus(a.GetSecondTristimulus()+b.GetSecondTristimulus());
359 if (a.HasThirdTristimulus() && b.HasThirdTristimulus())
361 tmpD.AddThirdTristimulus();
363 tmpD.SetThirdTristimulus(a.GetThirdTristimulus()+b.GetThirdTristimulus());
365 if (a.HasHarmonicDeviation() && b.HasHarmonicDeviation())
367 tmpD.AddHarmonicDeviation();
369 tmpD.SetHarmonicDeviation(a.GetHarmonicDeviation()+b.GetHarmonicDeviation());
371 if (a.HasOddHarmonics() && b.HasOddHarmonics())
373 tmpD.AddOddHarmonics();
375 tmpD.SetOddHarmonics(a.GetOddHarmonics()+b.GetOddHarmonics());
377 if (a.HasEvenHarmonics() && b.HasEvenHarmonics())
379 tmpD.AddEvenHarmonics();
381 tmpD.SetEvenHarmonics(a.GetEvenHarmonics()+b.GetEvenHarmonics());
383 if (a.HasOddToEvenRatio() && b.HasOddToEvenRatio())
385 tmpD.AddOddToEvenRatio();
387 tmpD.SetOddToEvenRatio(a.GetOddToEvenRatio()+b.GetOddToEvenRatio());
389 if(a.HasHPCP() && b.HasHPCP() )
393 tmpD.SetHPCP(
Add(a.GetHPCP(),b.GetHPCP()));