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:
@ -662,6 +662,60 @@ void WebRtcAec_ProcessFrame(aec_t *aec,
|
|||||||
aec->system_delay -= FRAME_LEN;
|
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) {
|
static void ProcessBlock(aec_t* aec) {
|
||||||
int i;
|
int i;
|
||||||
float d[PART_LEN], y[PART_LEN], e[PART_LEN], dH[PART_LEN];
|
float d[PART_LEN], y[PART_LEN], e[PART_LEN], dH[PART_LEN];
|
||||||
|
@ -182,5 +182,8 @@ void WebRtcAec_ProcessFrame(aec_t* aec,
|
|||||||
// Returns the number of elements moved, and adjusts |system_delay| by the
|
// Returns the number of elements moved, and adjusts |system_delay| by the
|
||||||
// corresponding amount in ms.
|
// corresponding amount in ms.
|
||||||
int WebRtcAec_MoveFarReadPtr(aec_t* aec, int elements);
|
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_
|
#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
|
||||||
|
@ -734,12 +734,6 @@ WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics)
|
|||||||
|
|
||||||
int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std) {
|
int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std) {
|
||||||
aecpc_t* self = handle;
|
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) {
|
if (handle == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -756,46 +750,12 @@ int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std) {
|
|||||||
self->lastError = AEC_UNINITIALIZED_ERROR;
|
self->lastError = AEC_UNINITIALIZED_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (self->aec->delay_logging_enabled == 0) {
|
if (WebRtcAec_GetDelayMetricsCore(self->aec, median, std) == -1) {
|
||||||
// Logging disabled
|
// Logging disabled.
|
||||||
self->lastError = AEC_UNSUPPORTED_FUNCTION_ERROR;
|
self->lastError = AEC_UNSUPPORTED_FUNCTION_ERROR;
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user