Home | History | Annotate | Download | only in aecm

Lines Matching refs:aecm

11 #include "webrtc/modules/audio_processing/aecm/aecm_core.h"
18 #include "webrtc/modules/audio_processing/aecm/include/echo_control_mobile.h"
60 static void ComfortNoise(AecmCore_t* aecm,
65 static void WindowAndFFT(AecmCore_t* aecm,
88 WebRtcSpl_RealForwardFFT(aecm->real_fft, fft, (int16_t*)freq_signal);
94 static void InverseFFTAndWindow(AecmCore_t* aecm,
118 outCFFT = WebRtcSpl_RealInverseFFT(aecm->real_fft, fft, ifft_out);
123 outCFFT - aecm->dfaCleanQDomain);
125 tmp32no1 + aecm->outBuf[i],
132 outCFFT - aecm->dfaCleanQDomain);
133 aecm->outBuf[i] = (int16_t)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
139 // (aecm->outBuf is shifted elsewhere)
140 memcpy(aecm->xBuf, aecm->xBuf + PART_LEN, sizeof(int16_t) * PART_LEN);
141 memcpy(aecm->dBufNoisy,
142 aecm->dBufNoisy + PART_LEN,
146 memcpy(aecm->dBufClean,
147 aecm->dBufClean + PART_LEN,
165 static int TimeToFrequencyDomain(AecmCore_t* aecm,
197 WindowAndFFT(aecm, fft, time_signal, freq_signal, time_signal_scaling);
286 int WebRtcAecm_ProcessBlock(AecmCore_t * aecm,
342 if (aecm->startupState < 2)
344 aecm->startupState = (aecm->totCount >= CONV_LEN) +
345 (aecm->totCount >= CONV_LEN2);
350 memcpy(aecm->xBuf + PART_LEN, farend, sizeof(int16_t) * PART_LEN);
351 memcpy(aecm->dBufNoisy + PART_LEN, nearendNoisy, sizeof(int16_t) * PART_LEN);
354 memcpy(aecm->dBufClean + PART_LEN,
360 far_q = TimeToFrequencyDomain(aecm,
361 aecm->xBuf,
367 zerosDBufNoisy = TimeToFrequencyDomain(aecm,
368 aecm->dBufNoisy,
372 aecm->dfaNoisyQDomainOld = aecm->dfaNoisyQDomain;
373 aecm->dfaNoisyQDomain = (int16_t)zerosDBufNoisy;
379 aecm->dfaCleanQDomainOld = aecm->dfaNoisyQDomainOld;
380 aecm->dfaCleanQDomain = aecm->dfaNoisyQDomain;
385 zerosDBufClean = TimeToFrequencyDomain(aecm,
386 aecm->dBufClean,
390 aecm->dfaCleanQDomainOld = aecm->dfaCleanQDomain;
391 aecm->dfaCleanQDomain = (int16_t)zerosDBufClean;
396 WebRtcAecm_UpdateFarHistory(aecm, xfa, far_q);
397 if (WebRtc_AddFarSpectrumFix(aecm->delay_estimator_farend,
403 delay = WebRtc_DelayEstimatorProcessFix(aecm->delay_estimator,
418 if (aecm->fixedDelay >= 0)
421 delay = aecm->fixedDelay;
425 far_spectrum_ptr = WebRtcAecm_AlignedFarend(aecm, &far_q, delay);
433 WebRtcAecm_CalcEnergies(aecm,
440 mu = WebRtcAecm_CalcStepSize(aecm);
443 aecm->totCount++;
448 WebRtcAecm_UpdateChannel(aecm,
454 supGain = WebRtcAecm_CalcSuppressionGain(aecm);
462 tmp32no1 = echoEst32[i] - aecm->echoFilt[i];
463 aecm->echoFilt[i] += (tmp32no1 * 50) >> 8;
465 zeros32 = WebRtcSpl_NormW32(aecm->echoFilt[i]) + 1;
472 // aecm->xfaQDomainBuf[diff])
473 aecm->echoFilt[i],
476 resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
482 resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
485 echoEst32Gained = WEBRTC_SPL_UMUL_32_16((uint32_t)aecm->echoFilt[i],
494 aecm->echoFilt[i],
500 zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]);
502 dfa_clean_q_domain_diff = aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld;
503 if (zeros16 < dfa_clean_q_domain_diff && aecm->nearFilt[i]) {
504 tmp16no1 = aecm->nearFilt[i] << zeros16;
509 ? aecm->nearFilt[i] >> -dfa_clean_q_domain_diff
510 : aecm->nearFilt[i] << dfa_clean_q_domain_diff;
519 aecm->nearFilt[i] = WEBRTC_SPL_WORD16_MAX;
521 aecm->nearFilt[i] = qDomainDiff < 0 ? tmp16no2 << -qDomainDiff
529 } else if (aecm->nearFilt[i] == 0)
536 echoEst32Gained += (uint32_t)(aecm->nearFilt[i] >> 1);
538 (uint16_t)aecm->nearFilt[i]);
567 if (aecm->mult == 2)
593 if (aecm->nlpFlag)
643 if (aecm->cngMode == AecmTrue)
645 ComfortNoise(aecm, ptrDfaClean, efw, hnl);
648 InverseFFTAndWindow(aecm, fft, efw, output, nearendClean);
654 static void ComfortNoise(AecmCore_t* aecm,
669 int16_t shiftFromNearToNoise = kNoiseEstQDomain - aecm->dfaCleanQDomain;
675 if (aecm->noiseEstCtr < 100)
678 aecm->noiseEstCtr++;
692 if (outLShift32 < aecm->noiseEst[i])
695 aecm->noiseEstTooLowCtr[i] = 0;
697 if (aecm->noiseEst[i] < (1 << minTrackShift))
702 aecm->noiseEstTooHighCtr[i]++;
703 if (aecm->noiseEstTooHighCtr[i] >= kNoiseEstIncCount)
705 aecm->noiseEst[i]--;
706 aecm->noiseEstTooHighCtr[i] = 0; // Reset the counter
711 aecm->noiseEst[i] -= ((aecm->noiseEst[i] - outLShift32)
717 aecm->noiseEstTooHighCtr[i] = 0;
719 if ((aecm->noiseEst[i] >> 19) > 0)
724 aecm->noiseEst[i] >>= 11;
725 aecm->noiseEst[i] *= 2049;
727 else if ((aecm->noiseEst[i] >> 11) > 0)
730 aecm->noiseEst[i] *= 2049;
731 aecm->noiseEst[i] >>= 11;
737 aecm->noiseEstTooLowCtr[i]++;
738 if (aecm->noiseEstTooLowCtr[i] >= kNoiseEstIncCount)
740 aecm->noiseEst[i] += (aecm->noiseEst[i] >> 9) + 1;
741 aecm->noiseEstTooLowCtr[i] = 0; // Reset counter
749 tmp32 = WEBRTC_SPL_RSHIFT_W32(aecm->noiseEst[i], shiftFromNearToNoise);
753 aecm->noiseEst[i] = WEBRTC_SPL_LSHIFT_W32(tmp32, shiftFromNearToNoise);
764 WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed);