audio_processing/aecm: Added help function for calculating log of energy
The same operation of calculating log of the energy was executed four times. This CL adds a help function LogOfEnergyInQ8() for that.
BUG=N/A
TESTED=locally on linux and trybots
R=kwiberg@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/22819004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7331 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/aecm/aecm_core.c b/webrtc/modules/audio_processing/aecm/aecm_core.c
index 72a1108..61d4c0b 100644
--- a/webrtc/modules/audio_processing/aecm/aecm_core.c
+++ b/webrtc/modules/audio_processing/aecm/aecm_core.c
@@ -709,6 +709,20 @@
return (int16_t)(((a << zeros) & 0x7FFFFFFF) >> 23);
}
+// Calculates and returns the log of |energy| in Q8. The input |energy| is
+// supposed to be in Q(|q_domain|).
+static int16_t LogOfEnergyInQ8(uint32_t energy, int q_domain) {
+ static const int16_t kLogLowValue = PART_LEN_SHIFT << 7;
+ int16_t log_energy_q8 = kLogLowValue;
+ if (energy > 0) {
+ int zeros = WebRtcSpl_NormU32(energy);
+ int16_t frac = ExtractFractionPart(energy, zeros);
+ // log2 of |energy| in Q8.
+ log_energy_q8 += ((31 - zeros) << 8) + frac - (q_domain << 8);
+ }
+ return log_energy_q8;
+}
+
// WebRtcAecm_CalcEnergies(...)
//
// This function calculates the log of energies for nearend, farend and estimated
@@ -735,13 +749,11 @@
int i;
- int16_t zeros, frac;
int16_t tmp16;
int16_t increase_max_shifts = 4;
int16_t decrease_max_shifts = 11;
int16_t increase_min_shifts = 11;
int16_t decrease_min_shifts = 3;
- static const int16_t kLogLowValue = PART_LEN_SHIFT << 7;
// Get log of near end energy and store in buffer
@@ -750,17 +762,7 @@
sizeof(int16_t) * (MAX_BUF_LEN - 1));
// Logarithm of integrated magnitude spectrum (nearEner)
- tmp16 = kLogLowValue;
- if (nearEner)
- {
- zeros = WebRtcSpl_NormU32(nearEner);
- frac = ExtractFractionPart(nearEner, zeros);
- // log2 in Q8
- tmp16 += ((31 - zeros) << 8) + frac;
- tmp16 -= aecm->dfaNoisyQDomain << 8;
- }
- aecm->nearLogEnergy[0] = tmp16;
- // END: Get log of near end energy
+ aecm->nearLogEnergy[0] = LogOfEnergyInQ8(nearEner, aecm->dfaNoisyQDomain);
WebRtcAecm_CalcLinearEnergies(aecm, far_spectrum, echoEst, &tmpFar, &tmpAdapt, &tmpStored);
@@ -771,40 +773,15 @@
sizeof(int16_t) * (MAX_BUF_LEN - 1));
// Logarithm of delayed far end energy
- tmp16 = kLogLowValue;
- if (tmpFar)
- {
- zeros = WebRtcSpl_NormU32(tmpFar);
- frac = ExtractFractionPart(tmpFar, zeros);
- // log2 in Q8
- tmp16 += ((31 - zeros) << 8) + frac;
- tmp16 -= far_q << 8;
- }
- aecm->farLogEnergy = tmp16;
+ aecm->farLogEnergy = LogOfEnergyInQ8(tmpFar, far_q);
// Logarithm of estimated echo energy through adapted channel
- tmp16 = kLogLowValue;
- if (tmpAdapt)
- {
- zeros = WebRtcSpl_NormU32(tmpAdapt);
- frac = ExtractFractionPart(tmpAdapt, zeros);
- //log2 in Q8
- tmp16 += ((31 - zeros) << 8) + frac;
- tmp16 -= (RESOLUTION_CHANNEL16 + far_q) << 8;
- }
- aecm->echoAdaptLogEnergy[0] = tmp16;
+ aecm->echoAdaptLogEnergy[0] = LogOfEnergyInQ8(tmpAdapt,
+ RESOLUTION_CHANNEL16 + far_q);
// Logarithm of estimated echo energy through stored channel
- tmp16 = kLogLowValue;
- if (tmpStored)
- {
- zeros = WebRtcSpl_NormU32(tmpStored);
- frac = ExtractFractionPart(tmpStored, zeros);
- //log2 in Q8
- tmp16 += ((31 - zeros) << 8) + frac;
- tmp16 -= (RESOLUTION_CHANNEL16 + far_q) << 8;
- }
- aecm->echoStoredLogEnergy[0] = tmp16;
+ aecm->echoStoredLogEnergy[0] =
+ LogOfEnergyInQ8(tmpStored, RESOLUTION_CHANNEL16 + far_q);
// Update farend energy levels (min, max, vad, mse)
if (aecm->farLogEnergy > FAR_ENERGY_MIN)