Remove obsolete OLD_DSP_ROUTINES code. Also, remove the FAX_DETECT define and
only do the calculations if fax detection is enabled on the dsp. (closes issue #11331) Reported by: dimas Patches: dsp.patch uploaded by dimas (license 88) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@89490 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
21981c69ae
commit
3564d92577
1 changed files with 14 additions and 379 deletions
393
main/dsp.c
393
main/dsp.c
|
@ -117,9 +117,6 @@ enum busy_detect {
|
|||
/*! Remember last 15 units */
|
||||
#define DSP_HISTORY 15
|
||||
|
||||
/*! Define if you want the fax detector -- NOT RECOMMENDED IN -STABLE */
|
||||
#define FAX_DETECT
|
||||
|
||||
#define TONE_THRESH 10.0 /*!< How much louder the tone should be than channel energy */
|
||||
#define TONE_MIN_THRESH 1e8 /*!< How much tone there should be at least to attempt */
|
||||
|
||||
|
@ -162,17 +159,9 @@ enum gsamp_thresh {
|
|||
#define DTMF_2ND_HARMONIC_COL 63.1 /* 18dB */
|
||||
#define DTMF_TO_TOTAL_ENERGY 42.0
|
||||
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
#define MF_THRESHOLD 8.0e7
|
||||
#define MF_NORMAL_TWIST 5.3 /* 8dB */
|
||||
#define MF_REVERSE_TWIST 4.0 /* was 2.5 */
|
||||
#define MF_RELATIVE_PEAK 5.3 /* 8dB */
|
||||
#define MF_2ND_HARMONIC 1.7 /* was 2.5 */
|
||||
#else
|
||||
#define BELL_MF_THRESHOLD 1.6e9
|
||||
#define BELL_MF_TWIST 4.0 /* 6dB */
|
||||
#define BELL_MF_RELATIVE_PEAK 12.6 /* 11dB */
|
||||
#endif
|
||||
|
||||
#if !defined(BUSYDETECT_MARTIN) && !defined(BUSYDETECT) && !defined(BUSYDETECT_TONEONLY) && !defined(BUSYDETECT_COMPARE_TONE_AND_SILENCE)
|
||||
#define BUSYDETECT_MARTIN
|
||||
|
@ -183,9 +172,7 @@ typedef struct {
|
|||
int v3;
|
||||
int chunky;
|
||||
int fac;
|
||||
#ifndef OLD_DSP_ROUTINES
|
||||
int samples;
|
||||
#endif
|
||||
} goertzel_state_t;
|
||||
|
||||
typedef struct {
|
||||
|
@ -197,22 +184,8 @@ typedef struct
|
|||
{
|
||||
goertzel_state_t row_out[4];
|
||||
goertzel_state_t col_out[4];
|
||||
#ifdef FAX_DETECT
|
||||
goertzel_state_t fax_tone;
|
||||
#endif
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_state_t row_out2nd[4];
|
||||
goertzel_state_t col_out2nd[4];
|
||||
#ifdef FAX_DETECT
|
||||
goertzel_state_t fax_tone2nd;
|
||||
#endif
|
||||
int hit1;
|
||||
int hit2;
|
||||
int hit3;
|
||||
int hit4;
|
||||
#else
|
||||
int lasthit;
|
||||
#endif
|
||||
int mhit;
|
||||
float energy;
|
||||
int current_sample;
|
||||
|
@ -223,25 +196,14 @@ typedef struct
|
|||
int detected_digits;
|
||||
int lost_digits;
|
||||
int digit_hits[16];
|
||||
#ifdef FAX_DETECT
|
||||
int fax_hits;
|
||||
#endif
|
||||
} dtmf_detect_state_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
goertzel_state_t tone_out[6];
|
||||
int mhit;
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
int hit1;
|
||||
int hit2;
|
||||
int hit3;
|
||||
int hit4;
|
||||
goertzel_state_t tone_out2nd[6];
|
||||
float energy;
|
||||
#else
|
||||
int hits[5];
|
||||
#endif
|
||||
int current_sample;
|
||||
|
||||
char digits[MAX_DTMF_DIGITS + 1];
|
||||
|
@ -249,9 +211,6 @@ typedef struct
|
|||
int current_digits;
|
||||
int detected_digits;
|
||||
int lost_digits;
|
||||
#ifdef FAX_DETECT
|
||||
int fax_hits;
|
||||
#endif
|
||||
} mf_detect_state_t;
|
||||
|
||||
static float dtmf_row[] =
|
||||
|
@ -268,24 +227,11 @@ static float mf_tones[] =
|
|||
700.0, 900.0, 1100.0, 1300.0, 1500.0, 1700.0
|
||||
};
|
||||
|
||||
#ifdef FAX_DETECT
|
||||
static float fax_freq = 1100.0;
|
||||
#endif
|
||||
|
||||
static char dtmf_positions[] = "123A" "456B" "789C" "*0#D";
|
||||
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
static char mf_hit[6][6] = {
|
||||
/* 700 + */ { 0, '1', '2', '4', '7', 'C' },
|
||||
/* 900 + */ { '1', 0, '3', '5', '8', 'A' },
|
||||
/* 1100 + */ { '2', '3', 0, '6', '9', '*' },
|
||||
/* 1300 + */ { '4', '5', '6', 0, '0', 'B' },
|
||||
/* 1500 + */ { '7', '8', '9', '0', 0, '#' },
|
||||
/* 1700 + */ { 'C', 'A', '*', 'B', '#', 0 },
|
||||
};
|
||||
#else
|
||||
static char bell_mf_positions[] = "1247C-358A--69*---0B----#";
|
||||
#endif
|
||||
|
||||
static inline void goertzel_sample(goertzel_state_t *s, short sample)
|
||||
{
|
||||
|
@ -326,9 +272,7 @@ static inline void goertzel_init(goertzel_state_t *s, float freq, int samples)
|
|||
{
|
||||
s->v2 = s->v3 = s->chunky = 0.0;
|
||||
s->fac = (int)(32768.0 * 2.0 * cos(2.0 * M_PI * (freq / 8000.0)));
|
||||
#ifndef OLD_DSP_ROUTINES
|
||||
s->samples = samples;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void goertzel_reset(goertzel_state_t *s)
|
||||
|
@ -369,33 +313,15 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
|
|||
{
|
||||
int i;
|
||||
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
s->hit1 =
|
||||
s->mhit =
|
||||
s->hit3 =
|
||||
s->hit4 =
|
||||
s->hit2 = 0;
|
||||
#else
|
||||
s->lasthit = 0;
|
||||
#endif
|
||||
for (i = 0; i < 4; i++) {
|
||||
goertzel_init (&s->row_out[i], dtmf_row[i], 102);
|
||||
goertzel_init (&s->col_out[i], dtmf_col[i], 102);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_init (&s->row_out2nd[i], dtmf_row[i] * 2.0, 102);
|
||||
goertzel_init (&s->col_out2nd[i], dtmf_col[i] * 2.0, 102);
|
||||
#endif
|
||||
s->energy = 0.0;
|
||||
}
|
||||
#ifdef FAX_DETECT
|
||||
/* Same for the fax dector */
|
||||
goertzel_init (&s->fax_tone, fax_freq, 102);
|
||||
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
/* Same for the fax dector 2nd harmonic */
|
||||
goertzel_init (&s->fax_tone2nd, fax_freq * 2.0, 102);
|
||||
#endif
|
||||
#endif /* FAX_DETECT */
|
||||
s->current_sample = 0;
|
||||
s->detected_digits = 0;
|
||||
s->current_digits = 0;
|
||||
|
@ -407,18 +333,9 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
|
|||
static void ast_mf_detect_init (mf_detect_state_t *s)
|
||||
{
|
||||
int i;
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
s->hit1 =
|
||||
s->hit2 = 0;
|
||||
#else
|
||||
s->hits[0] = s->hits[1] = s->hits[2] = s->hits[3] = s->hits[4] = 0;
|
||||
#endif
|
||||
for (i = 0; i < 6; i++) {
|
||||
goertzel_init (&s->tone_out[i], mf_tones[i], 160);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_init (&s->tone_out2nd[i], mf_tones[i] * 2.0, 160);
|
||||
s->energy = 0.0;
|
||||
#endif
|
||||
}
|
||||
s->current_digits = 0;
|
||||
memset(&s->digits, 0, sizeof(s->digits));
|
||||
|
@ -434,12 +351,7 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
{
|
||||
float row_energy[4];
|
||||
float col_energy[4];
|
||||
#ifdef FAX_DETECT
|
||||
float fax_energy;
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
float fax_energy_2nd;
|
||||
#endif
|
||||
#endif /* FAX_DETECT */
|
||||
float fax_energy = 0.0;
|
||||
float famp;
|
||||
int i;
|
||||
int j;
|
||||
|
@ -456,16 +368,6 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
limit = sample + (102 - s->current_sample);
|
||||
else
|
||||
limit = samples;
|
||||
#if defined(USE_3DNOW)
|
||||
_dtmf_goertzel_update (s->row_out, amp + sample, limit - sample);
|
||||
_dtmf_goertzel_update (s->col_out, amp + sample, limit - sample);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
_dtmf_goertzel_update (s->row_out2nd, amp + sample, limit2 - sample);
|
||||
_dtmf_goertzel_update (s->col_out2nd, amp + sample, limit2 - sample);
|
||||
#endif
|
||||
/* XXX Need to fax detect for 3dnow too XXX */
|
||||
#warning "Fax Support Broken"
|
||||
#else
|
||||
/* The following unrolled loop takes only 35% (rough estimate) of the
|
||||
time of a rolled loop on the machine on which it was developed */
|
||||
for (j = sample; j < limit; j++) {
|
||||
|
@ -481,44 +383,11 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
goertzel_sample(s->col_out + 2, amp[j]);
|
||||
goertzel_sample(s->row_out + 3, amp[j]);
|
||||
goertzel_sample(s->col_out + 3, amp[j]);
|
||||
#ifdef FAX_DETECT
|
||||
|
||||
/* Update fax tone */
|
||||
goertzel_sample(&s->fax_tone, amp[j]);
|
||||
#endif /* FAX_DETECT */
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
v1 = s->col_out2nd[0].v2;
|
||||
s->col_out2nd[0].v2 = s->col_out2nd[0].v3;
|
||||
s->col_out2nd[0].v3 = s->col_out2nd[0].fac*s->col_out2nd[0].v2 - v1 + famp;
|
||||
v1 = s->row_out2nd[0].v2;
|
||||
s->row_out2nd[0].v2 = s->row_out2nd[0].v3;
|
||||
s->row_out2nd[0].v3 = s->row_out2nd[0].fac*s->row_out2nd[0].v2 - v1 + famp;
|
||||
v1 = s->col_out2nd[1].v2;
|
||||
s->col_out2nd[1].v2 = s->col_out2nd[1].v3;
|
||||
s->col_out2nd[1].v3 = s->col_out2nd[1].fac*s->col_out2nd[1].v2 - v1 + famp;
|
||||
v1 = s->row_out2nd[1].v2;
|
||||
s->row_out2nd[1].v2 = s->row_out2nd[1].v3;
|
||||
s->row_out2nd[1].v3 = s->row_out2nd[1].fac*s->row_out2nd[1].v2 - v1 + famp;
|
||||
v1 = s->col_out2nd[2].v2;
|
||||
s->col_out2nd[2].v2 = s->col_out2nd[2].v3;
|
||||
s->col_out2nd[2].v3 = s->col_out2nd[2].fac*s->col_out2nd[2].v2 - v1 + famp;
|
||||
v1 = s->row_out2nd[2].v2;
|
||||
s->row_out2nd[2].v2 = s->row_out2nd[2].v3;
|
||||
s->row_out2nd[2].v3 = s->row_out2nd[2].fac*s->row_out2nd[2].v2 - v1 + famp;
|
||||
v1 = s->col_out2nd[3].v2;
|
||||
s->col_out2nd[3].v2 = s->col_out2nd[3].v3;
|
||||
s->col_out2nd[3].v3 = s->col_out2nd[3].fac*s->col_out2nd[3].v2 - v1 + famp;
|
||||
v1 = s->row_out2nd[3].v2;
|
||||
s->row_out2nd[3].v2 = s->row_out2nd[3].v3;
|
||||
s->row_out2nd[3].v3 = s->row_out2nd[3].fac*s->row_out2nd[3].v2 - v1 + famp;
|
||||
#ifdef FAX_DETECT
|
||||
/* Update fax tone */
|
||||
v1 = s->fax_tone.v2;
|
||||
s->fax_tone2nd.v2 = s->fax_tone2nd.v3;
|
||||
s->fax_tone2nd.v3 = s->fax_tone2nd.fac*s->fax_tone2nd.v2 - v1 + famp;
|
||||
#endif /* FAX_DETECT */
|
||||
#endif
|
||||
if (faxdetect)
|
||||
goertzel_sample(&s->fax_tone, amp[j]);
|
||||
}
|
||||
#endif
|
||||
s->current_sample += (limit - sample);
|
||||
if (s->current_sample < 102) {
|
||||
if (hit && !((digitmode & DSP_DIGITMODE_NOQUELCH))) {
|
||||
|
@ -530,10 +399,9 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
#ifdef FAX_DETECT
|
||||
/* Detect the fax energy, too */
|
||||
fax_energy = goertzel_result(&s->fax_tone);
|
||||
#endif
|
||||
if (faxdetect)
|
||||
fax_energy = goertzel_result(&s->fax_tone);
|
||||
/* We are at the end of a DTMF detection block */
|
||||
/* Find the peak row and the peak column */
|
||||
row_energy[0] = goertzel_result (&s->row_out[0]);
|
||||
|
@ -562,17 +430,9 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
break;
|
||||
}
|
||||
}
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
/* ... and second harmonic test */
|
||||
if (i >= 4 &&
|
||||
(row_energy[best_row] + col_energy[best_col]) > 42.0*s->energy &&
|
||||
goertzel_result(&s->col_out2nd[best_col])*DTMF_2ND_HARMONIC_COL < col_energy[best_col]
|
||||
&& goertzel_result(&s->row_out2nd[best_row])*DTMF_2ND_HARMONIC_ROW < row_energy[best_row]) {
|
||||
#else
|
||||
/* ... and fraction of total energy test */
|
||||
if (i >= 4 &&
|
||||
(row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy) {
|
||||
#endif
|
||||
/* Got a hit */
|
||||
hit = dtmf_positions[(best_row << 2) + best_col];
|
||||
if (!(digitmode & DSP_DIGITMODE_NOQUELCH)) {
|
||||
|
@ -581,30 +441,9 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
amp[i] = 0;
|
||||
*writeback = 1;
|
||||
}
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
/* Look for two successive similar results */
|
||||
/* The logic in the next test is:
|
||||
We need two successive identical clean detects, with
|
||||
something different preceeding it. This can work with
|
||||
back to back differing digits. More importantly, it
|
||||
can work with nasty phones that give a very wobbly start
|
||||
to a digit */
|
||||
if (hit == s->hit3 && s->hit3 != s->hit2) {
|
||||
s->mhit = hit;
|
||||
s->digit_hits[(best_row << 2) + best_col]++;
|
||||
s->detected_digits++;
|
||||
if (s->current_digits < MAX_DTMF_DIGITS) {
|
||||
s->digits[s->current_digits++] = hit;
|
||||
s->digits[s->current_digits] = '\0';
|
||||
} else {
|
||||
s->lost_digits++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef OLD_DSP_ROUTINES
|
||||
/* Look for two successive similar results */
|
||||
/* The logic in the next test is:
|
||||
We need two successive identical clean detects, with
|
||||
|
@ -625,15 +464,9 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
}
|
||||
s->mhit = hit;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FAX_DETECT
|
||||
if (!hit && (fax_energy >= FAX_THRESHOLD) &&
|
||||
(fax_energy >= DTMF_TO_TOTAL_ENERGY*s->energy) &&
|
||||
(faxdetect)) {
|
||||
#if 0
|
||||
printf("Fax energy/Second Harmonic: %f\n", fax_energy);
|
||||
#endif
|
||||
if (!hit && faxdetect && (fax_energy >= FAX_THRESHOLD) &&
|
||||
(fax_energy >= DTMF_TO_TOTAL_ENERGY*s->energy)) {
|
||||
/* XXX Probably need better checking than just this the energy XXX */
|
||||
hit = 'f';
|
||||
s->fax_hits++;
|
||||
|
@ -651,64 +484,29 @@ static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
|
|||
}
|
||||
s->fax_hits = 0;
|
||||
}
|
||||
#endif /* FAX_DETECT */
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
s->hit1 = s->hit2;
|
||||
s->hit2 = s->hit3;
|
||||
s->hit3 = hit;
|
||||
#else
|
||||
s->lasthit = hit;
|
||||
#endif
|
||||
/* Reinitialise the detector for the next block */
|
||||
for (i = 0; i < 4; i++) {
|
||||
goertzel_reset(&s->row_out[i]);
|
||||
goertzel_reset(&s->col_out[i]);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_reset(&s->row_out2nd[i]);
|
||||
goertzel_reset(&s->col_out2nd[i]);
|
||||
#endif
|
||||
}
|
||||
#ifdef FAX_DETECT
|
||||
goertzel_reset (&s->fax_tone);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_reset (&s->fax_tone2nd);
|
||||
#endif
|
||||
#endif
|
||||
if (faxdetect)
|
||||
goertzel_reset (&s->fax_tone);
|
||||
s->energy = 0.0;
|
||||
s->current_sample = 0;
|
||||
}
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
if ((!s->mhit) || (s->mhit != hit)) {
|
||||
s->mhit = 0;
|
||||
return(0);
|
||||
}
|
||||
return (hit);
|
||||
#else
|
||||
return (s->mhit); /* return the debounced hit */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* MF goertzel size */
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
#define MF_GSIZE 160
|
||||
#else
|
||||
#define MF_GSIZE 120
|
||||
#endif
|
||||
|
||||
static int mf_detect (mf_detect_state_t *s, int16_t amp[],
|
||||
int samples, int digitmode, int *writeback)
|
||||
{
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
float tone_energy[6];
|
||||
int best1;
|
||||
int best2;
|
||||
float max;
|
||||
int sofarsogood;
|
||||
#else
|
||||
float energy[6];
|
||||
int best;
|
||||
int second_best;
|
||||
#endif
|
||||
float famp;
|
||||
int i;
|
||||
int j;
|
||||
|
@ -723,23 +521,10 @@ static int mf_detect (mf_detect_state_t *s, int16_t amp[],
|
|||
limit = sample + (MF_GSIZE - s->current_sample);
|
||||
else
|
||||
limit = samples;
|
||||
#if defined(USE_3DNOW)
|
||||
_dtmf_goertzel_update (s->row_out, amp + sample, limit - sample);
|
||||
_dtmf_goertzel_update (s->col_out, amp + sample, limit - sample);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
_dtmf_goertzel_update (s->row_out2nd, amp + sample, limit2 - sample);
|
||||
_dtmf_goertzel_update (s->col_out2nd, amp + sample, limit2 - sample);
|
||||
#endif
|
||||
/* XXX Need to fax detect for 3dnow too XXX */
|
||||
#warning "Fax Support Broken"
|
||||
#else
|
||||
/* The following unrolled loop takes only 35% (rough estimate) of the
|
||||
time of a rolled loop on the machine on which it was developed */
|
||||
for (j = sample; j < limit; j++) {
|
||||
famp = amp[j];
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
s->energy += famp*famp;
|
||||
#endif
|
||||
/* With GCC 2.95, the following unrolled code seems to take about 35%
|
||||
(rough estimate) as long as a neat little 0-3 loop */
|
||||
goertzel_sample(s->tone_out, amp[j]);
|
||||
|
@ -748,28 +533,7 @@ static int mf_detect (mf_detect_state_t *s, int16_t amp[],
|
|||
goertzel_sample(s->tone_out + 3, amp[j]);
|
||||
goertzel_sample(s->tone_out + 4, amp[j]);
|
||||
goertzel_sample(s->tone_out + 5, amp[j]);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
v1 = s->tone_out2nd[0].v2;
|
||||
s->tone_out2nd[0].v2 = s->tone_out2nd[0].v3;
|
||||
s->tone_out2nd[0].v3 = s->tone_out2nd[0].fac*s->tone_out2nd[0].v2 - v1 + famp;
|
||||
v1 = s->tone_out2nd[1].v2;
|
||||
s->tone_out2nd[1].v2 = s->tone_out2nd[1].v3;
|
||||
s->tone_out2nd[1].v3 = s->tone_out2nd[1].fac*s->tone_out2nd[1].v2 - v1 + famp;
|
||||
v1 = s->tone_out2nd[2].v2;
|
||||
s->tone_out2nd[2].v2 = s->tone_out2nd[2].v3;
|
||||
s->tone_out2nd[2].v3 = s->tone_out2nd[2].fac*s->tone_out2nd[2].v2 - v1 + famp;
|
||||
v1 = s->tone_out2nd[3].v2;
|
||||
s->tone_out2nd[3].v2 = s->tone_out2nd[3].v3;
|
||||
s->tone_out2nd[3].v3 = s->tone_out2nd[3].fac*s->tone_out2nd[3].v2 - v1 + famp;
|
||||
v1 = s->tone_out2nd[4].v2;
|
||||
s->tone_out2nd[4].v2 = s->tone_out2nd[4].v3;
|
||||
s->tone_out2nd[4].v3 = s->tone_out2nd[4].fac*s->tone_out2nd[2].v2 - v1 + famp;
|
||||
v1 = s->tone_out2nd[3].v2;
|
||||
s->tone_out2nd[5].v2 = s->tone_out2nd[6].v3;
|
||||
s->tone_out2nd[5].v3 = s->tone_out2nd[6].fac*s->tone_out2nd[3].v2 - v1 + famp;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
s->current_sample += (limit - sample);
|
||||
if (s->current_sample < MF_GSIZE) {
|
||||
if (hit && !((digitmode & DSP_DIGITMODE_NOQUELCH))) {
|
||||
|
@ -781,99 +545,6 @@ static int mf_detect (mf_detect_state_t *s, int16_t amp[],
|
|||
}
|
||||
continue;
|
||||
}
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
/* We're at the end of an MF detection block. Go ahead and calculate
|
||||
all the energies. */
|
||||
for (i=0;i<6;i++) {
|
||||
tone_energy[i] = goertzel_result(&s->tone_out[i]);
|
||||
}
|
||||
/* Find highest */
|
||||
best1 = 0;
|
||||
max = tone_energy[0];
|
||||
for (i=1;i<6;i++) {
|
||||
if (tone_energy[i] > max) {
|
||||
max = tone_energy[i];
|
||||
best1 = i;
|
||||
}
|
||||
}
|
||||
|
||||
/* Find 2nd highest */
|
||||
if (best1) {
|
||||
max = tone_energy[0];
|
||||
best2 = 0;
|
||||
} else {
|
||||
max = tone_energy[1];
|
||||
best2 = 1;
|
||||
}
|
||||
|
||||
for (i=0;i<6;i++) {
|
||||
if (i == best1) continue;
|
||||
if (tone_energy[i] > max) {
|
||||
max = tone_energy[i];
|
||||
best2 = i;
|
||||
}
|
||||
}
|
||||
hit = 0;
|
||||
if (best1 != best2)
|
||||
sofarsogood=1;
|
||||
else
|
||||
sofarsogood=0;
|
||||
/* Check for relative energies */
|
||||
for (i=0;i<6;i++) {
|
||||
if (i == best1)
|
||||
continue;
|
||||
if (i == best2)
|
||||
continue;
|
||||
if (tone_energy[best1] < tone_energy[i] * MF_RELATIVE_PEAK) {
|
||||
sofarsogood = 0;
|
||||
break;
|
||||
}
|
||||
if (tone_energy[best2] < tone_energy[i] * MF_RELATIVE_PEAK) {
|
||||
sofarsogood = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (sofarsogood) {
|
||||
/* Check for 2nd harmonic */
|
||||
if (goertzel_result(&s->tone_out2nd[best1]) * MF_2ND_HARMONIC > tone_energy[best1])
|
||||
sofarsogood = 0;
|
||||
else if (goertzel_result(&s->tone_out2nd[best2]) * MF_2ND_HARMONIC > tone_energy[best2])
|
||||
sofarsogood = 0;
|
||||
}
|
||||
if (sofarsogood) {
|
||||
hit = mf_hit[best1][best2];
|
||||
if (!(digitmode & DSP_DIGITMODE_NOQUELCH)) {
|
||||
/* Zero out frame data if this is part DTMF */
|
||||
for (i=sample;i<limit;i++)
|
||||
amp[i] = 0;
|
||||
*writeback = 1;
|
||||
}
|
||||
/* Look for two consecutive clean hits */
|
||||
if ((hit == s->hit3) && (s->hit3 != s->hit2)) {
|
||||
s->mhit = hit;
|
||||
s->detected_digits++;
|
||||
if (s->current_digits < MAX_DTMF_DIGITS - 2) {
|
||||
s->digits[s->current_digits++] = hit;
|
||||
s->digits[s->current_digits] = '\0';
|
||||
} else {
|
||||
s->lost_digits++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s->hit1 = s->hit2;
|
||||
s->hit2 = s->hit3;
|
||||
s->hit3 = hit;
|
||||
/* Reinitialise the detector for the next block */
|
||||
for (i = 0; i < 6; i++) {
|
||||
goertzel_reset(&s->tone_out[i]);
|
||||
goertzel_reset(&s->tone_out2nd[i]);
|
||||
}
|
||||
s->energy = 0.0;
|
||||
s->current_sample = 0;
|
||||
}
|
||||
#else
|
||||
/* We're at the end of an MF detection block. */
|
||||
/* Find the two highest energies. The spec says to look for
|
||||
two tones and two tones only. Taking this literally -ie
|
||||
|
@ -957,7 +628,6 @@ static int mf_detect (mf_detect_state_t *s, int16_t amp[],
|
|||
goertzel_reset(&s->tone_out[i]);
|
||||
s->current_sample = 0;
|
||||
}
|
||||
#endif
|
||||
if ((!s->mhit) || (s->mhit != hit)) {
|
||||
s->mhit = 0;
|
||||
return(0);
|
||||
|
@ -1064,11 +734,6 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
|
|||
float hz[7];
|
||||
for (y=0;y<7;y++)
|
||||
hz[y] = goertzel_result(&dsp->freqs[y]);
|
||||
#if 0
|
||||
printf("\n350: 425: 440: 480: 620: 950: 1400: 1800: Energy: \n");
|
||||
printf("%.2e %.2e %.2e %.2e %.2e %.2e %.2e %.2e %.2e\n",
|
||||
hz[HZ_350], hz[HZ_425], hz[HZ_440], hz[HZ_480], hz[HZ_620], hz[HZ_950], hz[HZ_1400], hz[HZ_1800], dsp->genergy);
|
||||
#endif
|
||||
switch (dsp->progmode) {
|
||||
case PROG_MODE_NA:
|
||||
if (pair_there(hz[HZ_480], hz[HZ_620], hz[HZ_350], hz[HZ_440], dsp->genergy)) {
|
||||
|
@ -1148,17 +813,13 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
|
|||
break;
|
||||
}
|
||||
if (dsp->ringtimeout==THRESH_RING2ANSWER) {
|
||||
#if 0
|
||||
ast_log(LOG_NOTICE, "Consider call as answered because of timeout after last ring\n");
|
||||
#endif
|
||||
ast_debug(1, "Consider call as answered because of timeout after last ring\n");
|
||||
res = AST_CONTROL_ANSWER;
|
||||
dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
|
||||
}
|
||||
} else {
|
||||
#if 0
|
||||
ast_log(LOG_NOTICE, "Stop state %d with duration %d\n", dsp->tstate, dsp->tcount);
|
||||
ast_log(LOG_NOTICE, "Start state %d\n", newstate);
|
||||
#endif
|
||||
ast_debug(5, "Stop state %d with duration %d\n", dsp->tstate, dsp->tcount);
|
||||
ast_debug(5, "Start state %d\n", newstate);
|
||||
dsp->tstate = newstate;
|
||||
dsp->tcount = 1;
|
||||
}
|
||||
|
@ -1170,10 +831,7 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
|
|||
dsp->genergy = 0.0;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if (res)
|
||||
printf("Returning %d\n", res);
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1328,11 +986,9 @@ int ast_dsp_busydetect(struct ast_dsp *dsp)
|
|||
}
|
||||
#endif
|
||||
#ifndef BUSYDETECT_TONEONLY
|
||||
#if 1
|
||||
if (res) {
|
||||
ast_debug(1, "ast_dsp_busydetect detected busy, avgtone: %d, avgsilence %d\n", avgtone, avgsilence);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
@ -1665,16 +1321,8 @@ void ast_dsp_digitreset(struct ast_dsp *dsp)
|
|||
/* Reinitialise the detector for the next block */
|
||||
for (i = 0; i < 6; i++) {
|
||||
goertzel_reset(&dsp->td.mf.tone_out[i]);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_reset(&dsp->td.mf.tone_out2nd[i]);
|
||||
#endif
|
||||
}
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
dsp->td.mf.energy = 0.0;
|
||||
dsp->td.mf.hit1 = dsp->td.mf.hit2 = dsp->td.mf.hit3 = dsp->td.mf.hit4 = dsp->td.mf.mhit = 0;
|
||||
#else
|
||||
dsp->td.mf.hits[4] = dsp->td.mf.hits[3] = dsp->td.mf.hits[2] = dsp->td.mf.hits[1] = dsp->td.mf.hits[0] = dsp->td.mf.mhit = 0;
|
||||
#endif
|
||||
dsp->td.mf.current_sample = 0;
|
||||
} else {
|
||||
memset(dsp->td.dtmf.digits, 0, sizeof(dsp->td.dtmf.digits));
|
||||
|
@ -1683,22 +1331,9 @@ void ast_dsp_digitreset(struct ast_dsp *dsp)
|
|||
for (i = 0; i < 4; i++) {
|
||||
goertzel_reset(&dsp->td.dtmf.row_out[i]);
|
||||
goertzel_reset(&dsp->td.dtmf.col_out[i]);
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
goertzel_reset(&dsp->td.dtmf.row_out2nd[i]);
|
||||
goertzel_reset(&dsp->td.dtmf.col_out2nd[i]);
|
||||
#endif
|
||||
}
|
||||
#ifdef FAX_DETECT
|
||||
goertzel_reset (&dsp->td.dtmf.fax_tone);
|
||||
#endif
|
||||
#ifdef OLD_DSP_ROUTINES
|
||||
#ifdef FAX_DETECT
|
||||
goertzel_reset (&dsp->td.dtmf.fax_tone2nd);
|
||||
#endif
|
||||
dsp->td.dtmf.hit1 = dsp->td.dtmf.hit2 = dsp->td.dtmf.hit3 = dsp->td.dtmf.hit4 = dsp->td.dtmf.mhit = 0;
|
||||
#else
|
||||
dsp->td.dtmf.lasthit = dsp->td.dtmf.mhit = 0;
|
||||
#endif
|
||||
dsp->td.dtmf.energy = 0.0;
|
||||
dsp->td.dtmf.current_sample = 0;
|
||||
}
|
||||
|
|
Reference in a new issue