2 * ----------------------------------------------------------------------------
3 * "THE BEER-WARE LICENSE" (Revision 42):
4 * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
5 * can do whatever you want with this stuff. If we meet some day, and you think
6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
7 * ----------------------------------------------------------------------------
9 * $Id: dtmfdecode.c,v 1.3 2003/10/06 09:43:27 itojun Exp $
13 * Extract DTMF signalling from ISDN4BSD A-law coded audio data
15 * A-law to linear conversion from the sox package.
22 /* Integer math scaling factor */
25 /* A-law parameters */
26 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
27 #define QUANT_MASK (0xf) /* Quantization field mask. */
28 #define SEG_SHIFT (4) /* Left shift for segment number. */
29 #define SEG_MASK (0x70) /* Segment field mask. */
31 static int alaw2linear(unsigned char a_val
)
38 t
= (a_val
& QUANT_MASK
) << 4;
39 seg
= ((unsigned)a_val
& SEG_MASK
) >> SEG_SHIFT
;
51 return ((a_val
& SIGN_BIT
) ? t
: -t
);
55 /* The frequencies we're trying to detect */
56 static int dtmf
[8] = {697, 770, 852, 941, 1209, 1336, 1477, 1633};
58 /* precalculated: p1[kk] = (-cos(2 * 3.141592 * dtmf[kk] / 8000.0) * FSC) */
59 static int p1
[8] = {-3497, -3369, -3212, -3027, -2384, -2040, -1635, -1164};
62 /* This is the Q of the filter (pole radius) */
65 #define P2 ((int)(POLRAD*POLRAD*FSC))
68 main(int argc
, char **argv
)
70 int i
, kk
, t
, nn
, s
, so
, ia
;
71 int x
, c
, d
, f
, h
[8], k
[8], n
, y
[8];
78 for (kk
= 0; kk
< 8; kk
++) {
79 y
[kk
] = h
[kk
] = k
[kk
] = 0;
81 p1
[kk
] = (-cos(2 * 3.141592 * dtmf
[kk
] / 8000.0) * FSC
);
85 for (i
= 0; i
< 256; i
++) {
87 alaw
[i
] = alaw2linear(i
) / (32768/FSC
);
90 /* We encode the tones in 8 bits, translate those to symbol */
93 key
[0x11] = '1'; key
[0x12] = '4'; key
[0x14] = '7'; key
[0x18] = '*';
94 key
[0x21] = '2'; key
[0x22] = '5'; key
[0x24] = '8'; key
[0x28] = '0';
95 key
[0x41] = '3'; key
[0x42] = '6'; key
[0x44] = '9'; key
[0x48] = '#';
96 key
[0x81] = 'A'; key
[0x82] = 'B'; key
[0x84] = 'C'; key
[0x88] = 'D';
102 while ((i
= getchar()) != EOF
)
106 /* Convert to our format */
109 /* Input amplitude */
111 ia
+= (x
- ia
) / 128;
113 ia
+= (-x
- ia
) / 128;
117 for (kk
= 0; kk
< 8; kk
++) {
120 c
= (P2
* (x
- k
[kk
])) / FSC
;
122 f
= (p1
[kk
] * (d
- h
[kk
])) / FSC
;
127 /* Detect and Average */
129 y
[kk
] += (n
- y
[kk
]) / 64;
131 y
[kk
] += (-n
- y
[kk
]) / 64;
134 if (y
[kk
] > FSC
/10 && y
[kk
] > ia
)
138 /* Hysteresis and noise supressor */
140 /* printf("x %d %x -> %x\n",t,so, s); */
143 } else if (nn
++ == 520 && key
[s
]) {
145 /* printf(" %d %x\n",t,s); */