Lines Matching refs:ec
119 static inline void lms_adapt_bg(struct oslec_state *ec, int clean, int shift) in lms_adapt_bg() argument
136 offset2 = ec->curr_pos; in lms_adapt_bg()
137 offset1 = ec->taps - offset2; in lms_adapt_bg()
138 phist = &ec->fir_state_bg.history[offset2]; in lms_adapt_bg()
143 n = ec->taps; in lms_adapt_bg()
146 ec->fir_taps16[1][i] += (int16_t) ((exp + (1 << 14)) >> 15); in lms_adapt_bg()
190 static inline void lms_adapt_bg(struct oslec_state *ec, int clean, int shift) in lms_adapt_bg() argument
206 offset2 = ec->curr_pos; in lms_adapt_bg()
207 offset1 = ec->taps - offset2; in lms_adapt_bg()
209 for (i = ec->taps - 1; i >= offset1; i--) { in lms_adapt_bg()
210 exp = (ec->fir_state_bg.history[i - offset1] * factor); in lms_adapt_bg()
211 ec->fir_taps16[1][i] += (int16_t) ((exp + (1 << 14)) >> 15); in lms_adapt_bg()
214 exp = (ec->fir_state_bg.history[i + offset2] * factor); in lms_adapt_bg()
215 ec->fir_taps16[1][i] += (int16_t) ((exp + (1 << 14)) >> 15); in lms_adapt_bg()
230 struct oslec_state *ec; in oslec_create() local
234 ec = kzalloc(sizeof(*ec), GFP_KERNEL); in oslec_create()
235 if (!ec) in oslec_create()
238 ec->taps = len; in oslec_create()
239 ec->log2taps = top_bit(len); in oslec_create()
240 ec->curr_pos = ec->taps - 1; in oslec_create()
242 ec->fir_taps16[0] = in oslec_create()
243 kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
244 if (!ec->fir_taps16[0]) in oslec_create()
247 ec->fir_taps16[1] = in oslec_create()
248 kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
249 if (!ec->fir_taps16[1]) in oslec_create()
252 history = fir16_create(&ec->fir_state, ec->fir_taps16[0], ec->taps); in oslec_create()
255 history = fir16_create(&ec->fir_state_bg, ec->fir_taps16[1], ec->taps); in oslec_create()
260 ec->xvtx[i] = ec->yvtx[i] = ec->xvrx[i] = ec->yvrx[i] = 0; in oslec_create()
262 ec->cng_level = 1000; in oslec_create()
263 oslec_adaption_mode(ec, adaption_mode); in oslec_create()
265 ec->snapshot = kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); in oslec_create()
266 if (!ec->snapshot) in oslec_create()
269 ec->cond_met = 0; in oslec_create()
270 ec->pstates = 0; in oslec_create()
271 ec->ltxacc = ec->lrxacc = ec->lcleanacc = ec->lclean_bgacc = 0; in oslec_create()
272 ec->ltx = ec->lrx = ec->lclean = ec->lclean_bg = 0; in oslec_create()
273 ec->tx_1 = ec->tx_2 = ec->rx_1 = ec->rx_2 = 0; in oslec_create()
274 ec->lbgn = ec->lbgn_acc = 0; in oslec_create()
275 ec->lbgn_upper = 200; in oslec_create()
276 ec->lbgn_upper_acc = ec->lbgn_upper << 13; in oslec_create()
278 return ec; in oslec_create()
281 fir16_free(&ec->fir_state_bg); in oslec_create()
283 fir16_free(&ec->fir_state); in oslec_create()
285 kfree(ec->fir_taps16[1]); in oslec_create()
287 kfree(ec->fir_taps16[0]); in oslec_create()
289 kfree(ec); in oslec_create()
294 void oslec_free(struct oslec_state *ec) in oslec_free() argument
298 fir16_free(&ec->fir_state); in oslec_free()
299 fir16_free(&ec->fir_state_bg); in oslec_free()
301 kfree(ec->fir_taps16[i]); in oslec_free()
302 kfree(ec->snapshot); in oslec_free()
303 kfree(ec); in oslec_free()
307 void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode) in oslec_adaption_mode() argument
309 ec->adaption_mode = adaption_mode; in oslec_adaption_mode()
313 void oslec_flush(struct oslec_state *ec) in oslec_flush() argument
317 ec->ltxacc = ec->lrxacc = ec->lcleanacc = ec->lclean_bgacc = 0; in oslec_flush()
318 ec->ltx = ec->lrx = ec->lclean = ec->lclean_bg = 0; in oslec_flush()
319 ec->tx_1 = ec->tx_2 = ec->rx_1 = ec->rx_2 = 0; in oslec_flush()
321 ec->lbgn = ec->lbgn_acc = 0; in oslec_flush()
322 ec->lbgn_upper = 200; in oslec_flush()
323 ec->lbgn_upper_acc = ec->lbgn_upper << 13; in oslec_flush()
325 ec->nonupdate_dwell = 0; in oslec_flush()
327 fir16_flush(&ec->fir_state); in oslec_flush()
328 fir16_flush(&ec->fir_state_bg); in oslec_flush()
329 ec->fir_state.curr_pos = ec->taps - 1; in oslec_flush()
330 ec->fir_state_bg.curr_pos = ec->taps - 1; in oslec_flush()
332 memset(ec->fir_taps16[i], 0, ec->taps * sizeof(int16_t)); in oslec_flush()
334 ec->curr_pos = ec->taps - 1; in oslec_flush()
335 ec->pstates = 0; in oslec_flush()
339 void oslec_snapshot(struct oslec_state *ec) in oslec_snapshot() argument
341 memcpy(ec->snapshot, ec->fir_taps16[0], ec->taps * sizeof(int16_t)); in oslec_snapshot()
347 int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx) in oslec_update() argument
360 ec->tx = tx; in oslec_update()
361 ec->rx = rx; in oslec_update()
380 if (ec->adaption_mode & ECHO_CAN_USE_RX_HPF) { in oslec_update()
393 ec->rx_1 += -(ec->rx_1 >> DC_LOG2BETA) + tmp - ec->rx_2; in oslec_update()
400 tmp1 = ec->rx_1 >> 15; in oslec_update()
406 ec->rx_2 = tmp; in oslec_update()
419 old = (int)ec->fir_state.history[ec->fir_state.curr_pos] * in oslec_update()
420 (int)ec->fir_state.history[ec->fir_state.curr_pos]; in oslec_update()
421 ec->pstates += in oslec_update()
422 ((new - old) + (1 << (ec->log2taps - 1))) >> ec->log2taps; in oslec_update()
423 if (ec->pstates < 0) in oslec_update()
424 ec->pstates = 0; in oslec_update()
429 ec->ltxacc += abs(tx) - ec->ltx; in oslec_update()
430 ec->ltx = (ec->ltxacc + (1 << 4)) >> 5; in oslec_update()
431 ec->lrxacc += abs(rx) - ec->lrx; in oslec_update()
432 ec->lrx = (ec->lrxacc + (1 << 4)) >> 5; in oslec_update()
436 ec->fir_state.coeffs = ec->fir_taps16[0]; in oslec_update()
437 echo_value = fir16(&ec->fir_state, tx); in oslec_update()
438 ec->clean = rx - echo_value; in oslec_update()
439 ec->lcleanacc += abs(ec->clean) - ec->lclean; in oslec_update()
440 ec->lclean = (ec->lcleanacc + (1 << 4)) >> 5; in oslec_update()
444 echo_value = fir16(&ec->fir_state_bg, tx); in oslec_update()
446 ec->lclean_bgacc += abs(clean_bg) - ec->lclean_bg; in oslec_update()
447 ec->lclean_bg = (ec->lclean_bgacc + (1 << 4)) >> 5; in oslec_update()
455 ec->factor = 0; in oslec_update()
456 ec->shift = 0; in oslec_update()
457 if ((ec->nonupdate_dwell == 0)) { in oslec_update()
493 p = MIN_TX_POWER_FOR_ADAPTION + ec->pstates; in oslec_update()
494 logp = top_bit(p) + ec->log2taps; in oslec_update()
496 ec->shift = shift; in oslec_update()
498 lms_adapt_bg(ec, clean_bg, shift); in oslec_update()
504 ec->adapt = 0; in oslec_update()
505 if ((ec->lrx > MIN_RX_POWER_FOR_ADAPTION) && (ec->lrx > ec->ltx)) in oslec_update()
506 ec->nonupdate_dwell = DTD_HANGOVER; in oslec_update()
507 if (ec->nonupdate_dwell) in oslec_update()
508 ec->nonupdate_dwell--; in oslec_update()
515 if ((ec->adaption_mode & ECHO_CAN_USE_ADAPTION) && in oslec_update()
516 (ec->nonupdate_dwell == 0) && in oslec_update()
518 (8 * ec->lclean_bg < 7 * ec->lclean) && in oslec_update()
520 (8 * ec->lclean_bg < ec->ltx)) { in oslec_update()
521 if (ec->cond_met == 6) { in oslec_update()
526 ec->adapt = 1; in oslec_update()
527 memcpy(ec->fir_taps16[0], ec->fir_taps16[1], in oslec_update()
528 ec->taps * sizeof(int16_t)); in oslec_update()
530 ec->cond_met++; in oslec_update()
532 ec->cond_met = 0; in oslec_update()
536 ec->clean_nlp = ec->clean; in oslec_update()
537 if (ec->adaption_mode & ECHO_CAN_USE_NLP) { in oslec_update()
544 if ((16 * ec->lclean < ec->ltx)) { in oslec_update()
550 if (ec->adaption_mode & ECHO_CAN_USE_CNG) { in oslec_update()
551 ec->cng_level = ec->lbgn; in oslec_update()
564 ec->cng_rndnum = in oslec_update()
565 1664525U * ec->cng_rndnum + 1013904223U; in oslec_update()
566 ec->cng_filter = in oslec_update()
567 ((ec->cng_rndnum & 0xFFFF) - 32768 + in oslec_update()
568 5 * ec->cng_filter) >> 3; in oslec_update()
569 ec->clean_nlp = in oslec_update()
570 (ec->cng_filter * ec->cng_level * 8) >> 14; in oslec_update()
572 } else if (ec->adaption_mode & ECHO_CAN_USE_CLIP) { in oslec_update()
574 if (ec->clean_nlp > ec->lbgn) in oslec_update()
575 ec->clean_nlp = ec->lbgn; in oslec_update()
576 if (ec->clean_nlp < -ec->lbgn) in oslec_update()
577 ec->clean_nlp = -ec->lbgn; in oslec_update()
583 ec->clean_nlp = 0; in oslec_update()
596 if (ec->lclean < 40) { in oslec_update()
597 ec->lbgn_acc += abs(ec->clean) - ec->lbgn; in oslec_update()
598 ec->lbgn = (ec->lbgn_acc + (1 << 11)) >> 12; in oslec_update()
604 if (ec->curr_pos <= 0) in oslec_update()
605 ec->curr_pos = ec->taps; in oslec_update()
606 ec->curr_pos--; in oslec_update()
608 if (ec->adaption_mode & ECHO_CAN_DISABLE) in oslec_update()
609 ec->clean_nlp = rx; in oslec_update()
613 return (int16_t) ec->clean_nlp << 1; in oslec_update()
639 int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx) in oslec_hpf_tx() argument
644 if (ec->adaption_mode & ECHO_CAN_USE_TX_HPF) { in oslec_hpf_tx()
657 ec->tx_1 += -(ec->tx_1 >> DC_LOG2BETA) + tmp - ec->tx_2; in oslec_hpf_tx()
658 tmp1 = ec->tx_1 >> 15; in oslec_hpf_tx()
664 ec->tx_2 = tmp; in oslec_hpf_tx()