| 485 | } |
| 486 | |
| 487 | long 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 | } |
nothing calls this directly
no test coverage detected