Lines Matching full:ec
118 static inline void lms_adapt_bg(struct oslec_state *ec, int clean, int shift) in lms_adapt_bg() argument
134 offset2 = ec->curr_pos; in lms_adapt_bg()
135 offset1 = ec->taps - offset2; in lms_adapt_bg()
137 for (i = ec->taps - 1; i >= offset1; i--) { in lms_adapt_bg()
138 exp = (ec->fir_state_bg.history[i - offset1] * factor); in lms_adapt_bg()
139 ec->fir_taps16[1][i] += (int16_t) ((exp + (1 << 14)) >> 15); in lms_adapt_bg()
142 exp = (ec->fir_state_bg.history[i + offset2] * factor); in lms_adapt_bg()
143 ec->fir_taps16[1][i] += (int16_t) ((exp + (1 << 14)) >> 15); in lms_adapt_bg()
157 struct oslec_state *ec; in oslec_create() local
161 ec = kzalloc(sizeof(*ec), GFP_KERNEL); in oslec_create()
162 if (!ec) in oslec_create()
165 ec->taps = len; in oslec_create()
166 ec->log2taps = top_bit(len); in oslec_create()
167 ec->curr_pos = ec->taps - 1; in oslec_create()
169 ec->fir_taps16[0] = in oslec_create()
170 kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
171 if (!ec->fir_taps16[0]) in oslec_create()
174 ec->fir_taps16[1] = in oslec_create()
175 kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
176 if (!ec->fir_taps16[1]) in oslec_create()
179 history = fir16_create(&ec->fir_state, ec->fir_taps16[0], ec->taps); in oslec_create()
182 history = fir16_create(&ec->fir_state_bg, ec->fir_taps16[1], ec->taps); in oslec_create()
187 ec->xvtx[i] = ec->yvtx[i] = ec->xvrx[i] = ec->yvrx[i] = 0; in oslec_create()
189 ec->cng_level = 1000; in oslec_create()
190 oslec_adaption_mode(ec, adaption_mode); in oslec_create()
192 ec->snapshot = kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
193 if (!ec->snapshot) in oslec_create()
196 ec->cond_met = 0; in oslec_create()
197 ec->pstates = 0; in oslec_create()
198 ec->ltxacc = ec->lrxacc = ec->lcleanacc = ec->lclean_bgacc = 0; in oslec_create()
199 ec->ltx = ec->lrx = ec->lclean = ec->lclean_bg = 0; in oslec_create()
200 ec->tx_1 = ec->tx_2 = ec->rx_1 = ec->rx_2 = 0; in oslec_create()
201 ec->lbgn = ec->lbgn_acc = 0; in oslec_create()
202 ec->lbgn_upper = 200; in oslec_create()
203 ec->lbgn_upper_acc = ec->lbgn_upper << 13; in oslec_create()
205 return ec; in oslec_create()
208 fir16_free(&ec->fir_state_bg); in oslec_create()
210 fir16_free(&ec->fir_state); in oslec_create()
212 kfree(ec->fir_taps16[1]); in oslec_create()
214 kfree(ec->fir_taps16[0]); in oslec_create()
216 kfree(ec); in oslec_create()
221 void oslec_free(struct oslec_state *ec) in oslec_free() argument
225 fir16_free(&ec->fir_state); in oslec_free()
226 fir16_free(&ec->fir_state_bg); in oslec_free()
228 kfree(ec->fir_taps16[i]); in oslec_free()
229 kfree(ec->snapshot); in oslec_free()
230 kfree(ec); in oslec_free()
234 void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode) in oslec_adaption_mode() argument
236 ec->adaption_mode = adaption_mode; in oslec_adaption_mode()
240 void oslec_flush(struct oslec_state *ec) in oslec_flush() argument
244 ec->ltxacc = ec->lrxacc = ec->lcleanacc = ec->lclean_bgacc = 0; in oslec_flush()
245 ec->ltx = ec->lrx = ec->lclean = ec->lclean_bg = 0; in oslec_flush()
246 ec->tx_1 = ec->tx_2 = ec->rx_1 = ec->rx_2 = 0; in oslec_flush()
248 ec->lbgn = ec->lbgn_acc = 0; in oslec_flush()
249 ec->lbgn_upper = 200; in oslec_flush()
250 ec->lbgn_upper_acc = ec->lbgn_upper << 13; in oslec_flush()
252 ec->nonupdate_dwell = 0; in oslec_flush()
254 fir16_flush(&ec->fir_state); in oslec_flush()
255 fir16_flush(&ec->fir_state_bg); in oslec_flush()
256 ec->fir_state.curr_pos = ec->taps - 1; in oslec_flush()
257 ec->fir_state_bg.curr_pos = ec->taps - 1; in oslec_flush()
259 memset(ec->fir_taps16[i], 0, ec->taps * sizeof(int16_t)); in oslec_flush()
261 ec->curr_pos = ec->taps - 1; in oslec_flush()
262 ec->pstates = 0; in oslec_flush()
266 void oslec_snapshot(struct oslec_state *ec) in oslec_snapshot() argument
268 memcpy(ec->snapshot, ec->fir_taps16[0], ec->taps * sizeof(int16_t)); in oslec_snapshot()
274 int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx) in oslec_update() argument
287 ec->tx = tx; in oslec_update()
288 ec->rx = rx; in oslec_update()
307 if (ec->adaption_mode & ECHO_CAN_USE_RX_HPF) { in oslec_update()
320 ec->rx_1 += -(ec->rx_1 >> DC_LOG2BETA) + tmp - ec->rx_2; in oslec_update()
327 tmp1 = ec->rx_1 >> 15; in oslec_update()
333 ec->rx_2 = tmp; in oslec_update()
346 old = (int)ec->fir_state.history[ec->fir_state.curr_pos] * in oslec_update()
347 (int)ec->fir_state.history[ec->fir_state.curr_pos]; in oslec_update()
348 ec->pstates += in oslec_update()
349 ((new - old) + (1 << (ec->log2taps - 1))) >> ec->log2taps; in oslec_update()
350 if (ec->pstates < 0) in oslec_update()
351 ec->pstates = 0; in oslec_update()
356 ec->ltxacc += abs(tx) - ec->ltx; in oslec_update()
357 ec->ltx = (ec->ltxacc + (1 << 4)) >> 5; in oslec_update()
358 ec->lrxacc += abs(rx) - ec->lrx; in oslec_update()
359 ec->lrx = (ec->lrxacc + (1 << 4)) >> 5; in oslec_update()
363 ec->fir_state.coeffs = ec->fir_taps16[0]; in oslec_update()
364 echo_value = fir16(&ec->fir_state, tx); in oslec_update()
365 ec->clean = rx - echo_value; in oslec_update()
366 ec->lcleanacc += abs(ec->clean) - ec->lclean; in oslec_update()
367 ec->lclean = (ec->lcleanacc + (1 << 4)) >> 5; in oslec_update()
371 echo_value = fir16(&ec->fir_state_bg, tx); in oslec_update()
373 ec->lclean_bgacc += abs(clean_bg) - ec->lclean_bg; in oslec_update()
374 ec->lclean_bg = (ec->lclean_bgacc + (1 << 4)) >> 5; in oslec_update()
382 ec->factor = 0; in oslec_update()
383 ec->shift = 0; in oslec_update()
384 if (!ec->nonupdate_dwell) { in oslec_update()
420 p = MIN_TX_POWER_FOR_ADAPTION + ec->pstates; in oslec_update()
421 logp = top_bit(p) + ec->log2taps; in oslec_update()
423 ec->shift = shift; in oslec_update()
425 lms_adapt_bg(ec, clean_bg, shift); in oslec_update()
431 ec->adapt = 0; in oslec_update()
432 if ((ec->lrx > MIN_RX_POWER_FOR_ADAPTION) && (ec->lrx > ec->ltx)) in oslec_update()
433 ec->nonupdate_dwell = DTD_HANGOVER; in oslec_update()
434 if (ec->nonupdate_dwell) in oslec_update()
435 ec->nonupdate_dwell--; in oslec_update()
442 if ((ec->adaption_mode & ECHO_CAN_USE_ADAPTION) && in oslec_update()
443 (ec->nonupdate_dwell == 0) && in oslec_update()
444 /* (ec->Lclean_bg < 0.875*ec->Lclean) */ in oslec_update()
445 (8 * ec->lclean_bg < 7 * ec->lclean) && in oslec_update()
446 /* (ec->Lclean_bg < 0.125*ec->Ltx) */ in oslec_update()
447 (8 * ec->lclean_bg < ec->ltx)) { in oslec_update()
448 if (ec->cond_met == 6) { in oslec_update()
453 ec->adapt = 1; in oslec_update()
454 memcpy(ec->fir_taps16[0], ec->fir_taps16[1], in oslec_update()
455 ec->taps * sizeof(int16_t)); in oslec_update()
457 ec->cond_met++; in oslec_update()
459 ec->cond_met = 0; in oslec_update()
463 ec->clean_nlp = ec->clean; in oslec_update()
464 if (ec->adaption_mode & ECHO_CAN_USE_NLP) { in oslec_update()
471 if ((16 * ec->lclean < ec->ltx)) { in oslec_update()
477 if (ec->adaption_mode & ECHO_CAN_USE_CNG) { in oslec_update()
478 ec->cng_level = ec->lbgn; in oslec_update()
491 ec->cng_rndnum = in oslec_update()
492 1664525U * ec->cng_rndnum + 1013904223U; in oslec_update()
493 ec->cng_filter = in oslec_update()
494 ((ec->cng_rndnum & 0xFFFF) - 32768 + in oslec_update()
495 5 * ec->cng_filter) >> 3; in oslec_update()
496 ec->clean_nlp = in oslec_update()
497 (ec->cng_filter * ec->cng_level * 8) >> 14; in oslec_update()
499 } else if (ec->adaption_mode & ECHO_CAN_USE_CLIP) { in oslec_update()
501 if (ec->clean_nlp > ec->lbgn) in oslec_update()
502 ec->clean_nlp = ec->lbgn; in oslec_update()
503 if (ec->clean_nlp < -ec->lbgn) in oslec_update()
504 ec->clean_nlp = -ec->lbgn; in oslec_update()
510 ec->clean_nlp = 0; in oslec_update()
523 if (ec->lclean < 40) { in oslec_update()
524 ec->lbgn_acc += abs(ec->clean) - ec->lbgn; in oslec_update()
525 ec->lbgn = (ec->lbgn_acc + (1 << 11)) >> 12; in oslec_update()
531 if (ec->curr_pos <= 0) in oslec_update()
532 ec->curr_pos = ec->taps; in oslec_update()
533 ec->curr_pos--; in oslec_update()
535 if (ec->adaption_mode & ECHO_CAN_DISABLE) in oslec_update()
536 ec->clean_nlp = rx; in oslec_update()
540 return (int16_t) ec->clean_nlp << 1; in oslec_update()
566 int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx) in oslec_hpf_tx() argument
571 if (ec->adaption_mode & ECHO_CAN_USE_TX_HPF) { in oslec_hpf_tx()
584 ec->tx_1 += -(ec->tx_1 >> DC_LOG2BETA) + tmp - ec->tx_2; in oslec_hpf_tx()
585 tmp1 = ec->tx_1 >> 15; in oslec_hpf_tx()
591 ec->tx_2 = tmp; in oslec_hpf_tx()