Retyped the frequency estimate of the comfort noise for the higher band to harmonize the AEC code.

-Changed the type for the frequency estimate of the comfort noise for the
 higher band to be a two dimensional float array instead of a complex_t array.
 This makes sense since all the other frequency estimate (apart from the
 coherence) use this format and doing this change allows bundling the
 IFFT operations into using the InverseFFT method.
-Moved the memset of the frequency estimate of the comfort noise to where it is used and made it conditional so that it is only performed when used.
-Harmonized the if-statements for when the frequency estimate of the comfort noise is computed in the different optimized ComfortNoise computation methods.

The changes have been tested for bitexactness.

BUG=webrtc:5201

Review URL: https://codereview.webrtc.org/1494133002

Cr-Commit-Position: refs/heads/master@{#11050}
This commit is contained in:
peah 2015-12-16 06:07:23 -08:00 committed by Commit bot
parent 426ae9dc21
commit 99b1a32146
3 changed files with 29 additions and 24 deletions

View File

@ -441,14 +441,14 @@ static void GetHighbandGain(const float* lambda, float* nlpGainHband) {
static void ComfortNoise(AecCore* aec,
float efw[2][PART_LEN1],
complex_t* comfortNoiseHband,
float comfortNoiseHband[2][PART_LEN1],
const float* noisePow,
const float* lambda) {
int i, num;
float rand[PART_LEN];
float noise, noiseAvg, tmp, tmpAvg;
int16_t randW16[PART_LEN];
complex_t u[PART_LEN1];
float u[2][PART_LEN1];
const float pi2 = 6.28318530717959f;
@ -460,22 +460,22 @@ static void ComfortNoise(AecCore* aec,
// Reject LF noise
u[0][0] = 0;
u[0][1] = 0;
u[1][0] = 0;
for (i = 1; i < PART_LEN1; i++) {
tmp = pi2 * rand[i - 1];
noise = sqrtf(noisePow[i]);
u[i][0] = noise * cosf(tmp);
u[i][1] = -noise * sinf(tmp);
u[0][i] = noise * cosf(tmp);
u[1][i] = -noise * sinf(tmp);
}
u[PART_LEN][1] = 0;
u[1][PART_LEN] = 0;
for (i = 0; i < PART_LEN1; i++) {
// This is the proper weighting to match the background noise power
tmp = sqrtf(WEBRTC_SPL_MAX(1 - lambda[i] * lambda[i], 0));
// tmp = 1 - lambda[i];
efw[0][i] += tmp * u[i][0];
efw[1][i] += tmp * u[i][1];
efw[0][i] += tmp * u[0][i];
efw[1][i] += tmp * u[1][i];
}
// For H band comfort noise
@ -508,21 +508,24 @@ static void ComfortNoise(AecCore* aec,
// TODO: we should probably have a new random vector here.
// Reject LF noise
u[0][0] = 0;
u[0][1] = 0;
u[1][0] = 0;
for (i = 1; i < PART_LEN1; i++) {
tmp = pi2 * rand[i - 1];
// Use average noise for H band
u[i][0] = noiseAvg * (float)cos(tmp);
u[i][1] = -noiseAvg * (float)sin(tmp);
u[0][i] = noiseAvg * (float)cos(tmp);
u[1][i] = -noiseAvg * (float)sin(tmp);
}
u[PART_LEN][1] = 0;
u[1][PART_LEN] = 0;
for (i = 0; i < PART_LEN1; i++) {
// Use average NLP weight for H band
comfortNoiseHband[i][0] = tmpAvg * u[i][0];
comfortNoiseHband[i][1] = tmpAvg * u[i][1];
comfortNoiseHband[0][i] = tmpAvg * u[0][i];
comfortNoiseHband[1][i] = tmpAvg * u[1][i];
}
} else {
memset(comfortNoiseHband, 0,
2 * PART_LEN1 * sizeof(comfortNoiseHband[0][0]));
}
}
@ -1009,7 +1012,7 @@ static void EchoSuppression(AecCore* aec,
float efw[2][PART_LEN1];
float xfw[2][PART_LEN1];
float dfw[2][PART_LEN1];
complex_t comfortNoiseHband[PART_LEN1];
float comfortNoiseHband[2][PART_LEN1];
float fft[PART_LEN2];
float scale, dtmp;
float nlpGainHband;
@ -1176,7 +1179,6 @@ static void EchoSuppression(AecCore* aec,
WebRtcAec_OverdriveAndSuppress(aec, hNl, hNlFb, efw);
// Add comfort noise.
memset(comfortNoiseHband, 0, sizeof(comfortNoiseHband));
WebRtcAec_ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl);
// TODO(bjornv): Investigate how to take the windowing below into account if
@ -1223,10 +1225,10 @@ static void EchoSuppression(AecCore* aec,
// Inverse comfort_noise
if (flagHbandCn == 1) {
fft[0] = comfortNoiseHband[0][0];
fft[1] = comfortNoiseHband[PART_LEN][0];
fft[1] = comfortNoiseHband[0][PART_LEN];
for (i = 1; i < PART_LEN; i++) {
fft[2 * i] = comfortNoiseHband[i][0];
fft[2 * i + 1] = comfortNoiseHband[i][1];
fft[2 * i] = comfortNoiseHband[0][i];
fft[2 * i + 1] = comfortNoiseHband[1][i];
}
aec_rdft_inverse_128(fft);
scale = 2.0f / PART_LEN2;

View File

@ -202,7 +202,7 @@ extern WebRtcAecOverdriveAndSuppress WebRtcAec_OverdriveAndSuppress;
typedef void (*WebRtcAecComfortNoise)(AecCore* aec,
float efw[2][PART_LEN1],
complex_t* comfortNoiseHband,
float comfortNoiseHband[2][PART_LEN1],
const float* noisePow,
const float* lambda);
extern WebRtcAecComfortNoise WebRtcAec_ComfortNoise;

View File

@ -26,7 +26,7 @@ extern const float WebRtcAec_overDriveCurve[65];
void WebRtcAec_ComfortNoise_mips(AecCore* aec,
float efw[2][PART_LEN1],
complex_t* comfortNoiseHband,
float comfortNoiseHband[2][PART_LEN1],
const float* noisePow,
const float* lambda) {
int i, num;
@ -274,7 +274,7 @@ void WebRtcAec_ComfortNoise_mips(AecCore* aec,
noiseAvg = 0.0;
tmpAvg = 0.0;
num = 0;
if ((aec->sampFreq == 32000 || aec->sampFreq == 48000) && flagHbandCn == 1) {
if (aec->num_bands > 1 && flagHbandCn == 1) {
for (i = 0; i < PART_LEN; i++) {
rand[i] = ((float)randW16[i]) / 32768;
}
@ -314,9 +314,12 @@ void WebRtcAec_ComfortNoise_mips(AecCore* aec,
for (i = 0; i < PART_LEN1; i++) {
// Use average NLP weight for H band
comfortNoiseHband[i][0] = tmpAvg * u[i][0];
comfortNoiseHband[i][1] = tmpAvg * u[i][1];
comfortNoiseHband[0][i] = tmpAvg * u[i][0];
comfortNoiseHband[1][i] = tmpAvg * u[i][1];
}
} else {
memset(comfortNoiseHband, 0,
2 * PART_LEN1 * sizeof(comfortNoiseHband[0][0]));
}
}