Moved the actual calculations to aec_core to avoid passing up low level members.

TEST=audioproc_unittest, trybots
BUG=None

Review URL: https://webrtc-codereview.appspot.com/1103011

git-svn-id: http://webrtc.googlecode.com/svn/trunk@3521 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
bjornv@webrtc.org 2013-02-15 15:21:02 +00:00
parent 0989fb7bfa
commit 325f625137
3 changed files with 59 additions and 42 deletions

View File

@ -662,6 +662,60 @@ void WebRtcAec_ProcessFrame(aec_t *aec,
aec->system_delay -= FRAME_LEN;
}
int WebRtcAec_GetDelayMetricsCore(aec_t* self, int* median, int* std) {
int i = 0;
int delay_values = 0;
int num_delay_values = 0;
int my_median = 0;
const int kMsPerBlock = PART_LEN / (self->mult * 8);
float l1_norm = 0;
assert(self != NULL);
assert(median != NULL);
assert(std != NULL);
if (self->delay_logging_enabled == 0) {
// Logging disabled.
return -1;
}
// Get number of delay values since last update.
for (i = 0; i < kHistorySizeBlocks; i++) {
num_delay_values += self->delay_histogram[i];
}
if (num_delay_values == 0) {
// We have no new delay value data. Even though -1 is a valid estimate, it
// will practically never be used since multiples of |kMsPerBlock| will
// always be returned.
*median = -1;
*std = -1;
return 0;
}
delay_values = num_delay_values >> 1; // Start value for median count down.
// Get median of delay values since last update.
for (i = 0; i < kHistorySizeBlocks; i++) {
delay_values -= self->delay_histogram[i];
if (delay_values < 0) {
my_median = i;
break;
}
}
// Account for lookahead.
*median = (my_median - kLookaheadBlocks) * kMsPerBlock;
// Calculate the L1 norm, with median value as central moment.
for (i = 0; i < kHistorySizeBlocks; i++) {
l1_norm += (float) (fabs(i - my_median) * self->delay_histogram[i]);
}
*std = (int) (l1_norm / (float) num_delay_values + 0.5f) * kMsPerBlock;
// Reset histogram.
memset(self->delay_histogram, 0, sizeof(self->delay_histogram));
return 0;
}
static void ProcessBlock(aec_t* aec) {
int i;
float d[PART_LEN], y[PART_LEN], e[PART_LEN], dH[PART_LEN];

View File

@ -182,5 +182,8 @@ void WebRtcAec_ProcessFrame(aec_t* aec,
// Returns the number of elements moved, and adjusts |system_delay| by the
// corresponding amount in ms.
int WebRtcAec_MoveFarReadPtr(aec_t* aec, int elements);
// Calculates the median and standard deviation among the delay estimates
// collected since the last call to this function.
int WebRtcAec_GetDelayMetricsCore(aec_t* self, int* median, int* std);
#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_

View File

@ -734,12 +734,6 @@ WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics)
int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std) {
aecpc_t* self = handle;
int i = 0;
int delay_values = 0;
int num_delay_values = 0;
int my_median = 0;
const int kMsPerBlock = (PART_LEN * 1000) / self->splitSampFreq;
float l1_norm = 0;
if (handle == NULL) {
return -1;
@ -756,46 +750,12 @@ int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std) {
self->lastError = AEC_UNINITIALIZED_ERROR;
return -1;
}
if (self->aec->delay_logging_enabled == 0) {
// Logging disabled
if (WebRtcAec_GetDelayMetricsCore(self->aec, median, std) == -1) {
// Logging disabled.
self->lastError = AEC_UNSUPPORTED_FUNCTION_ERROR;
return -1;
}
// Get number of delay values since last update
for (i = 0; i < kHistorySizeBlocks; i++) {
num_delay_values += self->aec->delay_histogram[i];
}
if (num_delay_values == 0) {
// We have no new delay value data. Even though -1 is a valid estimate, it
// will practically never be used since multiples of |kMsPerBlock| will
// always be returned.
*median = -1;
*std = -1;
return 0;
}
delay_values = num_delay_values >> 1; // Start value for median count down
// Get median of delay values since last update
for (i = 0; i < kHistorySizeBlocks; i++) {
delay_values -= self->aec->delay_histogram[i];
if (delay_values < 0) {
my_median = i;
break;
}
}
// Account for lookahead.
*median = (my_median - kLookaheadBlocks) * kMsPerBlock;
// Calculate the L1 norm, with median value as central moment
for (i = 0; i < kHistorySizeBlocks; i++) {
l1_norm += (float) (fabs(i - my_median) * self->aec->delay_histogram[i]);
}
*std = (int) (l1_norm / (float) num_delay_values + 0.5f) * kMsPerBlock;
// Reset histogram
memset(self->aec->delay_histogram, 0, sizeof(self->aec->delay_histogram));
return 0;
}