root/drivers/isdn/mISDN/dsp_ecdis.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. echo_can_disable_detector_init
  2. echo_can_disable_detector_update

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * SpanDSP - a series of DSP components for telephony
   4  *
   5  * ec_disable_detector.h - A detector which should eventually meet the
   6  *                         G.164/G.165 requirements for detecting the
   7  *                         2100Hz echo cancellor disable tone.
   8  *
   9  * Written by Steve Underwood <steveu@coppice.org>
  10  *
  11  * Copyright (C) 2001 Steve Underwood
  12  *
  13  * All rights reserved.
  14  */
  15 
  16 #include "dsp_biquad.h"
  17 
  18 struct ec_disable_detector_state {
  19         struct biquad2_state notch;
  20         int notch_level;
  21         int channel_level;
  22         int tone_present;
  23         int tone_cycle_duration;
  24         int good_cycles;
  25         int hit;
  26 };
  27 
  28 
  29 #define FALSE 0
  30 #define TRUE (!FALSE)
  31 
  32 static inline void
  33 echo_can_disable_detector_init(struct ec_disable_detector_state *det)
  34 {
  35         /* Elliptic notch */
  36         /* This is actually centred at 2095Hz, but gets the balance we want, due
  37            to the asymmetric walls of the notch */
  38         biquad2_init(&det->notch,
  39                      (int32_t)(-0.7600000 * 32768.0),
  40                      (int32_t)(-0.1183852 * 32768.0),
  41                      (int32_t)(-0.5104039 * 32768.0),
  42                      (int32_t)(0.1567596 * 32768.0),
  43                      (int32_t)(1.0000000 * 32768.0));
  44 
  45         det->channel_level = 0;
  46         det->notch_level = 0;
  47         det->tone_present = FALSE;
  48         det->tone_cycle_duration = 0;
  49         det->good_cycles = 0;
  50         det->hit = 0;
  51 }
  52 /*- End of function --------------------------------------------------------*/
  53 
  54 static inline int
  55 echo_can_disable_detector_update(struct ec_disable_detector_state *det,
  56                                  int16_t amp)
  57 {
  58         int16_t notched;
  59 
  60         notched = biquad2(&det->notch, amp);
  61         /* Estimate the overall energy in the channel, and the energy in
  62            the notch (i.e. overall channel energy - tone energy => noise).
  63            Use abs instead of multiply for speed (is it really faster?).
  64            Damp the overall energy a little more for a stable result.
  65            Damp the notch energy a little less, so we don't damp out the
  66            blip every time the phase reverses */
  67         det->channel_level += ((abs(amp) - det->channel_level) >> 5);
  68         det->notch_level += ((abs(notched) - det->notch_level) >> 4);
  69         if (det->channel_level > 280) {
  70                 /* There is adequate energy in the channel.
  71                    Is it mostly at 2100Hz? */
  72                 if (det->notch_level * 6 < det->channel_level) {
  73                         /* The notch says yes, so we have the tone. */
  74                         if (!det->tone_present) {
  75                                 /* Do we get a kick every 450+-25ms? */
  76                                 if (det->tone_cycle_duration >= 425 * 8
  77                                     && det->tone_cycle_duration <= 475 * 8) {
  78                                         det->good_cycles++;
  79                                         if (det->good_cycles > 2)
  80                                                 det->hit = TRUE;
  81                                 }
  82                                 det->tone_cycle_duration = 0;
  83                         }
  84                         det->tone_present = TRUE;
  85                 } else
  86                         det->tone_present = FALSE;
  87                 det->tone_cycle_duration++;
  88         } else {
  89                 det->tone_present = FALSE;
  90                 det->tone_cycle_duration = 0;
  91                 det->good_cycles = 0;
  92         }
  93         return det->hit;
  94 }
  95 /*- End of function --------------------------------------------------------*/
  96 /*- End of file ------------------------------------------------------------*/

/* [<][>][^][v][top][bottom][index][help] */