summaryrefslogtreecommitdiff
path: root/main/dsp.c
diff options
context:
space:
mode:
authorAlec L Davis <sivad.a@paradise.net.nz>2012-10-04 04:50:16 +0000
committerAlec L Davis <sivad.a@paradise.net.nz>2012-10-04 04:50:16 +0000
commit4af961a03a5d00601ad18e75887e882602dc24fe (patch)
treec4aac66cb266eeac4917439c32276240877a5052 /main/dsp.c
parent481df22eacb14a6754f12ea1f2014a6e6e79575b (diff)
dsp.c User configuration of DTMF_NORMAL_TWIST and DTMF_REVERSE_TWIST values
Asterisk's DTMF Specifications are based on AT&T specs, which may not be compatible in other countries. Various countries have different specifications for the maximum power level differences between the DTMF low group and high group of frequencies. Power level difference between frequencies for different Administrations/RPOAs NTT = Max. 5 dB AT&T = 4dB(reverse) to 8dB(normal) Danish = Max. 6 dB Australian = Max. 10 dB Brazilian = Max. 9 dB ETSI = Max. 6 dB from ETSI ES 201 235-3 V1.3.1 (2006-03) Now allow 4 variables to be individually configured in dsp.conf, with reasonable min/max of 2dB to 20dB. Default is AT&T specifications Add's the following variables to dsp.conf ;dtmf_normal_twist=6.31 ;dtmf_reverse_twist=2.51 ;relax_dtmf_normal_twist=6.31 ;relax_dtmf_reverse_twist=3.98 (closes issue ASTERISK-20442) Reported by: tbsky Tested by: tbsky,alecdavis alecdavis (license 585) Review https://reviewboard.asterisk.org/r/2141/ ........ Merged revisions 374384 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 374385 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 374386 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374387 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/dsp.c')
-rw-r--r--main/dsp.c59
1 files changed, 53 insertions, 6 deletions
diff --git a/main/dsp.c b/main/dsp.c
index 0645eab6f..3ff5f009d 100644
--- a/main/dsp.c
+++ b/main/dsp.c
@@ -146,7 +146,7 @@ enum gsamp_thresh {
#define MAX_DTMF_DIGITS 128
-/* Basic DTMF specs:
+/* Basic DTMF (AT&T) specs:
*
* Minimum tone on = 40ms
* Minimum tone off = 50ms
@@ -161,12 +161,18 @@ enum gsamp_thresh {
#define DTMF_THRESHOLD 8.0e7
#define FAX_THRESHOLD 8.0e7
#define FAX_2ND_HARMONIC 2.0 /* 4dB */
-#define DTMF_NORMAL_TWIST 6.3 /* 8dB */
+
+#define DEF_DTMF_NORMAL_TWIST 6.31 /* 8.0dB */
+#define DEF_RELAX_DTMF_NORMAL_TWIST 6.31 /* 8.0dB */
+
#ifdef RADIO_RELAX
-#define DTMF_REVERSE_TWIST (relax ? 6.5 : 2.5) /* 4dB normal */
+#define DEF_DTMF_REVERSE_TWIST 2.51 /* 4.01dB */
+#define DEF_RELAX_DTMF_REVERSE_TWIST 6.61 /* 8.2dB */
#else
-#define DTMF_REVERSE_TWIST (relax ? 4.0 : 2.5) /* 4dB normal */
+#define DEF_DTMF_REVERSE_TWIST 2.51 /* 4.01dB */
+#define DEF_RELAX_DTMF_REVERSE_TWIST 3.98 /* 6.0dB */
#endif
+
#define DTMF_RELATIVE_PEAK_ROW 6.3 /* 8dB */
#define DTMF_RELATIVE_PEAK_COL 6.3 /* 8dB */
#define DTMF_2ND_HARMONIC_ROW (relax ? 1.7 : 2.5) /* 4dB normal */
@@ -297,6 +303,10 @@ static const float mf_tones[] = {
static const char dtmf_positions[] = "123A" "456B" "789C" "*0#D";
static const char bell_mf_positions[] = "1247C-358A--69*---0B----#";
static int thresholds[THRESHOLD_MAX];
+static float dtmf_normal_twist; /* AT&T = 8dB */
+static float dtmf_reverse_twist; /* AT&T = 4dB */
+static float relax_dtmf_normal_twist; /* AT&T = 8dB */
+static float relax_dtmf_reverse_twist; /* AT&T = 6dB */
static inline void goertzel_sample(goertzel_state_t *s, short sample)
{
@@ -706,8 +716,8 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
/* Basic signal level test and the twist test */
if (row_energy[best_row] >= DTMF_THRESHOLD &&
col_energy[best_col] >= DTMF_THRESHOLD &&
- col_energy[best_col] < row_energy[best_row] * DTMF_REVERSE_TWIST &&
- col_energy[best_col] * DTMF_NORMAL_TWIST > row_energy[best_row]) {
+ col_energy[best_col] < row_energy[best_row] * (relax ? relax_dtmf_reverse_twist : dtmf_reverse_twist) &&
+ row_energy[best_row] < col_energy[best_col] * (relax ? relax_dtmf_normal_twist : dtmf_normal_twist)) {
/* Relative peak test */
for (i = 0; i < 4; i++) {
if ((i != best_col &&
@@ -1828,12 +1838,17 @@ static int _dsp_init(int reload)
struct ast_variable *v;
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
int cfg_threshold;
+ float cfg_twist;
if ((cfg = ast_config_load2(CONFIG_FILE_NAME, "dsp", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
return 0;
}
thresholds[THRESHOLD_SILENCE] = DEFAULT_SILENCE_THRESHOLD;
+ dtmf_normal_twist = DEF_DTMF_NORMAL_TWIST;
+ dtmf_reverse_twist = DEF_DTMF_REVERSE_TWIST;
+ relax_dtmf_normal_twist = DEF_RELAX_DTMF_NORMAL_TWIST;
+ relax_dtmf_reverse_twist = DEF_RELAX_DTMF_REVERSE_TWIST;
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
return 0;
@@ -1848,6 +1863,38 @@ static int _dsp_init(int reload)
} else {
thresholds[THRESHOLD_SILENCE] = cfg_threshold;
}
+ } else if (!strcasecmp(v->name, "dtmf_normal_twist")) {
+ if (sscanf(v->value, "%30f", &cfg_twist) < 1) {
+ ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+ } else if ((cfg_twist < 2.0) || (cfg_twist > 100.0)) { /* < 3.0dB or > 20dB */
+ ast_log(LOG_WARNING, "Invalid dtmf_normal_twist value '%.2f' specified, using default of %.2f\n", cfg_twist, dtmf_normal_twist);
+ } else {
+ dtmf_normal_twist = cfg_twist;
+ }
+ } else if (!strcasecmp(v->name, "dtmf_reverse_twist")) {
+ if (sscanf(v->value, "%30f", &cfg_twist) < 1) {
+ ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+ } else if ((cfg_twist < 2.0) || (cfg_twist > 100.0)) { /* < 3.0dB or > 20dB */
+ ast_log(LOG_WARNING, "Invalid dtmf_reverse_twist value '%.2f' specified, using default of %.2f\n", cfg_twist, dtmf_reverse_twist);
+ } else {
+ dtmf_reverse_twist = cfg_twist;
+ }
+ } else if (!strcasecmp(v->name, "relax_dtmf_normal_twist")) {
+ if (sscanf(v->value, "%30f", &cfg_twist) < 1) {
+ ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+ } else if ((cfg_twist < 2.0) || (cfg_twist > 100.0)) { /* < 3.0dB or > 20dB */
+ ast_log(LOG_WARNING, "Invalid relax_dtmf_normal_twist value '%.2f' specified, using default of %.2f\n", cfg_twist, relax_dtmf_normal_twist);
+ } else {
+ relax_dtmf_normal_twist = cfg_twist;
+ }
+ } else if (!strcasecmp(v->name, "relax_dtmf_reverse_twist")) {
+ if (sscanf(v->value, "%30f", &cfg_twist) < 1) {
+ ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+ } else if ((cfg_twist < 2.0) || (cfg_twist > 100.0)) { /* < 3.0dB or > 20dB */
+ ast_log(LOG_WARNING, "Invalid relax_dtmf_reverse_twist value '%.2f' specified, using default of %.2f\n", cfg_twist, relax_dtmf_reverse_twist);
+ } else {
+ relax_dtmf_reverse_twist = cfg_twist;
+ }
}
}
ast_config_destroy(cfg);