Index: mg2ec.h =================================================================== --- mg2ec.h (revision 880) +++ mg2ec.h (working copy) @@ -462,8 +462,12 @@ !(ec->i_d % DEFAULT_M)) { /* we only update on every DEFAULM_M'th sample from the stream */ if (ec->Lu_i > MIN_UPDATE_THRESH_I) { /* there is sufficient energy above the noise floor to contain meaningful data */ /* so loop over all the filter coefficients */ -#ifdef FILTER_PERCENT - int max = 0, max2 = 0; +#ifdef USED_COEFFS + int max_coeffs[USED_COEFFS]; + int *pos; + + if (ec->N_d > USED_COEFFS) + memset(max_coeffs, 0, USED_COEFFS*sizeof(int)); #endif #ifdef MEC2_STATS_DETAILED printk( KERN_INFO "updating coefficients with: ec->Lu_i %9d\n", ec->Lu_i); @@ -482,21 +486,29 @@ ec->a_i[k] += grad2 / two_beta_i; ec->a_s[k] = ec->a_i[k] >> 16; -#ifdef FILTER_PERCENT - /* Find the peaks */ - if (abs(ec->a_i[k]) > max) - { - max2 = max; - max = abs(ec->a_i[k]); +#ifdef USED_COEFFS + if (ec->N_d > USED_COEFFS) { + if (abs(ec->a_i[k]) > max_coeffs[USED_COEFFS-1]) { + /* More or less insertion-sort... */ + pos = max_coeffs; + while (*pos > abs(ec->a_i[k])) + pos++; + + if (*pos > max_coeffs[USED_COEFFS-1]) + memmove(pos+1, pos, (USED_COEFFS-(pos-max_coeffs)-1)*sizeof(int)); + + *pos = abs(ec->a_i[k]); + } } #endif } -#ifdef FILTER_PERCENT +#ifdef USED_COEFFS /* Filter out irrelevant coefficients */ - for (k=0; k < ec->N_d; k++) - if (abs(ec->a_i[k]) < (max2*FILTER_PERCENT)/100) - ec->a_i[k] = ec->a_s[k] = 0; + if (ec->N_d > USED_COEFFS) + for (k=0; k < ec->N_d; k++) + if (abs(ec->a_i[k]) < max_coeffs[USED_COEFFS-1]) + ec->a_i[k] = ec->a_s[k] = 0; #endif } else { #ifdef MEC2_STATS_DETAILED Index: mg2ec_const.h =================================================================== --- mg2ec_const.h (revision 880) +++ mg2ec_const.h (working copy) @@ -62,11 +62,14 @@ * the input-signal */ #define MAX_SIGN_ERROR 3000 -/* Filter out coefficients which are smaller than this - * percentage of the second biggest coefficient. - * If you comment out this define, the filtering-code will - * not be used */ -#define FILTER_PERCENT 1 +/* Number of coefficients really used for calculating the + * simulated echo. The value specifies how many of the + * biggest coefficients are used for calculating rs. + * This helps on long echo-tails by artificially limiting + * the number of coefficients for the calculation and + * preventing overflows. + * Comment this to deactivate the code */ +#define USED_COEFFS 64 /* Backup coefficients every this number of samples */ #define BACKUP 256