MCPcopy Create free account
hub / github.com/audeering/opensmile / process

Method process

src/functionals/functionalModulation.cpp:487–562  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

485}
486
487long cFunctionalModulation::process(FLOAT_DMEM *in,
488 FLOAT_DMEM *inSorted, FLOAT_DMEM *out, long Nin, long Nout)
489{
490 if (mappedSpec_ == NULL ||
491 (stftWinSizeFrames_ == 0 && mappedSpec_->getNin() != Nin)) {
492 // we need to init
493 FLOAT_DMEM T = (FLOAT_DMEM)getInputPeriod();
494 if (T == 0.0) {
495 SMILE_IERR(1, "Cannot compute modulation spectrum when input period is unknown (asynchronous input level!). T = 0.0");
496 return 0;
497 }
498 if (stftWinSizeFrames_ == 0 && T > 0) {
499 stftWinSizeFrames_ = stftWinSizeSec_ / T;
500 stftWinStepFrames_ = stftWinStepSec_ / T;
501 }
502 long N = Nin;
503 if (stftWinSizeFrames_ > 0) {
504 N = stftWinSizeFrames_;
505 //fprintf(stderr, "XXX stftWinSize: %ld\n", stftWinSizeFrames_);
506 }
507 //fprintf(stderr, "XXX allocate with N = %ld\n", N);
508 mappedSpec_ = new cSmileUtilMappedMagnitudeSpectrum(N, modSpecNumBins_,
509 winFuncId_, modSpecMinFreq_, modSpecMaxFreq_, T);
510 }
511 if (avgModSpec_ == NULL) {
512 avgModSpec_ = (FLOAT_DMEM*)malloc(sizeof(FLOAT_DMEM) * modSpecNumBins_);
513 }
514 if (removeNonZeroMean_) {
515 if (inNormN_ != Nin) {
516 if (inNorm_ != NULL) {
517 free(inNorm_);
518 }
519 inNorm_ = NULL;
520 }
521 if (inNorm_ == NULL) {
522 inNormN_ = Nin;
523 inNorm_ = (FLOAT_DMEM*)malloc(sizeof(FLOAT_DMEM) * Nin);
524 }
525 FLOAT_DMEM mean = 0.0;
526 long nMean = 0;
527 for (long i = 0; i < Nin; i++) {
528 if (in[i] != 0.0) {
529 mean += in[i];
530 nMean++;
531 }
532 }
533 if (nMean > 0) {
534 mean /= (FLOAT_DMEM)nMean;
535 }
536 for (long i = 0; i < Nin; i++) {
537 if (in[i] != 0.0) {
538 inNorm_[i] = in[i] - mean;
539 } else {
540 inNorm_[i] = 0.0;
541 }
542 }
543 in = inNorm_;
544 }

Callers

nothing calls this directly

Calls 3

computeMethod · 0.80
getModSpecMethod · 0.80
getNinMethod · 0.45

Tested by

no test coverage detected