22 #include "MASoundBasicAnalyzer.hpp" 24 #include "core/MANum.hpp" 25 #include "MASoundAnalyzerPrivate.hpp" 26 #include "MASoundData.hpp" 28 #include <MCSampleStatistics.hpp> 30 #include <libxtract.h> 35 Frequency((double)frequency), WindowSize((int)
MASoundData::GetWindowSize(frequency)),
36 SlidingWindowLimit(0), HannWindow(nullptr), BarkBandLimits(nullptr), OnlyMfccCoefs(only_mfcc_components)
39 Wrapper.reset(
new FilterBankWrapper);
40 Wrapper->FilterBank = (xtract_mel_filter*)malloc(
sizeof(xtract_mel_filter));
42 Wrapper->FilterBank->filters = (
double**)malloc(
Wrapper->FilterBank->n_filters*
sizeof(
double*));
43 for (
int i = 0; i <
Wrapper->FilterBank->n_filters; ++i)
53 xtract_init_wavelet_f0_state();
59 MASoundBasicAnalyzer::~MASoundBasicAnalyzer()
62 for (
int i = 0; i <
Wrapper->FilterBank->n_filters; ++i)
64 free(
Wrapper->FilterBank->filters[i]);
66 free(
Wrapper->FilterBank->filters);
103 return MC::FloatList();
119 unsigned int erased_vector_count)
122 return MC::FloatTable();
130 unsigned int Count = (desired_vector_count == 0 ?
FeatureVectors.size() :
133 unsigned int EraseCount = (erased_vector_count == 0 ? Count :
MCMin(erased_vector_count, Count));
154 int RemainingCount = 0;
161 RemainingCount += (int)((
float)
WindowSize*2 / 3);
170 #if !defined(__AIBO_BUILD__) 174 MC::DoubleTable MfccFrames;
175 MC::DoubleTable MmbsesFrames;
176 MC::DoubleTable MfccEnergyFrames;
177 MC::DoubleTable SpectrumFrames;
178 MC::DoubleTable DeltaFrames;
179 MC::DoubleTable MmbsesDeltaFrames;
182 for (
unsigned int i = 0; i <
DataWindows.size(); ++i)
185 double UserData[4] = { (double)
Frequency /
WindowSize, XTRACT_MAGNITUDE_SPECTRUM, 0.0f, 0.0f};
186 double UserData2[4] = { (double)
Frequency /
WindowSize, XTRACT_SPECTRUM_COEFFICIENTS, 0.0f, 0.0f};
188 MC::DoubleList MfccCoefficients;
189 MC::DoubleList MmbsesCoefficients;
190 MC::DoubleList MfccEnergies;
193 Temp.resize(
Wrapper->FilterBank->n_filters);
198 xtract_mmbses((
double*)&(Spectrum[0]),
WindowSize / 2,
Wrapper->FilterBank, (
double*)&Temp[0]);
199 memcpy(&MmbsesCoefficients[0], &Temp[0],
sizeof(
double)*
MfccCount);
200 MmbsesFrames.push_back(MmbsesCoefficients);
202 xtract_mfcc((
double*)&(Spectrum[0]),
WindowSize / 2,
Wrapper->FilterBank, (
double*)&Temp[0]);
203 memcpy(&MfccCoefficients[0], &Temp[0],
sizeof(
double)*MfccCount);
204 MfccFrames.push_back(MfccCoefficients);
205 xtract_mfcc_without_dct((
double*)&(Spectrum[0]),
WindowSize / 2,
Wrapper->FilterBank, (
double*)&Temp[0]);
206 memcpy(&MfccEnergies[0], &Temp[0],
sizeof(
double)*MfccCount);
207 MfccEnergyFrames.push_back(MfccEnergies);
208 SpectrumFrames.push_back(Spectrum);
211 for (
unsigned int i = 0; i < MfccFrames.size(); ++i)
213 MC::DoubleList DeltaFrame;
214 MC::DoubleList MmbsesDeltaFrame;
223 if (i == MfccFrames.size()-1)
225 DeltaFrames.push_back(DeltaFrame);
230 for (
unsigned int i1 = 0; i1 < MfccFrames[i].size(); ++i1)
232 double Numerator = 0;
233 double MmbsesNumerator = 0;
234 double Denominator = 0;
236 for (
unsigned int N = 1; N < 3; ++N)
238 int PreviousIndex = (i == 1 ? 0 : i-N);
239 int NextIndex = (i == MfccFrames.size()-2 ? MfccFrames.size()-1 : i+N);
241 Numerator += N*(MfccFrames[PreviousIndex][i1]-MfccFrames[NextIndex][i1]);
242 MmbsesNumerator += N*(MmbsesFrames[PreviousIndex][i1]-MmbsesFrames[NextIndex][i1]);
245 DeltaFrame.push_back(Numerator / 2 / Denominator);
246 MmbsesDeltaFrame.push_back(MmbsesNumerator / 2 / Denominator);
248 DeltaFrames.push_back(DeltaFrame);
249 MmbsesDeltaFrames.push_back(MmbsesDeltaFrame);
251 for (
unsigned int i = 0; i <
DataWindows.size(); ++i)
253 MC::FloatList FinalVector;
256 for (
unsigned int i1 = 1; i1 < MfccFrames[i].size(); ++i1)
258 FinalVector.push_back((
float)MfccFrames[i][i1]);
259 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(Mfcc, i1)
264 for (
unsigned int i1 = 0; i1 < MmbsesFrames[i].size(); ++i1)
266 FinalVector.push_back((
float)MmbsesFrames[i][i1]);
267 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(Mmbses, i1)
270 for (
unsigned int i1 = 1; i1 < MfccEnergyFrames[i].size(); ++i1)
272 FinalVector.push_back((
float)MfccEnergyFrames[i][i1]);
273 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MfccEnergy, i1)
276 int MfccDeltaNeutralSum = 0;
277 const float NeutralLimit = 0.2;
278 const int HistogramBins = 20;
279 const float HistogramLimit = 1.0;
280 MC::IntList Histogram(HistogramBins, 0);
283 for (
unsigned int i1 = 0; i1 < DeltaFrames[i].size(); ++i1)
285 if (DeltaFrames[i][i1] > -NeutralLimit && DeltaFrames[i][i1] < NeutralLimit)
286 MfccDeltaNeutralSum++;
288 if (DeltaFrames[i][i1] <= -HistogramLimit)
291 if (DeltaFrames[i][i1] >= HistogramLimit)
292 Histogram[HistogramBins-1]++;
294 MANum<int> Index((
int)((DeltaFrames[i][i1]+HistogramLimit)*(HistogramBins-1) / 2 / HistogramLimit), 0, HistogramBins-1);
296 Histogram[(int)Index]++;
300 FinalVector.push_back((
float)DeltaFrames[i][i1]);
301 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MfccDelta, i1)
304 FinalVector.push_back((
float)MfccDeltaNeutralSum);
305 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccDeltaNeutralSum")
308 for (
unsigned int i1 = 0; i1 < DeltaFrames[1].size(); ++i1)
310 FinalVector.push_back(0);
311 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MfccDelta, i1)
314 for (
int i1 = 0; i1 < HistogramBins; ++i1)
316 FinalVector.push_back((
float)Histogram[i1]);
317 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MfccDeltaHistogram, i1)
320 int MmbsesDeltaNeutralSum = 0;
322 Histogram = MC::IntList(HistogramBins, 0);
323 for (
unsigned int i1 = 0; i1 < MmbsesDeltaFrames[i].size(); ++i1)
325 if (MmbsesDeltaFrames[i][i1] > -NeutralLimit && MmbsesDeltaFrames[i][i1] < NeutralLimit)
326 MmbsesDeltaNeutralSum++;
328 if (MmbsesDeltaFrames[i][i1] <= -HistogramLimit)
331 if (MmbsesDeltaFrames[i][i1] >= HistogramLimit)
332 Histogram[HistogramBins-1]++;
334 MANum<int> Index((
int)((MmbsesDeltaFrames[i][i1]+HistogramLimit)*(HistogramBins-1) / 2 / HistogramLimit), 0, HistogramBins-1);
336 Histogram[(int)Index]++;
340 FinalVector.push_back((
float)MmbsesDeltaFrames[i][i1]);
341 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MmbsesDelta, i1)
344 FinalVector.push_back((
float)MmbsesDeltaNeutralSum);
345 MA_ANALYZER_ADD_FEATURE_NAME(
"MmbsesDeltaNeutralSum")
348 for (
unsigned int i1 = 0; i1 < MmbsesDeltaFrames[1].size(); ++i1)
350 FinalVector.push_back(0);
351 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MmbsesDelta, i1)
354 for (
int i1 = 0; i1 < HistogramBins; ++i1)
356 FinalVector.push_back((
float)Histogram[i1]);
357 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(MbsesDeltaHistogram, i1)
365 FinalVector.push_back((
float)Mean);
366 MA_ANALYZER_ADD_FEATURE_NAME(
"DataMean")
367 FinalVector.push_back((
float)StDev);
368 MA_ANALYZER_ADD_FEATURE_NAME(
"DataStDev")
372 FinalVector.push_back(TQ-FQ);
373 MA_ANALYZER_ADD_FEATURE_NAME(
"DataIqr")
374 FinalVector.push_back((
float)Min);
375 MA_ANALYZER_ADD_FEATURE_NAME(
"DataMin")
376 FinalVector.push_back((
float)Max);
377 MA_ANALYZER_ADD_FEATURE_NAME(
"DataMax")
378 FinalVector.push_back((
float)Max-Min);
379 MA_ANALYZER_ADD_FEATURE_NAME(
"DataRange")
386 FinalVector.push_back((
float)Mean);
387 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccMean")
388 FinalVector.push_back((
float)StDev);
389 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccStDev")
393 FinalVector.push_back(TQ-FQ);
394 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccIqr")
395 FinalVector.push_back((
float)Min);
396 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccMin")
397 FinalVector.push_back((
float)Max);
398 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccMax")
399 FinalVector.push_back((
float)Max-Min);
400 MA_ANALYZER_ADD_FEATURE_NAME(
"MfccRange")
403 double UserData[4] = { 0.0f, 0.0f, 0.0f, 0.0f};
404 double BarkCoefficients[XTRACT_BARK_BANDS-1];
405 MC::DoubleList Amplitudes(SpectrumFrames[i]);
406 double SpectrumMean = 0;
407 double SpectrumStDev = 0;
408 double SpectrumGeometricMean = 0;
410 double FlatnessDb = 0;
411 double AverageDeviation = 0;
415 double IrregularityJ = 0;
416 double IrregularityK = 0;
421 MC::DoubleList PeaksFirstHalf(
WindowSize / 2, 0);
422 MC::DoubleList HarmonicsFirstHalf(
WindowSize / 2, 0);
423 double HarmonicsMean = 0;
424 double HarmonicsStDev = 0;
425 double PeaksMean = 0;
426 double PeaksStDev = 0;
427 int PartialsCount = 0;
428 int HarmonicsCount = 0;
429 double Noisiness = 0;
430 float NonZeroCount = 0;
431 double OddEvenRatio = 0;
432 double RmsAmplitude = 0;
436 double Smoothness = 0;
437 double SpectralCentroid = 0;
438 double SpectralInharmonicity = 0;
439 double SpectralKurtosis = 0;
440 double SpectralSkewness = 0;
441 double SpectralSlope = 0;
442 double SpectralVariance = 0;
445 double Tristimulus1 = 0;
446 double Tristimulus2 = 0;
447 double Tristimulus3 = 0;
449 double WaveletF0 = 0;
450 double ZeroCrossRate = 0;
453 xtract_bark_coefficients((
double*)&(SpectrumFrames[i][0]),
WindowSize / 2, &
BarkBandLimits[0], &BarkCoefficients[0]);
457 FinalVector.push_back((
float)SpectrumMean);
458 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumMean")
460 FinalVector.push_back((
float)SpectrumGeometricMean);
461 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumGeometricMean")
463 FinalVector.push_back((
float)SpectrumStDev);
464 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumStDev")
466 Flatness = SpectrumGeometricMean / SpectrumMean;
467 FinalVector.push_back((
float)Flatness);
468 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumFlatness")
469 xtract_flatness_db(
nullptr, 0, &Flatness, &FlatnessDb);
470 FinalVector.push_back((
float)FlatnessDb);
471 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumFlatnessDb")
473 FinalVector.push_back((
float)AverageDeviation);
474 MA_ANALYZER_ADD_FEATURE_NAME(
"DataAverageDeviation")
477 xtract_crest(
nullptr, 0, UserData, &CRest);
478 FinalVector.push_back((
float)CRest);
479 MA_ANALYZER_ADD_FEATURE_NAME(
"DataAverageCRest")
484 FinalVector.push_back((
float)0);
489 FinalVector.push_back((
float)-1);
491 FinalVector.push_back((
float)F0);
493 MA_ANALYZER_ADD_FEATURE_NAME(
"DataF0")
494 xtract_hps((
double*)&(SpectrumFrames[i][0]),
WindowSize,
nullptr, &Hps);
495 FinalVector.push_back((
float)Hps);
496 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumHps")
497 xtract_irregularity_j((
double*)&(SpectrumFrames[i][0]),
WindowSize,
nullptr, &IrregularityJ);
498 FinalVector.push_back((
float)IrregularityJ);
499 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumIrregularityJ")
500 xtract_irregularity_k((
double*)&(SpectrumFrames[i][0]),
WindowSize,
nullptr, &IrregularityK);
501 FinalVector.push_back((
float)IrregularityK);
502 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumIrregularityK")
506 FinalVector.push_back((
float)Kurtosis);
507 MA_ANALYZER_ADD_FEATURE_NAME(
"DataKurtosis")
508 xtract_loudness(&BarkCoefficients[0], XTRACT_BARK_BANDS-1,
nullptr, &Loudness);
509 FinalVector.push_back((
float)Loudness);
510 MA_ANALYZER_ADD_FEATURE_NAME(
"DataLoudness")
514 xtract_peak_spectrum((
double*)&(SpectrumFrames[i][0]),
WindowSize / 2, UserData, (
double*)&(Peaks[0]));
515 memcpy(&PeaksFirstHalf[0], &Peaks[0],
WindowSize / 2*
sizeof(
double));
517 FinalVector.push_back((
float)PeaksMean);
518 MA_ANALYZER_ADD_FEATURE_NAME(
"PeaksMean")
520 FinalVector.push_back((
float)PeaksStDev);
521 MA_ANALYZER_ADD_FEATURE_NAME(
"PeaksStDev")
526 xtract_harmonic_spectrum((
double*)&(Peaks[0]),
WindowSize, UserData, (
double*)&(Harmonics[0]));
527 memcpy(&HarmonicsFirstHalf[0], &Harmonics[0],
WindowSize / 2*
sizeof(
double));
529 FinalVector.push_back((
float)HarmonicsMean);
530 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicsMean")
532 FinalVector.push_back((
float)HarmonicsStDev);
533 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicsStDev")
536 FinalVector.push_back((
float)HarmonicsCount);
537 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicsCount")
538 FinalVector.push_back((
float)PartialsCount);
539 MA_ANALYZER_ADD_FEATURE_NAME(
"PartialsCount")
540 UserData[0] = (double)HarmonicsCount;
541 UserData[1] = (double)PartialsCount;
542 xtract_noisiness(
nullptr, 0, UserData, &Noisiness);
543 FinalVector.push_back((
float)Noisiness);
544 MA_ANALYZER_ADD_FEATURE_NAME(
"Noisiness")
546 FinalVector.push_back(NonZeroCount);
547 MA_ANALYZER_ADD_FEATURE_NAME(
"DataNonZeroCount")
548 xtract_odd_even_ratio((
double*)&(Harmonics[0]),
WindowSize, &F0, &OddEvenRatio);
549 FinalVector.push_back((
float)OddEvenRatio);
550 MA_ANALYZER_ADD_FEATURE_NAME(
"OddEvenRatio")
552 FinalVector.push_back((
float)RmsAmplitude);
553 MA_ANALYZER_ADD_FEATURE_NAME(
"RmsAmplitude")
557 xtract_rolloff((
double*)&(SpectrumFrames[i][0]),
WindowSize / 2, UserData, &RollOff);
558 FinalVector.push_back((
float)RollOff);
559 MA_ANALYZER_ADD_FEATURE_NAME(
"RollOff")
567 FinalVector.push_back((
float)Skewness);
568 MA_ANALYZER_ADD_FEATURE_NAME(
"DataSkewness")
569 xtract_smoothness((
double*)&(SpectrumFrames[i][0]),
WindowSize / 2,
nullptr, &Smoothness);
570 FinalVector.push_back((
float)Smoothness);
571 MA_ANALYZER_ADD_FEATURE_NAME(
"Smoothness")
572 xtract_spectral_centroid((
double*)&(SpectrumFrames[i][0]),
WindowSize,
nullptr, &SpectralCentroid);
573 FinalVector.push_back((
float)SpectralCentroid);
574 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectralCentroid")
575 xtract_spectral_centroid((
double*)&(Peaks[0]),
WindowSize,
nullptr, &SpectralCentroid);
576 FinalVector.push_back((
float)SpectralCentroid);
577 MA_ANALYZER_ADD_FEATURE_NAME(
"PeakCentroid")
578 xtract_spectral_centroid((
double*)&(Harmonics[0]),
WindowSize,
nullptr, &SpectralCentroid);
579 FinalVector.push_back((
float)SpectralCentroid);
580 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicCentroid")
581 xtract_spectral_inharmonicity((
double*)&(Peaks[0]),
WindowSize / 2, &F0, &SpectralInharmonicity);
582 FinalVector.push_back((
float)SpectralInharmonicity);
583 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectralInharmonicity")
584 UserData[0] = SpectrumMean;
585 UserData[1] = SpectrumStDev;
586 xtract_spectral_kurtosis((
double*)&(SpectrumFrames[i][0]),
WindowSize, UserData, &SpectralKurtosis);
587 if (SpectralKurtosis > 1000000)
589 FinalVector.push_back((
float)0);
591 FinalVector.push_back((
float)SpectralKurtosis);
593 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectralKurtosis")
594 UserData[0] = PeaksMean;
595 UserData[1] = PeaksStDev;
596 xtract_spectral_kurtosis((
double*)&(Peaks[0]),
WindowSize, UserData, &SpectralKurtosis);
597 if (SpectralKurtosis > 1000000)
599 FinalVector.push_back((
float)0);
601 FinalVector.push_back((
float)SpectralKurtosis);
603 MA_ANALYZER_ADD_FEATURE_NAME(
"PeakKurtosis")
604 UserData[0] = HarmonicsMean;
605 UserData[1] = HarmonicsStDev;
606 xtract_spectral_kurtosis((
double*)&(Harmonics[0]),
WindowSize, UserData, &SpectralKurtosis);
607 if (SpectralKurtosis > 1000000)
609 FinalVector.push_back((
float)0);
611 FinalVector.push_back((
float)SpectralKurtosis);
613 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicKurtosis")
614 UserData[0] = SpectrumMean;
615 UserData[1] = SpectrumStDev;
616 xtract_spectral_skewness((
double*)&(SpectrumFrames[i][0]),
WindowSize, UserData, &SpectralSkewness);
617 if (SpectralSkewness > 10000000)
619 FinalVector.push_back((
float)0);
621 FinalVector.push_back((
float)SpectralSkewness);
623 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumSkewness")
624 xtract_spectral_skewness((
double*)&(Peaks[0]),
WindowSize, UserData, &SpectralSkewness);
625 if (SpectralSkewness > 10000000)
627 FinalVector.push_back((
float)0);
629 FinalVector.push_back((
float)SpectralSkewness);
631 MA_ANALYZER_ADD_FEATURE_NAME(
"PeakSkewness")
632 UserData[0] = HarmonicsMean;
633 UserData[1] = HarmonicsStDev;
634 xtract_spectral_skewness((
double*)&(Harmonics[0]),
WindowSize, UserData, &SpectralSkewness);
635 if (SpectralSkewness > 10000000)
637 FinalVector.push_back((
float)0);
639 FinalVector.push_back((
float)SpectralSkewness);
641 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicSkewness")
642 xtract_spectral_slope((
double*)&(SpectrumFrames[i][0]),
WindowSize,
nullptr, &SpectralSlope);
643 FinalVector.push_back((
float)SpectralSlope);
644 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectralSlope")
645 xtract_spectral_slope((
double*)&(Peaks[0]),
WindowSize,
nullptr, &SpectralSlope);
646 FinalVector.push_back((
float)SpectralSlope);
647 MA_ANALYZER_ADD_FEATURE_NAME(
"PeakSlope")
648 xtract_spectral_slope((
double*)&(Harmonics[0]),
WindowSize,
nullptr, &SpectralSlope);
649 FinalVector.push_back((
float)SpectralSlope);
650 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicSlope")
651 UserData[0] = SpectrumMean;
652 xtract_spectral_variance((
double*)&(SpectrumFrames[i][0]),
WindowSize, UserData, &SpectralVariance);
653 FinalVector.push_back((
float)SpectralVariance);
654 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectralVariance")
655 UserData[0] = PeaksMean;
656 xtract_spectral_variance((
double*)&(Peaks[0]),
WindowSize, UserData, &SpectralVariance);
657 FinalVector.push_back((
float)SpectralVariance);
658 MA_ANALYZER_ADD_FEATURE_NAME(
"PeakVariance")
659 UserData[0] = HarmonicsMean;
660 xtract_spectral_variance((
double*)&(Harmonics[0]),
WindowSize, UserData, &SpectralVariance);
661 FinalVector.push_back((
float)SpectralVariance);
662 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicVariance")
664 FinalVector.push_back((
float)Sum);
665 MA_ANALYZER_ADD_FEATURE_NAME(
"DataSum")
666 xtract_tonality(
nullptr, 0, &FlatnessDb, &Tonality);
667 FinalVector.push_back((
float)Tonality);
668 MA_ANALYZER_ADD_FEATURE_NAME(
"Tonality")
669 xtract_tristimulus_1((
double*)&(Harmonics[0]),
WindowSize, &F0, &Tristimulus1);
670 FinalVector.push_back((
float)Tristimulus1);
671 MA_ANALYZER_ADD_FEATURE_NAME(
"Tristimulus1")
672 xtract_tristimulus_2((
double*)&(Harmonics[0]),
WindowSize, &F0, &Tristimulus2);
673 FinalVector.push_back((
float)Tristimulus2);
674 MA_ANALYZER_ADD_FEATURE_NAME(
"Tristimulus2")
675 xtract_tristimulus_3((
double*)&(Harmonics[0]),
WindowSize, &F0, &Tristimulus3);
676 FinalVector.push_back((
float)Tristimulus3);
677 MA_ANALYZER_ADD_FEATURE_NAME(
"Tristimulus3")
679 FinalVector.push_back((
float)Variance);
680 MA_ANALYZER_ADD_FEATURE_NAME(
"DataVariance")
682 FinalVector.push_back((
float)WaveletF0);
683 MA_ANALYZER_ADD_FEATURE_NAME(
"WaveletF0")
685 FinalVector.push_back((
float)ZeroCrossRate);
686 MA_ANALYZER_ADD_FEATURE_NAME(
"ZeroCrossRate")
687 Temp.resize(
Wrapper->FilterBank->n_filters);
688 xtract_spectral_subband_centroids((
double*)&(Peaks[0]),
WindowSize / 2,
Wrapper->FilterBank, (
double*)&Temp[0]);
691 for (
unsigned int i1 = 2; i1 < Temp.size(); ++i1)
693 FinalVector.push_back((
float) Temp[i1]);
694 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(PeakBandCentroid, i1)
697 xtract_spectral_subband_centroids((
double*)&(SpectrumFrames[i][0]),
WindowSize / 2,
698 Wrapper->FilterBank, (
double*)&Temp[0]);
700 FinalVector.push_back(NonZeroCount);
701 MA_ANALYZER_ADD_FEATURE_NAME(
"SpectrumCentroidsNonZeroCount")
704 for (
unsigned int i1 = 0; i1 < Temp.size(); ++i1)
706 FinalVector.push_back((
float)Temp[i1]);
707 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(SpectrumBandCentroid, i1)
710 xtract_spectral_subband_centroids((
double*)&(Harmonics[0]),
WindowSize / 2,
711 Wrapper->FilterBank, (
double*)&Temp[0]);
713 FinalVector.push_back(NonZeroCount);
714 MA_ANALYZER_ADD_FEATURE_NAME(
"HarmonicCentroidsNonZeroCount")
717 for (
unsigned int i1 = 0; i1 < Temp.size(); ++i1)
719 FinalVector.push_back((
float) Temp[i1]);
720 MA_ANALYZER_ADD_FEATURE_NAME_WITH_INDEX(HarmonicBandCentroid, i1)
725 MA_ANALYZER_FEATURE_NAMES_COMMIT(FinalVector);
734 if (!DeltaFrames.empty())
736 if (!MmbsesDeltaFrames.empty())
753 MC::FloatList NewVector = vector;
762 return MC::FloatList();
768 MC::DoubleTable Windows;
773 MC::DoubleList Window;
777 Windows.push_back(Window);
778 remaining_count = (int)audio_data.size()-i-
WindowSize+1;
virtual bool IsValid() const override
Check if enough samples were added to the analyzer.
Non-zero sample count statistic.
int SlidingWindowLimit
Sliding window count.
bool OnlyMfccCoefs
Calculate only mfcc band components.
const T MCMin(const U &container)
Get the minimal value of a container.
Geometric mean statistic.
int * BarkBandLimits
Bark band limits.
MC::FloatTable GetFeatureVectors(unsigned int desired_vector_count=0, unsigned int erased_vector_count=0)
Get all feature vectors.
boost::scoped_ptr< FilterBankWrapper > Wrapper
Filter bank for MFCC calculation.
float MCCalculateVectorStatistic(const std::vector< T > &vector, MCSampleStatistic< T > &statistic)
Calculate a statistic over a vector.
unsigned int GetFeatureVectorCount() const
Get the available feature vector count.
static const int MfccCount
Number of mfcc components.
MC::DoubleList LastDeltaFrame
Last delta frame.
static MC::DoubleList ConvertToDouble(const MCBinaryData &raw_data)
Convert audio data to a double list.
virtual void Reset() override
Reset the analyzer and drop all samples.
virtual MC::FloatList CalculateHorizontalFeatures()
Calculate horizontal features for the feature vectors.
MC::FloatTable FeatureVectors
Feature vectors.
First quartile statistic.
double Frequency
Audio frequency.
MASoundBasicAnalyzer(unsigned int frequency, bool only_mfcc_components=false)
Class constructor.
bool MCIsFloatInfinity(const float value)
Check a value for float infinity.
MC::DoubleList LastMmbsesDeltaFrame
Last MMBSES frame.
virtual void AddSamples(const MARobotState &robot_state) override
Add new samples from the robot state.
MC::FloatList ApplyHorizontalFeatures(const MC::FloatList &vector)
Add a feature vector to a sliding window to calculate horizontal features.
MC::DoubleTable GenerateHannWindows(const MC::DoubleList &audio_data, int &remaining_count)
Generate Hann windows from audio data.
MC::DoubleList Buffer
Audio buffer.
double * HannWindow
Hann window.
Third quartile statistic.
MC::FloatTable SlidingWindow
Sliding window of feature vectors.
void MCMergeContainers(U &target, const U &other)
Merge two containers.
virtual MC::FloatList GetFeatureVector() override
Get a feature vector.
Standard deviation statistic.
virtual void GenerateFeatureVectors()
Generate feature vector frames.
int WindowSize
Ideal window size.
void AddSoundData(const MCBinaryData &raw_data)
Add raw (byte) sound data.
MC::DoubleTable DataWindows
Audio data windows.
Arithmetic mean statistic.