Index: webrtc/modules/audio_processing/aec/aec_core.c |
diff --git a/webrtc/modules/audio_processing/aec/aec_core.c b/webrtc/modules/audio_processing/aec/aec_core.c |
index bd9c50c2eecbce0acd2ff6345edd80e79d67374d..f80a7da48a3fd3eb0eb4d8283737ad4951561978 100644 |
--- a/webrtc/modules/audio_processing/aec/aec_core.c |
+++ b/webrtc/modules/audio_processing/aec/aec_core.c |
@@ -881,10 +881,11 @@ static int SignalBasedDelayCorrection(AecCore* self) { |
static void EchoSubtraction(AecCore* aec, |
int num_partitions, |
- int x_fft_buf_block_pos, |
int extended_filter_enabled, |
float normal_mu, |
float normal_error_threshold, |
+ float* x_fft, |
+ int* x_fft_buf_block_pos, |
float x_fft_buf[2] |
[kExtendedNumPartitions * PART_LEN1], |
float* const y, |
@@ -899,6 +900,19 @@ static void EchoSubtraction(AecCore* aec, |
float e[PART_LEN]; |
float e_fft[2][PART_LEN1]; |
int i; |
+ |
+ // Update the x_fft_buf block position. |
+ (*x_fft_buf_block_pos)--; |
+ if ((*x_fft_buf_block_pos) == -1) { |
+ *x_fft_buf_block_pos = num_partitions - 1; |
+ } |
+ |
+ // Buffer x_fft. |
+ memcpy(x_fft_buf[0] + (*x_fft_buf_block_pos) * PART_LEN1, x_fft, |
+ sizeof(float) * PART_LEN1); |
+ memcpy(x_fft_buf[1] + (*x_fft_buf_block_pos) * PART_LEN1, &x_fft[PART_LEN1], |
+ sizeof(float) * PART_LEN1); |
+ |
memset(s_fft, 0, sizeof(s_fft)); |
// Conditionally reset the echo subtraction filter if the filter has diverged |
@@ -909,8 +923,8 @@ static void EchoSubtraction(AecCore* aec, |
} |
// Produce echo estimate s_fft. |
- WebRtcAec_FilterFar(num_partitions, x_fft_buf_block_pos, x_fft_buf, h_fft_buf, |
- s_fft); |
+ WebRtcAec_FilterFar(num_partitions, *x_fft_buf_block_pos, x_fft_buf, |
+ h_fft_buf, s_fft); |
// Compute the time-domain echo estimate s. |
ScaledInverseFft(s_fft, s_extended, 2.0f, 0); |
@@ -932,7 +946,7 @@ static void EchoSubtraction(AecCore* aec, |
// Scale error signal inversely with far power. |
WebRtcAec_ScaleErrorSignal(extended_filter_enabled, normal_mu, |
normal_error_threshold, x_pow, e_fft); |
- WebRtcAec_FilterAdaptation(num_partitions, x_fft_buf_block_pos, x_fft_buf, |
+ WebRtcAec_FilterAdaptation(num_partitions, *x_fft_buf_block_pos, x_fft_buf, |
e_fft, h_fft_buf); |
memcpy(echo_subtractor_output, e, sizeof(float) * PART_LEN); |
} |
@@ -1180,7 +1194,7 @@ static void ProcessBlock(AecCore* aec) { |
size_t i; |
float fft[PART_LEN2]; |
- float xf[2][PART_LEN1]; |
+ float x_fft[2][PART_LEN1]; |
float df[2][PART_LEN1]; |
float far_spectrum = 0.0f; |
float near_spectrum = 0.0f; |
@@ -1203,7 +1217,7 @@ static void ProcessBlock(AecCore* aec) { |
float output[PART_LEN]; |
float outputH[NUM_HIGH_BANDS_MAX][PART_LEN]; |
float* outputH_ptr[NUM_HIGH_BANDS_MAX]; |
- float* xf_ptr = NULL; |
+ float* x_fft_ptr = NULL; |
for (i = 0; i < NUM_HIGH_BANDS_MAX; ++i) { |
outputH_ptr[i] = outputH[i]; |
@@ -1241,8 +1255,8 @@ static void ProcessBlock(AecCore* aec) { |
// Convert far-end signal to the frequency domain. |
memcpy(fft, farend_ptr, sizeof(float) * PART_LEN2); |
- Fft(fft, xf); |
- xf_ptr = &xf[0][0]; |
+ Fft(fft, x_fft); |
+ x_fft_ptr = &x_fft[0][0]; |
// Near fft |
memcpy(fft, aec->dBuf, sizeof(float) * PART_LEN2); |
@@ -1250,8 +1264,8 @@ static void ProcessBlock(AecCore* aec) { |
// Power smoothing |
for (i = 0; i < PART_LEN1; i++) { |
- far_spectrum = (xf_ptr[i] * xf_ptr[i]) + |
- (xf_ptr[PART_LEN1 + i] * xf_ptr[PART_LEN1 + i]); |
+ far_spectrum = (x_fft_ptr[i] * x_fft_ptr[i]) + |
+ (x_fft_ptr[PART_LEN1 + i] * x_fft_ptr[PART_LEN1 + i]); |
aec->xPow[i] = |
gPow[0] * aec->xPow[i] + gPow[1] * aec->num_partitions * far_spectrum; |
// Calculate absolute spectra |
@@ -1310,24 +1324,11 @@ static void ProcessBlock(AecCore* aec) { |
} |
} |
- // Update the xfBuf block position. |
- aec->xfBufBlockPos--; |
- if (aec->xfBufBlockPos == -1) { |
- aec->xfBufBlockPos = aec->num_partitions - 1; |
- } |
- |
- // Buffer xf |
- memcpy(aec->xfBuf[0] + aec->xfBufBlockPos * PART_LEN1, xf_ptr, |
- sizeof(float) * PART_LEN1); |
- memcpy(aec->xfBuf[1] + aec->xfBufBlockPos * PART_LEN1, &xf_ptr[PART_LEN1], |
- sizeof(float) * PART_LEN1); |
- |
// Perform echo subtraction. |
- EchoSubtraction(aec, aec->num_partitions, aec->xfBufBlockPos, |
- aec->extended_filter_enabled, |
- aec->normal_mu, aec->normal_error_threshold, aec->xfBuf, |
- nearend_ptr, aec->xPow, aec->wfBuf, |
- echo_subtractor_output); |
+ EchoSubtraction(aec, aec->num_partitions, aec->extended_filter_enabled, |
+ aec->normal_mu, aec->normal_error_threshold, &x_fft[0][0], |
+ &aec->xfBufBlockPos, aec->xfBuf, nearend_ptr, aec->xPow, |
+ aec->wfBuf, echo_subtractor_output); |
RTC_AEC_DEBUG_WAV_WRITE(aec->outLinearFile, echo_subtractor_output, PART_LEN); |