summaryrefslogtreecommitdiff
path: root/main/dsp.c
diff options
context:
space:
mode:
authorKevin P. Fleming <kpfleming@digium.com>2011-12-28 18:59:16 +0000
committerKevin P. Fleming <kpfleming@digium.com>2011-12-28 18:59:16 +0000
commitfdda4947767a5c0ee2424532ff5f01250797175d (patch)
tree1f46d156caa5b18f979c2cccb8d222659009236e /main/dsp.c
parentd9651f2be9e5f19d5a5408eb818df7202af3bf1d (diff)
Improve T.38 gateway V.21 preamble detection.
This commit removes the V.21 preamble detection code previously added to the generic DSP implementation in Asterisk, and instead enhances the res_fax module to be able to utilize V.21 preamble detection functionality made available by FAX technology modules. This commit also adds such support to res_fax_spandsp, which uses the Spandsp modem tone detection code to do the V.21 preamble detection. There should be no functional change here, other than much more reliable V.21 preamble detection (and thus T.38 gateway initiation). ........ Merged revisions 349248 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@349249 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/dsp.c')
-rw-r--r--main/dsp.c148
1 files changed, 0 insertions, 148 deletions
diff --git a/main/dsp.c b/main/dsp.c
index 91eea6c9d..0f8955314 100644
--- a/main/dsp.c
+++ b/main/dsp.c
@@ -246,20 +246,6 @@ typedef struct
typedef struct
{
- int block_size;
- goertzel_state_t tone;
- float energy; /* Accumulated energy of the current block */
- int samples_pending; /* Samples remain to complete the current block */
-
- float threshold; /* Energy of the tone relative to energy from all other signals to consider a hit */
-
- int hit_count;
- int miss_count;
-
-} v21_detect_state_t;
-
-typedef struct
-{
goertzel_state_t row_out[4];
goertzel_state_t col_out[4];
int hits_to_begin; /* How many successive hits needed to consider begin of a digit */
@@ -405,7 +391,6 @@ struct ast_dsp {
digit_detect_state_t digit_state;
tone_detect_state_t cng_tone_state;
tone_detect_state_t ced_tone_state;
- v21_detect_state_t v21_state;
};
static void mute_fragment(struct ast_dsp *dsp, fragment_t *fragment)
@@ -479,56 +464,10 @@ static void ast_tone_detect_init(tone_detect_state_t *s, int freq, int duration,
ast_debug(1, "Setup tone %d Hz, %d ms, block_size=%d, hits_required=%d\n", freq, duration, s->block_size, s->hits_required);
}
-static void ast_v21_detect_init(v21_detect_state_t *s, unsigned int sample_rate)
-{
- float x;
- int periods_in_block;
-
- /* If we want to remove tone, it is important to have block size not
- to exceed frame size. Otherwise by the moment tone is detected it is too late
- to squelch it from previous frames. Block size is 20ms at the given sample rate.*/
- s->block_size = (20 * sample_rate) / 1000;
-
- periods_in_block = s->block_size * 1850 / sample_rate;
-
- /* Make sure we will have at least 5 periods at target frequency for analisys.
- This may make block larger than expected packet and will make squelching impossible
- but at least we will be detecting the tone */
- if (periods_in_block < 5) {
- periods_in_block = 5;
- }
-
- /* Now calculate final block size. It will contain integer number of periods */
- s->block_size = periods_in_block * sample_rate / 1850;
-
- goertzel_init(&s->tone, 1850.0, s->block_size, sample_rate);
-
- s->samples_pending = s->block_size;
- s->hit_count = 0;
- s->miss_count = 0;
- s->energy = 0.0;
-
- /* We want tone energy to be amp decibels above the rest of the signal (the noise).
- According to Parseval's theorem the energy computed in time domain equals to energy
- computed in frequency domain. So subtracting energy in the frequency domain (Goertzel result)
- from the energy in the time domain we will get energy of the remaining signal (without the tone
- we are detecting). We will be checking that
- 10*log(Ew / (Et - Ew)) > amp
- Calculate threshold so that we will be actually checking
- Ew > Et * threshold
- */
-
- x = pow(10.0, 16 / 10.0);
- s->threshold = x / (x + 1);
-
- ast_debug(1, "Setup v21 detector, block_size=%d\n", s->block_size);
-}
-
static void ast_fax_detect_init(struct ast_dsp *s)
{
ast_tone_detect_init(&s->cng_tone_state, FAX_TONE_CNG_FREQ, FAX_TONE_CNG_DURATION, FAX_TONE_CNG_DB, s->sample_rate);
ast_tone_detect_init(&s->ced_tone_state, FAX_TONE_CED_FREQ, FAX_TONE_CED_DURATION, FAX_TONE_CED_DB, s->sample_rate);
- ast_v21_detect_init(&s->v21_state, s->sample_rate);
if (s->faxmode & DSP_FAXMODE_DETECT_SQUELCH) {
s->cng_tone_state.squelch = 1;
s->ced_tone_state.squelch = 1;
@@ -580,89 +519,6 @@ static void ast_digit_detect_init(digit_detect_state_t *s, int mf, unsigned int
}
}
-/*! \brief Detect a v21 preamble.
- * This code is derived from the tone_detect code and detects a pattern of 1850
- * Hz tone found in a v21 preamble.
- */
-static int v21_detect(struct ast_dsp *dsp, v21_detect_state_t *s, int16_t *amp, int samples)
-{
- float tone_energy;
- int i;
- int hit = 0;
- int limit;
- int res = 0;
- int16_t *ptr;
- int start, end;
-
- for (start = 0; start < samples; start = end) {
- /* Process in blocks. */
- limit = samples - start;
- if (limit > s->samples_pending) {
- limit = s->samples_pending;
- }
- end = start + limit;
-
- for (i = limit, ptr = amp ; i > 0; i--, ptr++) {
- /* signed 32 bit int should be enough to suqare any possible signed 16 bit value */
- s->energy += (int32_t) *ptr * (int32_t) *ptr;
-
- goertzel_sample(&s->tone, *ptr);
- }
-
- s->samples_pending -= limit;
-
- if (s->samples_pending) {
- /* Finished incomplete (last) block */
- break;
- }
-
- tone_energy = goertzel_result(&s->tone);
-
- /* Scale to make comparable */
- tone_energy *= 2.0;
- s->energy *= s->block_size;
-
- ast_debug(10, "v21 1850 Ew=%.2E, Et=%.2E, s/n=%10.2f\n", tone_energy, s->energy, tone_energy / (s->energy - tone_energy));
-
- hit = 0;
- if (tone_energy > s->energy * s->threshold) {
- ast_debug(10, "Hit! count=%d; miss_count=%d\n", s->hit_count, s->miss_count);
- hit = 1;
- }
-
- if (hit) {
- if (s->miss_count == 3 || (s->hit_count == 1 && s->miss_count == 2)) {
- s->hit_count++;
- } else {
- s->hit_count = 1;
- }
-
- s->miss_count = 0;
- } else {
- s->miss_count++;
- if (s->miss_count > 3) {
- s->hit_count = 0;
- }
- }
-
- if (s->hit_count == 4) {
- ast_debug(1, "v21 preamble detected\n");
- res = 1;
- }
-
- /* Reinitialise the detector for the next block */
- goertzel_reset(&s->tone);
-
- /* Advance to the next block */
- s->energy = 0.0;
- s->samples_pending = s->block_size;
-
- amp += limit;
- }
-
- return res;
-}
-
static int tone_detect(struct ast_dsp *dsp, tone_detect_state_t *s, int16_t *amp, int samples)
{
float tone_energy;
@@ -1599,10 +1455,6 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if ((dsp->faxmode & DSP_FAXMODE_DETECT_CED) && tone_detect(dsp, &dsp->ced_tone_state, shortdata, len)) {
fax_digit = 'e';
}
-
- if ((dsp->faxmode & DSP_FAXMODE_DETECT_V21) && v21_detect(dsp, &dsp->v21_state, shortdata, len)) {
- fax_digit = 'g';
- }
}
if (dsp->features & (DSP_FEATURE_DIGIT_DETECT | DSP_FEATURE_BUSY_DETECT)) {