[dahdi-commits] kpfleming: branch linux/kpfleming/echocan_work r6356 - in /linux/team/kpflemi...
SVN commits to the DAHDI project
dahdi-commits at lists.digium.com
Mon Apr 13 14:32:59 CDT 2009
Author: kpfleming
Date: Mon Apr 13 14:32:55 2009
New Revision: 6356
URL: http://svn.digium.com/svn-view/dahdi?view=rev&rev=6356
Log:
all modules converted to new data structures... now to merge in new features
Modified:
linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_jpah.c
linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_kb1.c
linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_mg2.c
linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec.c
linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_sec2.c
linux/team/kpfleming/echocan_work/drivers/dahdi/hpec/dahdi_echocan_hpec.c
Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_jpah.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_jpah.c?view=diff&rev=6356&r1=6355&r2=6356
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_jpah.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_jpah.c Mon Apr 13 14:32:55 2009
@@ -75,11 +75,10 @@
return -EINVAL;
}
- if (!(pvt = kmalloc(sizeof(*pvt), GFP_KERNEL))) {
+ if (!(pvt = kzalloc(sizeof(*pvt), GFP_KERNEL))) {
return -ENOMEM;
}
- memset(&pvt, 0, sizeof(*pvt));
pvt->dahdi.owner = &me;
*ec = &pvt->dahdi;
Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_kb1.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_kb1.c?view=diff&rev=6356&r1=6355&r2=6356
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_kb1.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_kb1.c Mon Apr 13 14:32:55 2009
@@ -142,8 +142,26 @@
short *buf_d;
} echo_can_cb_s;
-/* Echo canceller definition */
-struct echo_can_state {
+static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
+ struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_echocan_state *ec);
+static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, short *iref);
+static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
+
+static const struct dahdi_echocan_factory my_factory = {
+ .name = "KB1",
+ .owner = THIS_MODULE,
+ .echocan_create = echo_can_create,
+};
+
+static const struct dahdi_echocan me = {
+ .echocan_free = echo_can_free,
+ .echocan_array_update = echo_can_array_update,
+ .echocan_traintap = echo_can_traintap,
+};
+
+struct ec_pvt {
+ struct dahdi_echocan_state dahdi;
/* an arbitrary ID for this echo can - this really should be settable from the calling channel... */
int id;
@@ -210,6 +228,8 @@
unsigned int aggressive:1;
};
+#define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
+
static inline void init_cb_s(echo_can_cb_s *cb, int len, void *where)
{
cb->buf_d = (short *)where;
@@ -236,77 +256,79 @@
return cb->buf_d[cb->idx_d + pos];
}
-static inline void init_cc(struct echo_can_state *ec, int N, int maxy, int maxu)
-{
-
- void *ptr = ec;
+static inline void init_cc(struct ec_pvt *pvt, int N, int maxy, int maxu)
+{
+ void *ptr = pvt;
unsigned long tmp;
+
/* Double-word align past end of state */
- ptr += sizeof(struct echo_can_state);
+ ptr += sizeof(*pvt);
tmp = (unsigned long)ptr;
tmp += 3;
tmp &= ~3L;
ptr = (void *)tmp;
/* Reset parameters */
- ec->N_d = N;
- ec->beta2_i = DEFAULT_BETA1_I;
+ pvt->N_d = N;
+ pvt->beta2_i = DEFAULT_BETA1_I;
/* Allocate coefficient memory */
- ec->a_i = ptr;
- ptr += (sizeof(int) * ec->N_d);
- ec->a_s = ptr;
- ptr += (sizeof(short) * ec->N_d);
+ pvt->a_i = ptr;
+ ptr += (sizeof(int) * pvt->N_d);
+ pvt->a_s = ptr;
+ ptr += (sizeof(short) * pvt->N_d);
/* Reset Y circular buffer (short version) */
- init_cb_s(&ec->y_s, maxy, ptr);
+ init_cb_s(&pvt->y_s, maxy, ptr);
ptr += (sizeof(short) * (maxy) * 2);
/* Reset Sigma circular buffer (short version for FIR filter) */
- init_cb_s(&ec->s_s, (1 << DEFAULT_ALPHA_ST_I), ptr);
+ init_cb_s(&pvt->s_s, (1 << DEFAULT_ALPHA_ST_I), ptr);
ptr += (sizeof(short) * (1 << DEFAULT_ALPHA_ST_I) * 2);
- init_cb_s(&ec->u_s, maxu, ptr);
+ init_cb_s(&pvt->u_s, maxu, ptr);
ptr += (sizeof(short) * maxu * 2);
/* Allocate a buffer for the reference signal power computation */
- init_cb_s(&ec->y_tilde_s, ec->N_d, ptr);
+ init_cb_s(&pvt->y_tilde_s, pvt->N_d, ptr);
/* Reset the absolute time index */
- ec->i_d = (int)0;
+ pvt->i_d = (int)0;
/* Reset the power computations (for y and u) */
- ec->Ly_i = DEFAULT_CUTOFF_I;
- ec->Lu_i = DEFAULT_CUTOFF_I;
+ pvt->Ly_i = DEFAULT_CUTOFF_I;
+ pvt->Lu_i = DEFAULT_CUTOFF_I;
#ifdef MEC2_STATS
/* set the identity */
- ec->id = (int)&ptr;
+ pvt->id = (int)&ptr;
/* Reset performance stats */
- ec->cntr_nearend_speech_frames = (int)0;
- ec->cntr_residualcorrected_frames = (int)0;
- ec->cntr_residualcorrected_framesskipped = (int)0;
- ec->cntr_coeff_updates = (int)0;
- ec->cntr_coeff_missedupdates = (int)0;
-
- ec->avg_Lu_i_toolow = (int)0;
- ec->avg_Lu_i_ok = (int)0;
+ pvt->cntr_nearend_speech_frames = (int)0;
+ pvt->cntr_residualcorrected_frames = (int)0;
+ pvt->cntr_residualcorrected_framesskipped = (int)0;
+ pvt->cntr_coeff_updates = (int)0;
+ pvt->cntr_coeff_missedupdates = (int)0;
+
+ pvt->avg_Lu_i_toolow = (int)0;
+ pvt->avg_Lu_i_ok = (int)0;
#endif
/* Reset the near-end speech detector */
- ec->s_tilde_i = (int)0;
- ec->y_tilde_i = (int)0;
- ec->HCNTR_d = (int)0;
-
-}
-
-static void echo_can_free(struct echo_can_state *ec)
-{
- kfree(ec);
-}
-
-static inline short sample_update(struct echo_can_state *ec, short iref, short isig)
+ pvt->s_tilde_i = (int)0;
+ pvt->y_tilde_i = (int)0;
+ pvt->HCNTR_d = (int)0;
+
+}
+
+static void echo_can_free(struct dahdi_echocan_state *ec)
+{
+ struct ec_pvt *pvt = dahdi_to_pvt(ec);
+
+ kfree(pvt);
+}
+
+static inline short sample_update(struct ec_pvt *pvt, short iref, short isig)
{
/* Declare local variables that are used more than once */
/* ... */
@@ -335,17 +357,17 @@
/* Update the Far-end receive signal circular buffers and accumulators */
/* ------------------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->y_tilde_i -= abs(get_cc_s(&ec->y_s, (1 << DEFAULT_ALPHA_YT_I) - 1 )) >> DEFAULT_ALPHA_YT_I;
+ pvt->y_tilde_i -= abs(get_cc_s(&pvt->y_s, (1 << DEFAULT_ALPHA_YT_I) - 1 )) >> DEFAULT_ALPHA_YT_I;
/* Add the new sample to the power estimate accumulator */
- ec->y_tilde_i += abs(iref) >> DEFAULT_ALPHA_ST_I;
+ pvt->y_tilde_i += abs(iref) >> DEFAULT_ALPHA_ST_I;
/* Push a copy of the new sample into its circular buffer */
- add_cc_s(&ec->y_s, iref);
+ add_cc_s(&pvt->y_s, iref);
/* eq. (2): compute r in fixed-point */
- rs = CONVOLVE2(ec->a_s,
- ec->y_s.buf_d + ec->y_s.idx_d,
- ec->N_d);
+ rs = CONVOLVE2(pvt->a_s,
+ pvt->y_s.buf_d + pvt->y_s.idx_d,
+ pvt->N_d);
rs >>= 15;
/* eq. (3): compute the output value (see figure 3) and the error
@@ -355,27 +377,27 @@
u = isig - rs;
/* Push a copy of the output value sample into its circular buffer */
- add_cc_s(&ec->u_s, u);
+ add_cc_s(&pvt->u_s, u);
/* Update the Near-end hybrid signal circular buffers and accumulators */
/* ------------------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->s_tilde_i -= abs(get_cc_s(&ec->s_s, (1 << DEFAULT_ALPHA_ST_I) - 1 ));
+ pvt->s_tilde_i -= abs(get_cc_s(&pvt->s_s, (1 << DEFAULT_ALPHA_ST_I) - 1 ));
/* Add the new sample to the power estimate accumulator */
- ec->s_tilde_i += abs(isig);
+ pvt->s_tilde_i += abs(isig);
/* Push a copy of the new sample into it's circular buffer */
- add_cc_s(&ec->s_s, isig);
+ add_cc_s(&pvt->s_s, isig);
/* Push a copy of the current short-time average of the far-end receive signal into it's circular buffer */
- add_cc_s(&ec->y_tilde_s, ec->y_tilde_i);
+ add_cc_s(&pvt->y_tilde_s, pvt->y_tilde_i);
/* flow B on pg. 428 */
/* If the hangover timer isn't running then compute the new convergence factor, otherwise set Py_i to 32768 */
- if (!ec->HCNTR_d) {
- Py_i = (ec->Ly_i >> DEFAULT_SIGMA_LY_I) * (ec->Ly_i >> DEFAULT_SIGMA_LY_I);
+ if (!pvt->HCNTR_d) {
+ Py_i = (pvt->Ly_i >> DEFAULT_SIGMA_LY_I) * (pvt->Ly_i >> DEFAULT_SIGMA_LY_I);
Py_i >>= 15;
} else {
Py_i = (1 << 15);
@@ -389,107 +411,107 @@
* Still needs conversion!
*/
- if (ec->start_speech_d != 0 ){
- if ( ec->i_d > (DEFAULT_T0 + ec->start_speech_d)*(SAMPLE_FREQ) ){
- ec->beta2_d = max_cc_float(MIN_BETA, DEFAULT_BETA1 * exp((-1/DEFAULT_TAU)*((ec->i_d/(float)SAMPLE_FREQ) - DEFAULT_T0 - ec->start_speech_d)));
+ if (pvt->start_speech_d != 0 ){
+ if ( pvt->i_d > (DEFAULT_T0 + pvt->start_speech_d)*(SAMPLE_FREQ) ){
+ pvt->beta2_d = max_cc_float(MIN_BETA, DEFAULT_BETA1 * exp((-1/DEFAULT_TAU)*((pvt->i_d/(float)SAMPLE_FREQ) - DEFAULT_T0 - pvt->start_speech_d)));
}
} else {
- ec->beta2_d = DEFAULT_BETA1;
+ pvt->beta2_d = DEFAULT_BETA1;
}
#endif
/* Fixed point, inverted */
- ec->beta2_i = DEFAULT_BETA1_I;
+ pvt->beta2_i = DEFAULT_BETA1_I;
/* Fixed point version, inverted */
- two_beta_i = (ec->beta2_i * Py_i) >> 15;
+ two_beta_i = (pvt->beta2_i * Py_i) >> 15;
if (!two_beta_i)
two_beta_i++;
/* Update the Suppressed signal power estimate accumulator */
/* ------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->Lu_i -= abs(get_cc_s(&ec->u_s, (1 << DEFAULT_SIGMA_LU_I) - 1 )) ;
+ pvt->Lu_i -= abs(get_cc_s(&pvt->u_s, (1 << DEFAULT_SIGMA_LU_I) - 1 )) ;
/* Add the new sample to the power estimate accumulator */
- ec->Lu_i += abs(u);
+ pvt->Lu_i += abs(u);
/* Update the Far-end reference signal power estimate accumulator */
/* -------------------------------------------------------------- */
/* eq. (10): update power estimate of the reference */
/* Delete the oldest sample from the power estimate accumulator */
- ec->Ly_i -= abs(get_cc_s(&ec->y_s, (1 << DEFAULT_SIGMA_LY_I) - 1)) ;
+ pvt->Ly_i -= abs(get_cc_s(&pvt->y_s, (1 << DEFAULT_SIGMA_LY_I) - 1)) ;
/* Add the new sample to the power estimate accumulator */
- ec->Ly_i += abs(iref);
-
- if (ec->Ly_i < DEFAULT_CUTOFF_I)
- ec->Ly_i = DEFAULT_CUTOFF_I;
+ pvt->Ly_i += abs(iref);
+
+ if (pvt->Ly_i < DEFAULT_CUTOFF_I)
+ pvt->Ly_i = DEFAULT_CUTOFF_I;
/* Update the Peak far-end receive signal detected */
/* ----------------------------------------------- */
- if (ec->y_tilde_i > ec->max_y_tilde) {
+ if (pvt->y_tilde_i > pvt->max_y_tilde) {
/* New highest y_tilde with full life */
- ec->max_y_tilde = ec->y_tilde_i;
- ec->max_y_tilde_pos = ec->N_d - 1;
- } else if (--ec->max_y_tilde_pos < 0) {
+ pvt->max_y_tilde = pvt->y_tilde_i;
+ pvt->max_y_tilde_pos = pvt->N_d - 1;
+ } else if (--pvt->max_y_tilde_pos < 0) {
/* Time to find new max y tilde... */
- ec->max_y_tilde = MAX16(ec->y_tilde_s.buf_d + ec->y_tilde_s.idx_d, ec->N_d, &ec->max_y_tilde_pos);
+ pvt->max_y_tilde = MAX16(pvt->y_tilde_s.buf_d + pvt->y_tilde_s.idx_d, pvt->N_d, &pvt->max_y_tilde_pos);
}
/* Determine if near end speech was detected in this sample */
/* -------------------------------------------------------- */
- if (((ec->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)) > ec->max_y_tilde)
- && (ec->max_y_tilde > 0)) {
+ if (((pvt->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)) > pvt->max_y_tilde)
+ && (pvt->max_y_tilde > 0)) {
/* Then start the Hangover counter */
- ec->HCNTR_d = DEFAULT_HANGT;
+ pvt->HCNTR_d = DEFAULT_HANGT;
#ifdef MEC2_STATS_DETAILED
- printk(KERN_INFO "Reset near end speech timer with: s_tilde_i %d, stmnt %d, max_y_tilde %d\n", ec->s_tilde_i, (ec->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)), ec->max_y_tilde);
-#endif
-#ifdef MEC2_STATS
- ++ec->cntr_nearend_speech_frames;
-#endif
- } else if (ec->HCNTR_d > (int)0) {
+ printk(KERN_INFO "Reset near end speech timer with: s_tilde_i %d, stmnt %d, max_y_tilde %d\n", pvt->s_tilde_i, (pvt->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)), pvt->max_y_tilde);
+#endif
+#ifdef MEC2_STATS
+ ++pvt->cntr_nearend_speech_frames;
+#endif
+ } else if (pvt->HCNTR_d > (int)0) {
/* otherwise, if it's still non-zero, decrement the Hangover counter by one sample */
#ifdef MEC2_STATS
- ++ec->cntr_nearend_speech_frames;
-#endif
- ec->HCNTR_d--;
+ ++pvt->cntr_nearend_speech_frames;
+#endif
+ pvt->HCNTR_d--;
}
/* Update coefficients if no near-end speech in this sample (ie. HCNTR_d = 0)
* and we have enough signal to bother trying to update.
* --------------------------------------------------------------------------
*/
- if (!ec->HCNTR_d && /* no near-end speech present */
- !(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 */
+ if (!pvt->HCNTR_d && /* no near-end speech present */
+ !(pvt->i_d % DEFAULT_M)) { /* we only update on every DEFAULM_M'th sample from the stream */
+ if (pvt->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 MEC2_STATS_DETAILED
- printk( KERN_INFO "updating coefficients with: ec->Lu_i %9d\n", ec->Lu_i);
-#endif
-#ifdef MEC2_STATS
- ec->avg_Lu_i_ok = ec->avg_Lu_i_ok + ec->Lu_i;
- ++ec->cntr_coeff_updates;
-#endif
- for (k=0; k < ec->N_d; k++) {
- /* eq. (7): compute an expectation over M_d samples */
- int grad2;
- grad2 = CONVOLVE2(ec->u_s.buf_d + ec->u_s.idx_d,
- ec->y_s.buf_d + ec->y_s.idx_d + k,
- DEFAULT_M);
- /* eq. (7): update the coefficient */
- ec->a_i[k] += grad2 / two_beta_i;
- ec->a_s[k] = ec->a_i[k] >> 16;
- }
- } else {
+ printk( KERN_INFO "updating coefficients with: pvt->Lu_i %9d\n", pvt->Lu_i);
+#endif
+#ifdef MEC2_STATS
+ pvt->avg_Lu_i_ok = pvt->avg_Lu_i_ok + pvt->Lu_i;
+ ++pvt->cntr_coeff_updates;
+#endif
+ for (k=0; k < pvt->N_d; k++) {
+ /* eq. (7): compute an expectation over M_d samples */
+ int grad2;
+ grad2 = CONVOLVE2(pvt->u_s.buf_d + pvt->u_s.idx_d,
+ pvt->y_s.buf_d + pvt->y_s.idx_d + k,
+ DEFAULT_M);
+ /* eq. (7): update the coefficient */
+ pvt->a_i[k] += grad2 / two_beta_i;
+ pvt->a_s[k] = pvt->a_i[k] >> 16;
+ }
+ } else {
#ifdef MEC2_STATS_DETAILED
- printk( KERN_INFO "insufficient signal to update coefficients ec->Lu_i %5d < %5d\n", ec->Lu_i, MIN_UPDATE_THRESH_I);
-#endif
-#ifdef MEC2_STATS
- ec->avg_Lu_i_toolow = ec->avg_Lu_i_toolow + ec->Lu_i;
- ++ec->cntr_coeff_missedupdates;
-#endif
- }
+ printk( KERN_INFO "insufficient signal to update coefficients pvt->Lu_i %5d < %5d\n", pvt->Lu_i, MIN_UPDATE_THRESH_I);
+#endif
+#ifdef MEC2_STATS
+ pvt->avg_Lu_i_toolow = pvt->avg_Lu_i_toolow + pvt->Lu_i;
+ ++pvt->cntr_coeff_missedupdates;
+#endif
+ }
}
/* paragraph below eq. (15): if no near-end speech in the sample and
@@ -497,39 +519,39 @@
* then perform residual error suppression
*/
#ifdef MEC2_STATS_DETAILED
- if (ec->HCNTR_d == 0)
- printk( KERN_INFO "possibily correcting frame with ec->Ly_i %9d ec->Lu_i %9d and expression %d\n", ec->Ly_i, ec->Lu_i, (ec->Ly_i/(ec->Lu_i + 1)));
+ if (pvt->HCNTR_d == 0)
+ printk( KERN_INFO "possibily correcting frame with pvt->Ly_i %9d pvt->Lu_i %9d and expression %d\n", pvt->Ly_i, pvt->Lu_i, (pvt->Ly_i/(pvt->Lu_i + 1)));
#endif
#ifndef NO_ECHO_SUPPRESSOR
- if (ec->aggressive) {
- if ((ec->HCNTR_d < AGGRESSIVE_HCNTR) && (ec->Ly_i > (ec->Lu_i << 1))) {
+ if (pvt->aggressive) {
+ if ((pvt->HCNTR_d < AGGRESSIVE_HCNTR) && (pvt->Ly_i > (pvt->Lu_i << 1))) {
for (k=0; k < 2; k++) {
- u = u * (ec->Lu_i >> DEFAULT_SIGMA_LU_I) / ((ec->Ly_i >> (DEFAULT_SIGMA_LY_I)) + 1);
+ u = u * (pvt->Lu_i >> DEFAULT_SIGMA_LU_I) / ((pvt->Ly_i >> (DEFAULT_SIGMA_LY_I)) + 1);
}
#ifdef MEC2_STATS_DETAILED
- printk( KERN_INFO "aggresively correcting frame with ec->Ly_i %9d ec->Lu_i %9d expression %d\n", ec->Ly_i, ec->Lu_i, (ec->Ly_i/(ec->Lu_i + 1)));
-#endif
-#ifdef MEC2_STATS
- ++ec->cntr_residualcorrected_frames;
+ printk( KERN_INFO "aggresively correcting frame with pvt->Ly_i %9d pvt->Lu_i %9d expression %d\n", pvt->Ly_i, pvt->Lu_i, (pvt->Ly_i/(pvt->Lu_i + 1)));
+#endif
+#ifdef MEC2_STATS
+ ++pvt->cntr_residualcorrected_frames;
#endif
}
} else {
- if (ec->HCNTR_d == 0) {
- if ((ec->Ly_i/(ec->Lu_i + 1)) > DEFAULT_SUPPR_I) {
+ if (pvt->HCNTR_d == 0) {
+ if ((pvt->Ly_i/(pvt->Lu_i + 1)) > DEFAULT_SUPPR_I) {
for (k=0; k < 1; k++) {
- u = u * (ec->Lu_i >> DEFAULT_SIGMA_LU_I) / ((ec->Ly_i >> (DEFAULT_SIGMA_LY_I + 2)) + 1);
+ u = u * (pvt->Lu_i >> DEFAULT_SIGMA_LU_I) / ((pvt->Ly_i >> (DEFAULT_SIGMA_LY_I + 2)) + 1);
}
#ifdef MEC2_STATS_DETAILED
- printk( KERN_INFO "correcting frame with ec->Ly_i %9d ec->Lu_i %9d expression %d\n", ec->Ly_i, ec->Lu_i, (ec->Ly_i/(ec->Lu_i + 1)));
-#endif
-#ifdef MEC2_STATS
- ++ec->cntr_residualcorrected_frames;
+ printk( KERN_INFO "correcting frame with pvt->Ly_i %9d pvt->Lu_i %9d expression %d\n", pvt->Ly_i, pvt->Lu_i, (pvt->Ly_i/(pvt->Lu_i + 1)));
+#endif
+#ifdef MEC2_STATS
+ ++pvt->cntr_residualcorrected_frames;
#endif
}
#ifdef MEC2_STATS
else {
- ++ec->cntr_residualcorrected_framesskipped;
+ ++pvt->cntr_residualcorrected_framesskipped;
}
#endif
}
@@ -538,71 +560,73 @@
#if 0
/* This will generate a non-linear supression factor, once converted */
- if ((ec->HCNTR_d == 0) &&
- ((ec->Lu_d/ec->Ly_d) < DEFAULT_SUPPR) &&
- (ec->Lu_d/ec->Ly_d > EC_MIN_DB_VALUE)) {
- suppr_factor = (10 / (float)(SUPPR_FLOOR - SUPPR_CEIL)) * log(ec->Lu_d/ec->Ly_d)
- - SUPPR_CEIL / (float)(SUPPR_FLOOR - SUPPR_CEIL);
+ if ((pvt->HCNTR_d == 0) &&
+ ((pvt->Lu_d/pvt->Ly_d) < DEFAULT_SUPPR) &&
+ (pvt->Lu_d/pvt->Ly_d > EC_MIN_DB_VALUE)) {
+ suppr_factor = (10 / (float)(SUPPR_FLOOR - SUPPR_CEIL)) * log(pvt->Lu_d/pvt->Ly_d)
+ - SUPPR_CEIL / (float)(SUPPR_FLOOR - SUPPR_CEIL);
u_suppr = pow(10.0, (suppr_factor) * RES_SUPR_FACTOR / 10.0) * u_suppr;
}
#endif
#ifdef MEC2_STATS
/* Periodically dump performance stats */
- if ((ec->i_d % MEC2_STATS) == 0) {
+ if ((pvt->i_d % MEC2_STATS) == 0) {
/* make sure to avoid div0's! */
- if (ec->cntr_coeff_missedupdates > 0)
- ec->avg_Lu_i_toolow = (int)(ec->avg_Lu_i_toolow / ec->cntr_coeff_missedupdates);
+ if (pvt->cntr_coeff_missedupdates > 0)
+ pvt->avg_Lu_i_toolow = (int)(pvt->avg_Lu_i_toolow / pvt->cntr_coeff_missedupdates);
else
- ec->avg_Lu_i_toolow = -1;
-
- if (ec->cntr_coeff_updates > 0)
- ec->avg_Lu_i_ok = (ec->avg_Lu_i_ok / ec->cntr_coeff_updates);
+ pvt->avg_Lu_i_toolow = -1;
+
+ if (pvt->cntr_coeff_updates > 0)
+ pvt->avg_Lu_i_ok = (pvt->avg_Lu_i_ok / pvt->cntr_coeff_updates);
else
- ec->avg_Lu_i_ok = -1;
+ pvt->avg_Lu_i_ok = -1;
printk( KERN_INFO "%d: Near end speech: %5d Residuals corrected/skipped: %5d/%5d Coefficients updated ok/low sig: %3d/%3d Lu_i avg ok/low sig %6d/%5d\n",
- ec->id,
- ec->cntr_nearend_speech_frames,
- ec->cntr_residualcorrected_frames, ec->cntr_residualcorrected_framesskipped,
- ec->cntr_coeff_updates, ec->cntr_coeff_missedupdates,
- ec->avg_Lu_i_ok, ec->avg_Lu_i_toolow);
-
- ec->cntr_nearend_speech_frames = 0;
- ec->cntr_residualcorrected_frames = 0;
- ec->cntr_residualcorrected_framesskipped = 0;
- ec->cntr_coeff_updates = 0;
- ec->cntr_coeff_missedupdates = 0;
- ec->avg_Lu_i_ok = 0;
- ec->avg_Lu_i_toolow = 0;
+ pvt->id,
+ pvt->cntr_nearend_speech_frames,
+ pvt->cntr_residualcorrected_frames, pvt->cntr_residualcorrected_framesskipped,
+ pvt->cntr_coeff_updates, pvt->cntr_coeff_missedupdates,
+ pvt->avg_Lu_i_ok, pvt->avg_Lu_i_toolow);
+
+ pvt->cntr_nearend_speech_frames = 0;
+ pvt->cntr_residualcorrected_frames = 0;
+ pvt->cntr_residualcorrected_framesskipped = 0;
+ pvt->cntr_coeff_updates = 0;
+ pvt->cntr_coeff_missedupdates = 0;
+ pvt->avg_Lu_i_ok = 0;
+ pvt->avg_Lu_i_toolow = 0;
}
#endif
/* Increment the sample index and return the corrected sample */
- ec->i_d++;
+ pvt->i_d++;
return u;
}
-static void echo_can_update(struct echo_can_state *ec, short *isig, short *iref)
-{
+static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, short *iref)
+{
+ struct ec_pvt *pvt = dahdi_to_pvt(ec);
unsigned int x;
short result;
for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
- result = sample_update(ec, *iref, *isig);
+ result = sample_update(pvt, *iref, *isig);
*isig++ = result;
++iref;
}
}
static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
- struct echo_can_state **ec)
+ struct dahdi_echocan_state **ec)
{
int maxy;
int maxu;
size_t size;
unsigned int x;
char *c;
+ struct ec_pvt *pvt;
maxy = ecp->tap_length + DEFAULT_M;
maxu = DEFAULT_M;
@@ -622,75 +646,70 @@
2 * sizeof(short) * (maxu) + /* u_s */
2 * sizeof(short) * ecp->tap_length; /* y_tilde_s */
- if (!(*ec = kmalloc(size, GFP_KERNEL)))
+ if (!(pvt = kzalloc(size, GFP_KERNEL))) {
return -ENOMEM;
-
- memset(*ec, 0, size);
-
- (*ec)->aggressive = aggressive;
+ }
+
+ pvt->dahdi.owner = &me;
+
+ pvt->aggressive = aggressive;
for (x = 0; x < ecp->param_count; x++) {
for (c = p[x].name; *c; c++)
*c = tolower(*c);
if (!strcmp(p[x].name, "aggressive")) {
- (*ec)->aggressive = p[x].value ? 1 : 0;
+ pvt->aggressive = p[x].value ? 1 : 0;
} else {
printk(KERN_WARNING "Unknown parameter supplied to KB1 echo canceler: '%s'\n", p[x].name);
- kfree(*ec);
+ kfree(pvt);
return -EINVAL;
}
}
- init_cc(*ec, ecp->tap_length, maxy, maxu);
+ init_cc(pvt, ecp->tap_length, maxy, maxu);
+ *ec = &pvt->dahdi;
return 0;
}
-static int echo_can_traintap(struct echo_can_state *ec, int pos, short val)
-{
+static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val)
+{
+ struct ec_pvt *pvt = dahdi_to_pvt(ec);
+
/* Set the hangover counter to the length of the can to
* avoid adjustments occuring immediately after initial forced training
*/
- ec->HCNTR_d = ec->N_d << 1;
-
- if (pos >= ec->N_d)
+ pvt->HCNTR_d = pvt->N_d << 1;
+
+ if (pos >= pvt->N_d)
return 1;
- ec->a_i[pos] = val << 17;
- ec->a_s[pos] = val << 1;
-
- if (++pos >= ec->N_d)
+ pvt->a_i[pos] = val << 17;
+ pvt->a_s[pos] = val << 1;
+
+ if (++pos >= pvt->N_d)
return 1;
return 0;
}
-static const struct dahdi_echocan me = {
- .name = "KB1",
- .owner = THIS_MODULE,
- .echo_can_create = echo_can_create,
- .echo_can_free = echo_can_free,
- .echo_can_array_update = echo_can_update,
- .echo_can_traintap = echo_can_traintap,
-};
-
static int __init mod_init(void)
{
- if (dahdi_register_echocan(&me)) {
+ if (dahdi_register_echocan(&my_factory)) {
module_printk(KERN_ERR, "could not register with DAHDI core\n");
return -EPERM;
}
- module_printk(KERN_NOTICE, "Registered echo canceler '%s'\n", me.name);
+ module_printk(KERN_NOTICE, "Registered echo canceler '%s'\n", my_factory.name);
return 0;
}
static void __exit mod_exit(void)
{
- dahdi_unregister_echocan(&me);
+ dahdi_unregister_echocan(&my_factory);
}
module_param(debug, int, S_IRUGO | S_IWUSR);
Modified: linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_mg2.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_mg2.c?view=diff&rev=6356&r1=6355&r2=6356
==============================================================================
--- linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_mg2.c (original)
+++ linux/team/kpfleming/echocan_work/drivers/dahdi/dahdi_echocan_mg2.c Mon Apr 13 14:32:55 2009
@@ -51,11 +51,11 @@
#define RESTORE_COEFFS {\
int x;\
- memcpy(ec->a_i, ec->c_i, ec->N_d*sizeof(int));\
- for (x=0;x<ec->N_d;x++) {\
- ec->a_s[x] = ec->a_i[x] >> 16;\
+ memcpy(pvt->a_i, pvt->c_i, pvt->N_d*sizeof(int));\
+ for (x=0;x<pvt->N_d;x++) {\
+ pvt->a_s[x] = pvt->a_i[x] >> 16;\
}\
- ec->backup = BACKUP;\
+ pvt->backup = BACKUP;\
}
/* Uncomment to provide summary statistics for overall echo can performance every 4000 samples */
@@ -174,8 +174,26 @@
short *buf_d;
} echo_can_cb_s;
-/* Echo canceller definition */
-struct echo_can_state {
+static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
+ struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_echocan_state *ec);
+static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, short *iref);
+static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
+
+static const struct dahdi_echocan_factory my_factory = {
+ .name = "MG2",
+ .owner = THIS_MODULE,
+ .echocan_create = echo_can_create,
+};
+
+static const struct dahdi_echocan me = {
+ .echocan_free = echo_can_free,
+ .echocan_array_update = echo_can_array_update,
+ .echocan_traintap = echo_can_traintap,
+};
+
+struct ec_pvt {
+ struct dahdi_echocan_state dahdi;
/* an arbitrary ID for this echo can - this really should be settable from the calling channel... */
int id;
@@ -249,8 +267,9 @@
#ifdef DC_NORMALIZE
int dc_estimate;
#endif
-
};
+
+#define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
static inline void init_cb_s(echo_can_cb_s *cb, int len, void *where)
{
@@ -278,83 +297,85 @@
return cb->buf_d[cb->idx_d + pos];
}
-static inline void init_cc(struct echo_can_state *ec, int N, int maxy, int maxu)
-{
-
- void *ptr = ec;
+static inline void init_cc(struct ec_pvt *pvt, int N, int maxy, int maxu)
+{
+ void *ptr = pvt;
unsigned long tmp;
+
/* Double-word align past end of state */
- ptr += sizeof(struct echo_can_state);
+ ptr += sizeof(*pvt);
tmp = (unsigned long)ptr;
tmp += 3;
tmp &= ~3L;
ptr = (void *)tmp;
/* Reset parameters */
- ec->N_d = N;
- ec->beta2_i = DEFAULT_BETA1_I;
+ pvt->N_d = N;
+ pvt->beta2_i = DEFAULT_BETA1_I;
/* Allocate coefficient memory */
- ec->a_i = ptr;
- ptr += (sizeof(int) * ec->N_d);
- ec->a_s = ptr;
- ptr += (sizeof(short) * ec->N_d);
+ pvt->a_i = ptr;
+ ptr += (sizeof(int) * pvt->N_d);
+ pvt->a_s = ptr;
+ ptr += (sizeof(short) * pvt->N_d);
/* Allocate backup memory */
- ec->b_i = ptr;
- ptr += (sizeof(int) * ec->N_d);
- ec->c_i = ptr;
- ptr += (sizeof(int) * ec->N_d);
+ pvt->b_i = ptr;
+ ptr += (sizeof(int) * pvt->N_d);
+ pvt->c_i = ptr;
+ ptr += (sizeof(int) * pvt->N_d);
/* Reset Y circular buffer (short version) */
- init_cb_s(&ec->y_s, maxy, ptr);
+ init_cb_s(&pvt->y_s, maxy, ptr);
ptr += (sizeof(short) * (maxy) * 2);
/* Reset Sigma circular buffer (short version for FIR filter) */
- init_cb_s(&ec->s_s, (1 << DEFAULT_ALPHA_ST_I), ptr);
+ init_cb_s(&pvt->s_s, (1 << DEFAULT_ALPHA_ST_I), ptr);
ptr += (sizeof(short) * (1 << DEFAULT_ALPHA_ST_I) * 2);
- init_cb_s(&ec->u_s, maxu, ptr);
+ init_cb_s(&pvt->u_s, maxu, ptr);
ptr += (sizeof(short) * maxu * 2);
/* Allocate a buffer for the reference signal power computation */
- init_cb_s(&ec->y_tilde_s, ec->N_d, ptr);
+ init_cb_s(&pvt->y_tilde_s, pvt->N_d, ptr);
/* Reset the absolute time index */
- ec->i_d = (int)0;
+ pvt->i_d = (int)0;
/* Reset the power computations (for y and u) */
- ec->Ly_i = DEFAULT_CUTOFF_I;
- ec->Lu_i = DEFAULT_CUTOFF_I;
+ pvt->Ly_i = DEFAULT_CUTOFF_I;
+ pvt->Lu_i = DEFAULT_CUTOFF_I;
#ifdef MEC2_STATS
/* set the identity */
- ec->id = (int)&ptr;
+ pvt->id = (int)&ptr;
/* Reset performance stats */
- ec->cntr_nearend_speech_frames = (int)0;
- ec->cntr_residualcorrected_frames = (int)0;
- ec->cntr_residualcorrected_framesskipped = (int)0;
- ec->cntr_coeff_updates = (int)0;
- ec->cntr_coeff_missedupdates = (int)0;
-
- ec->avg_Lu_i_toolow = (int)0;
- ec->avg_Lu_i_ok = (int)0;
+ pvt->cntr_nearend_speech_frames = (int)0;
+ pvt->cntr_residualcorrected_frames = (int)0;
+ pvt->cntr_residualcorrected_framesskipped = (int)0;
+ pvt->cntr_coeff_updates = (int)0;
+ pvt->cntr_coeff_missedupdates = (int)0;
+
+ pvt->avg_Lu_i_toolow = (int)0;
+ pvt->avg_Lu_i_ok = (int)0;
#endif
/* Reset the near-end speech detector */
- ec->s_tilde_i = (int)0;
- ec->y_tilde_i = (int)0;
- ec->HCNTR_d = (int)0;
-
-}
-
-static void echo_can_free(struct echo_can_state *ec)
-{
+ pvt->s_tilde_i = (int)0;
+ pvt->y_tilde_i = (int)0;
+ pvt->HCNTR_d = (int)0;
+
+}
+
+static void echo_can_free(struct dahdi_echocan_state *ec)
+{
+ struct ec_pvt *pvt = dahdi_to_pvt(ec);
+
#if defined(DC_NORMALIZE) && defined(MEC2_DCBIAS_MESSAGE)
- printk(KERN_INFO "EC: DC bias calculated: %d V\n", ec->dc_estimate >> 15);
-#endif
- kfree(ec);
+ printk(KERN_INFO "EC: DC bias calculated: %d V\n", pvt->dc_estimate >> 15);
+#endif
+ kfree(pvt);
}
#ifdef DC_NORMALIZE
@@ -365,7 +386,7 @@
}
#endif
-static inline short sample_update(struct echo_can_state *ec, short iref, short isig)
+static inline short sample_update(struct ec_pvt *pvt, short iref, short isig)
{
/* Declare local variables that are used more than once */
/* ... */
@@ -380,7 +401,7 @@
int two_beta_i;
#ifdef DC_NORMALIZE
- isig = dc_removal(&ec->dc_estimate, isig);
+ isig = dc_removal(&pvt->dc_estimate, isig);
#endif
/* flow A on pg. 428 */
@@ -398,29 +419,29 @@
/* Update the Far-end receive signal circular buffers and accumulators */
/* ------------------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->y_tilde_i -= abs(get_cc_s(&ec->y_s, (1 << DEFAULT_ALPHA_YT_I) - 1 )) >> DEFAULT_ALPHA_YT_I;
+ pvt->y_tilde_i -= abs(get_cc_s(&pvt->y_s, (1 << DEFAULT_ALPHA_YT_I) - 1 )) >> DEFAULT_ALPHA_YT_I;
/* Add the new sample to the power estimate accumulator */
- ec->y_tilde_i += abs(iref) >> DEFAULT_ALPHA_ST_I;
+ pvt->y_tilde_i += abs(iref) >> DEFAULT_ALPHA_ST_I;
/* Push a copy of the new sample into its circular buffer */
- add_cc_s(&ec->y_s, iref);
+ add_cc_s(&pvt->y_s, iref);
/* eq. (2): compute r in fixed-point */
- rs = CONVOLVE2(ec->a_s,
- ec->y_s.buf_d + ec->y_s.idx_d,
- ec->N_d);
+ rs = CONVOLVE2(pvt->a_s,
+ pvt->y_s.buf_d + pvt->y_s.idx_d,
+ pvt->N_d);
rs >>= 15;
- if (ec->lastsig == isig) {
- ec->lastcount++;
+ if (pvt->lastsig == isig) {
+ pvt->lastcount++;
} else {
- ec->lastcount = 0;
- ec->lastsig = isig;
+ pvt->lastcount = 0;
+ pvt->lastsig = isig;
}
if (isig == 0) {
u = 0;
- } else if (ec->lastcount > 255) {
+ } else if (pvt->lastcount > 255) {
/* We have seen the same input-signal more than 255 times,
* we should pass it through uncancelled, as we are likely on hold */
u = isig;
@@ -429,11 +450,11 @@
if (rs < -32768) {
rs = -32768;
- ec->HCNTR_d = DEFAULT_HANGT;
+ pvt->HCNTR_d = DEFAULT_HANGT;
RESTORE_COEFFS;
} else if (rs > 32767) {
rs = 32767;
- ec->HCNTR_d = DEFAULT_HANGT;
+ pvt->HCNTR_d = DEFAULT_HANGT;
RESTORE_COEFFS;
}
@@ -456,35 +477,35 @@
}
/* Push a copy of the output value sample into its circular buffer */
- add_cc_s(&ec->u_s, u);
-
- if (!ec->backup) {
+ add_cc_s(&pvt->u_s, u);
+
+ if (!pvt->backup) {
/* Backup coefficients periodically */
- ec->backup = BACKUP;
- memcpy(ec->c_i,ec->b_i,ec->N_d*sizeof(int));
- memcpy(ec->b_i,ec->a_i,ec->N_d*sizeof(int));
+ pvt->backup = BACKUP;
+ memcpy(pvt->c_i,pvt->b_i,pvt->N_d*sizeof(int));
+ memcpy(pvt->b_i,pvt->a_i,pvt->N_d*sizeof(int));
} else
- ec->backup--;
+ pvt->backup--;
/* Update the Near-end hybrid signal circular buffers and accumulators */
/* ------------------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->s_tilde_i -= abs(get_cc_s(&ec->s_s, (1 << DEFAULT_ALPHA_ST_I) - 1 ));
+ pvt->s_tilde_i -= abs(get_cc_s(&pvt->s_s, (1 << DEFAULT_ALPHA_ST_I) - 1 ));
/* Add the new sample to the power estimate accumulator */
- ec->s_tilde_i += abs(isig);
+ pvt->s_tilde_i += abs(isig);
/* Push a copy of the new sample into it's circular buffer */
- add_cc_s(&ec->s_s, isig);
+ add_cc_s(&pvt->s_s, isig);
/* Push a copy of the current short-time average of the far-end receive signal into it's circular buffer */
- add_cc_s(&ec->y_tilde_s, ec->y_tilde_i);
+ add_cc_s(&pvt->y_tilde_s, pvt->y_tilde_i);
/* flow B on pg. 428 */
/* If the hangover timer isn't running then compute the new convergence factor, otherwise set Py_i to 32768 */
- if (!ec->HCNTR_d) {
- Py_i = (ec->Ly_i >> DEFAULT_SIGMA_LY_I) * (ec->Ly_i >> DEFAULT_SIGMA_LY_I);
+ if (!pvt->HCNTR_d) {
+ Py_i = (pvt->Ly_i >> DEFAULT_SIGMA_LY_I) * (pvt->Ly_i >> DEFAULT_SIGMA_LY_I);
Py_i >>= 15;
} else {
Py_i = (1 << 15);
@@ -498,139 +519,139 @@
* Still needs conversion!
*/
- if (ec->start_speech_d != 0 ){
- if ( ec->i_d > (DEFAULT_T0 + ec->start_speech_d)*(SAMPLE_FREQ) ){
- ec->beta2_d = max_cc_float(MIN_BETA, DEFAULT_BETA1 * exp((-1/DEFAULT_TAU)*((ec->i_d/(float)SAMPLE_FREQ) - DEFAULT_T0 - ec->start_speech_d)));
+ if (pvt->start_speech_d != 0 ){
+ if ( pvt->i_d > (DEFAULT_T0 + pvt->start_speech_d)*(SAMPLE_FREQ) ){
+ pvt->beta2_d = max_cc_float(MIN_BETA, DEFAULT_BETA1 * exp((-1/DEFAULT_TAU)*((pvt->i_d/(float)SAMPLE_FREQ) - DEFAULT_T0 - pvt->start_speech_d)));
}
} else {
- ec->beta2_d = DEFAULT_BETA1;
+ pvt->beta2_d = DEFAULT_BETA1;
}
#endif
/* Fixed point, inverted */
- ec->beta2_i = DEFAULT_BETA1_I;
+ pvt->beta2_i = DEFAULT_BETA1_I;
/* Fixed point version, inverted */
- two_beta_i = (ec->beta2_i * Py_i) >> 15;
+ two_beta_i = (pvt->beta2_i * Py_i) >> 15;
if (!two_beta_i)
two_beta_i++;
/* Update the Suppressed signal power estimate accumulator */
/* ------------------------------------------------------- */
/* Delete the oldest sample from the power estimate accumulator */
- ec->Lu_i -= abs(get_cc_s(&ec->u_s, (1 << DEFAULT_SIGMA_LU_I) - 1 )) ;
+ pvt->Lu_i -= abs(get_cc_s(&pvt->u_s, (1 << DEFAULT_SIGMA_LU_I) - 1 )) ;
/* Add the new sample to the power estimate accumulator */
- ec->Lu_i += abs(u);
+ pvt->Lu_i += abs(u);
/* Update the Far-end reference signal power estimate accumulator */
/* -------------------------------------------------------------- */
/* eq. (10): update power estimate of the reference */
/* Delete the oldest sample from the power estimate accumulator */
- ec->Ly_i -= abs(get_cc_s(&ec->y_s, (1 << DEFAULT_SIGMA_LY_I) - 1)) ;
+ pvt->Ly_i -= abs(get_cc_s(&pvt->y_s, (1 << DEFAULT_SIGMA_LY_I) - 1)) ;
/* Add the new sample to the power estimate accumulator */
- ec->Ly_i += abs(iref);
-
- if (ec->Ly_i < DEFAULT_CUTOFF_I)
- ec->Ly_i = DEFAULT_CUTOFF_I;
+ pvt->Ly_i += abs(iref);
+
+ if (pvt->Ly_i < DEFAULT_CUTOFF_I)
+ pvt->Ly_i = DEFAULT_CUTOFF_I;
/* Update the Peak far-end receive signal detected */
/* ----------------------------------------------- */
- if (ec->y_tilde_i > ec->max_y_tilde) {
+ if (pvt->y_tilde_i > pvt->max_y_tilde) {
/* New highest y_tilde with full life */
- ec->max_y_tilde = ec->y_tilde_i;
- ec->max_y_tilde_pos = ec->N_d - 1;
- } else if (--ec->max_y_tilde_pos < 0) {
+ pvt->max_y_tilde = pvt->y_tilde_i;
+ pvt->max_y_tilde_pos = pvt->N_d - 1;
+ } else if (--pvt->max_y_tilde_pos < 0) {
/* Time to find new max y tilde... */
- ec->max_y_tilde = MAX16(ec->y_tilde_s.buf_d + ec->y_tilde_s.idx_d, ec->N_d, &ec->max_y_tilde_pos);
+ pvt->max_y_tilde = MAX16(pvt->y_tilde_s.buf_d + pvt->y_tilde_s.idx_d, pvt->N_d, &pvt->max_y_tilde_pos);
}
/* Determine if near end speech was detected in this sample */
/* -------------------------------------------------------- */
- if (((ec->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)) > ec->max_y_tilde)
- && (ec->max_y_tilde > 0)) {
+ if (((pvt->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)) > pvt->max_y_tilde)
+ && (pvt->max_y_tilde > 0)) {
/* Then start the Hangover counter */
- ec->HCNTR_d = DEFAULT_HANGT;
+ pvt->HCNTR_d = DEFAULT_HANGT;
RESTORE_COEFFS;
#ifdef MEC2_STATS_DETAILED
- printk(KERN_INFO "Reset near end speech timer with: s_tilde_i %d, stmnt %d, max_y_tilde %d\n", ec->s_tilde_i, (ec->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)), ec->max_y_tilde);
-#endif
-#ifdef MEC2_STATS
- ++ec->cntr_nearend_speech_frames;
-#endif
- } else if (ec->HCNTR_d > (int)0) {
+ printk(KERN_INFO "Reset near end speech timer with: s_tilde_i %d, stmnt %d, max_y_tilde %d\n", pvt->s_tilde_i, (pvt->s_tilde_i >> (DEFAULT_ALPHA_ST_I - 1)), pvt->max_y_tilde);
+#endif
+#ifdef MEC2_STATS
+ ++pvt->cntr_nearend_speech_frames;
+#endif
+ } else if (pvt->HCNTR_d > (int)0) {
/* otherwise, if it's still non-zero, decrement the Hangover counter by one sample */
#ifdef MEC2_STATS
- ++ec->cntr_nearend_speech_frames;
-#endif
- ec->HCNTR_d--;
+ ++pvt->cntr_nearend_speech_frames;
+#endif
+ pvt->HCNTR_d--;
}
/* Update coefficients if no near-end speech in this sample (ie. HCNTR_d = 0)
* and we have enough signal to bother trying to update.
* --------------------------------------------------------------------------
*/
- if (!ec->HCNTR_d && /* no near-end speech present */
- !(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 */
+ if (!pvt->HCNTR_d && /* no near-end speech present */
+ !(pvt->i_d % DEFAULT_M)) { /* we only update on every DEFAULM_M'th sample from the stream */
+ if (pvt->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 USED_COEFFS
- int max_coeffs[USED_COEFFS];
- int *pos;
-
- if (ec->N_d > USED_COEFFS)
- memset(max_coeffs, 0, USED_COEFFS*sizeof(int));
+ int max_coeffs[USED_COEFFS];
+ int *pos;
+
+ if (pvt->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);
-#endif
-#ifdef MEC2_STATS
- ec->avg_Lu_i_ok = ec->avg_Lu_i_ok + ec->Lu_i;
- ++ec->cntr_coeff_updates;
-#endif
- for (k=0; k < ec->N_d; k++) {
- /* eq. (7): compute an expectation over M_d samples */
- int grad2;
- grad2 = CONVOLVE2(ec->u_s.buf_d + ec->u_s.idx_d,
- ec->y_s.buf_d + ec->y_s.idx_d + k,
- DEFAULT_M);
- /* eq. (7): update the coefficient */
- ec->a_i[k] += grad2 / two_beta_i;
- ec->a_s[k] = ec->a_i[k] >> 16;
+ printk(KERN_INFO "updating coefficients with: pvt->Lu_i %9d\n", pvt->Lu_i);
+#endif
+#ifdef MEC2_STATS
+ pvt->avg_Lu_i_ok = pvt->avg_Lu_i_ok + pvt->Lu_i;
+ ++pvt->cntr_coeff_updates;
+#endif
+ for (k=0; k < pvt->N_d; k++) {
+ /* eq. (7): compute an expectation over M_d samples */
+ int grad2;
+ grad2 = CONVOLVE2(pvt->u_s.buf_d + pvt->u_s.idx_d,
+ pvt->y_s.buf_d + pvt->y_s.idx_d + k,
+ DEFAULT_M);
+ /* eq. (7): update the coefficient */
+ pvt->a_i[k] += grad2 / two_beta_i;
+ pvt->a_s[k] = pvt->a_i[k] >> 16;
#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));
-
[... 1132 lines stripped ...]
More information about the dahdi-commits
mailing list