| Linux kernel & device driver programming |
| [ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] |
1 1
2 /*
3 *
4 Copyright (c) Eicon Networks, 2002.
5 *
6 This source file is supplied for the use wit
7 Eicon Networks range of DIVA Server Adapters
8 *
9 Eicon File Revision : 2.1
10 *
11 This program is free software; you can redis
12 it under the terms of the GNU General Public
13 the Free Software Foundation; either version
14 any later version.
15 *
16 This program is distributed in the hope that
17 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOE
18 implied warranty of MERCHANTABILITY or FITNE
19 See the GNU General Public License for more
20 *
21 You should have received a copy of the GNU G
22 along with this program; if not, write to th
23 Foundation, Inc., 675 Mass Ave, Cambridge, M
24 *
25 */
26
27 #include "platform.h"
28
29
30
31
32
33
34
35
36
37 #include "capidtmf.h"
38
39 /* #define TRACE_ */
40
41 #define FILE_ "CAPIDTMF.C"
42
43 /*--------------------------------------------
44
45
46 #define trace(a)
47
48
49
50 /*--------------------------------------------
51
52 static short capidtmf_expand_table_alaw[0x0100
53 {
54 -5504, 5504, -344, 344, -22016, 220
55 -2752, 2752, -88, 88, -11008, 110
56 -7552, 7552, -472, 472, -30208, 302
57 -3776, 3776, -216, 216, -15104, 151
58 -4480, 4480, -280, 280, -17920, 179
59 -2240, 2240, -24, 24, -8960, 89
60 -6528, 6528, -408, 408, -26112, 261
61 -3264, 3264, -152, 152, -13056, 130
62 -6016, 6016, -376, 376, -24064, 240
63 -3008, 3008, -120, 120, -12032, 120
64 -8064, 8064, -504, 504, -32256, 322
65 -4032, 4032, -248, 248, -16128, 161
66 -4992, 4992, -312, 312, -19968, 199
67 -2496, 2496, -56, 56, -9984, 99
68 -7040, 7040, -440, 440, -28160, 281
69 -3520, 3520, -184, 184, -14080, 140
70 -5248, 5248, -328, 328, -20992, 209
71 -2624, 2624, -72, 72, -10496, 104
72 -7296, 7296, -456, 456, -29184, 291
73 -3648, 3648, -200, 200, -14592, 145
74 -4224, 4224, -264, 264, -16896, 168
75 -2112, 2112, -8, 8, -8448, 84
76 -6272, 6272, -392, 392, -25088, 250
77 -3136, 3136, -136, 136, -12544, 125
78 -5760, 5760, -360, 360, -23040, 230
79 -2880, 2880, -104, 104, -11520, 115
80 -7808, 7808, -488, 488, -31232, 312
81 -3904, 3904, -232, 232, -15616, 156
82 -4736, 4736, -296, 296, -18944, 189
83 -2368, 2368, -40, 40, -9472, 94
84 -6784, 6784, -424, 424, -27136, 271
85 -3392, 3392, -168, 168, -13568, 135
86 };
87
88 static short capidtmf_expand_table_ulaw[0x0100
89 {
90 -32124, 32124, -1884, 1884, -7932, 79
91 -15996, 15996, -876, 876, -3900, 39
92 -23932, 23932, -1372, 1372, -5884, 58
93 -11900, 11900, -620, 620, -2876, 28
94 -28028, 28028, -1628, 1628, -6908, 69
95 -13948, 13948, -748, 748, -3388, 33
96 -19836, 19836, -1116, 1116, -4860, 48
97 -9852, 9852, -492, 492, -2364, 23
98 -30076, 30076, -1756, 1756, -7420, 74
99 -14972, 14972, -812, 812, -3644, 36
100 -21884, 21884, -1244, 1244, -5372, 53
101 -10876, 10876, -556, 556, -2620, 26
102 -25980, 25980, -1500, 1500, -6396, 63
103 -12924, 12924, -684, 684, -3132, 31
104 -17788, 17788, -988, 988, -4348, 43
105 -8828, 8828, -428, 428, -2108, 21
106 -31100, 31100, -1820, 1820, -7676, 76
107 -15484, 15484, -844, 844, -3772, 37
108 -22908, 22908, -1308, 1308, -5628, 56
109 -11388, 11388, -588, 588, -2748, 27
110 -27004, 27004, -1564, 1564, -6652, 66
111 -13436, 13436, -716, 716, -3260, 32
112 -18812, 18812, -1052, 1052, -4604, 46
113 -9340, 9340, -460, 460, -2236, 22
114 -29052, 29052, -1692, 1692, -7164, 71
115 -14460, 14460, -780, 780, -3516, 35
116 -20860, 20860, -1180, 1180, -5116, 51
117 -10364, 10364, -524, 524, -2492, 24
118 -24956, 24956, -1436, 1436, -6140, 61
119 -12412, 12412, -652, 652, -3004, 30
120 -16764, 16764, -924, 924, -4092, 40
121 -8316, 8316, -396, 396, -1980, 19
122 };
123
124
125 /*--------------------------------------------
126
127 static short capidtmf_recv_window_function[CAP
128 {
129 -500L, -999L, -1499L, -1998L, -2496L,
130 -4483L, -4978L, -5471L, -5963L, -6454L,
131 -8401L, -8883L, -9363L, -9840L, -10316L,
132 -12193L, -12655L, -13115L, -13571L, -14024L,
133 -15804L, -16240L, -16672L, -17100L, -17524L,
134 -19180L, -19583L, -19981L, -20375L, -20764L,
135 -22270L, -22634L, -22993L, -23346L, -23694L,
136 -25030L, -25350L, -25664L, -25971L, -26273L,
137 -27418L, -27688L, -27952L, -28210L, -28461L,
138 -29398L, -29615L, -29826L, -30029L, -30226L,
139 -30941L, -31102L, -31256L, -31402L, -31541L,
140 -32024L, -32126L, -32221L, -32308L, -32388L,
141 -32631L, -32673L, -32707L, -32734L, -32753L,
142 -32753L, -32734L, -32707L, -32673L, -32631L,
143 -32388L, -32308L, -32221L, -32126L, -32024L,
144 -31541L, -31402L, -31256L, -31102L, -30941L,
145 -30226L, -30029L, -29826L, -29615L, -29398L,
146 -28461L, -28210L, -27952L, -27688L, -27418L,
147 -26273L, -25971L, -25664L, -25350L, -25030L,
148 -23694L, -23346L, -22993L, -22634L, -22270L,
149 -20764L, -20375L, -19981L, -19583L, -19180L,
150 -17524L, -17100L, -16672L, -16240L, -15804L,
151 -14024L, -13571L, -13115L, -12655L, -12193L,
152 -10316L, -9840L, -9363L, -8883L, -8401L,
153 -6454L, -5963L, -5471L, -4978L, -4483L,
154 -2496L, -1998L, -1499L, -999L, -500L,
155 };
156
157 static byte capidtmf_leading_zeroes_table[0x10
158 {
159 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4,
160 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
161 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
162 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
163 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
164 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
165 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
166 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
175 };
176
177 #define capidtmf_byte_leading_zeroes(b) (capi
178 #define capidtmf_word_leading_zeroes(w) (((w)
179 #define capidtmf_dword_leading_zeroes(d) (((d
180
181
182 /*--------------------------------------------
183
184
185 static void capidtmf_goertzel_loop (long *buff
186 {
187 int i, j;
188 long c, d, q0, q1, q2;
189
190 for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENC
191 {
192 q1 = buffer[i];
193 q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUE
194 d = coeffs[i] >> 1;
195 c = d << 1;
196 if (c >= 0)
197 {
198 for (j = 0; j < count; j++)
199 {
200 q0 = sample[j] - q2 + (c * (q1 >> 16))
201 q2 = q1;
202 q1 = q0;
203 }
204 }
205 else
206 {
207 c = -c;
208 d = -d;
209 for (j = 0; j < count; j++)
210 {
211 q0 = sample[j] - q2 - ((c * (q1 >> 16)
212 q2 = q1;
213 q1 = q0;
214 }
215 }
216 buffer[i] = q1;
217 buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_C
218 }
219 q1 = buffer[i];
220 q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENC
221 c = (coeffs[i] >> 1) << 1;
222 if (c >= 0)
223 {
224 for (j = 0; j < count; j++)
225 {
226 q0 = sample[j] - q2 + (c * (q1 >> 16)) +
227 q2 = q1;
228 q1 = q0;
229 c -= CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT
230 }
231 }
232 else
233 {
234 c = -c;
235 for (j = 0; j < count; j++)
236 {
237 q0 = sample[j] - q2 - ((c * (q1 >> 16))
238 q2 = q1;
239 q1 = q0;
240 c += CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT
241 }
242 }
243 coeffs[i] = c;
244 buffer[i] = q1;
245 buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COU
246 }
247
248
249 static void capidtmf_goertzel_result (long *bu
250 {
251 int i;
252 long d, e, q1, q2, lo, mid, hi;
253 dword k;
254
255 for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENC
256 {
257 q1 = buffer[i];
258 q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUE
259 d = coeffs[i] >> 1;
260 if (d >= 0)
261 d = ((d << 1) * (-q1 >> 16)) + (((dword)
262 else
263 d = ((-d << 1) * (-q1 >> 16)) + (((dword
264 e = (q2 >= 0) ? q2 : -q2;
265 if (d >= 0)
266 {
267 k = ((dword)(d & 0xffff)) * ((dword)(e &
268 lo = k & 0xffff;
269 mid = k >> 16;
270 k = ((dword)(d >> 16)) * ((dword)(e & 0x
271 mid += k & 0xffff;
272 hi = k >> 16;
273 k = ((dword)(d & 0xffff)) * ((dword)(e >
274 mid += k & 0xffff;
275 hi += k >> 16;
276 hi += ((dword)(d >> 16)) * ((dword)(e >>
277 }
278 else
279 {
280 d = -d;
281 k = ((dword)(d & 0xffff)) * ((dword)(e &
282 lo = -((long)(k & 0xffff));
283 mid = -((long)(k >> 16));
284 k = ((dword)(d >> 16)) * ((dword)(e & 0x
285 mid -= k & 0xffff;
286 hi = -((long)(k >> 16));
287 k = ((dword)(d & 0xffff)) * ((dword)(e >
288 mid -= k & 0xffff;
289 hi -= k >> 16;
290 hi -= ((dword)(d >> 16)) * ((dword)(e >>
291 }
292 if (q2 < 0)
293 {
294 lo = -lo;
295 mid = -mid;
296 hi = -hi;
297 }
298 d = (q1 >= 0) ? q1 : -q1;
299 k = ((dword)(d & 0xffff)) * ((dword)(d & 0
300 lo += k & 0xffff;
301 mid += k >> 16;
302 k = ((dword)(d >> 16)) * ((dword)(d & 0xff
303 mid += (k & 0xffff) << 1;
304 hi += (k >> 16) << 1;
305 hi += ((dword)(d >> 16)) * ((dword)(d >> 1
306 d = (q2 >= 0) ? q2 : -q2;
307 k = ((dword)(d & 0xffff)) * ((dword)(d & 0
308 lo += k & 0xffff;
309 mid += k >> 16;
310 k = ((dword)(d >> 16)) * ((dword)(d & 0xff
311 mid += (k & 0xffff) << 1;
312 hi += (k >> 16) << 1;
313 hi += ((dword)(d >> 16)) * ((dword)(d >> 1
314 mid += lo >> 16;
315 hi += mid >> 16;
316 buffer[i] = (lo & 0xffff) | (mid << 16);
317 buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_C
318 }
319 }
320
321
322 /*--------------------------------------------
323
324 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_697
325 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_770
326 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_852
327 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_941
328 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1209
329 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1336
330 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1477
331 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1633
332 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_635
333 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1010
334 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1140
335 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1272
336 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1405
337 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1555
338 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1715
339 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1875
340
341 #define CAPIDTMF_RECV_GUARD_SNR_DONTCARE
342 #define CAPIDTMF_RECV_NO_DIGIT
343 #define CAPIDTMF_RECV_TIME_GRANULARITY
344
345 #define CAPIDTMF_RECV_INDICATION_DIGIT
346
347 static long capidtmf_recv_goertzel_coef_table[
348 {
349 0xda97L * 2, /* 697 Hz (Low group 697 Hz) *
350 0xd299L * 2, /* 770 Hz (Low group 770 Hz) *
351 0xc8cbL * 2, /* 852 Hz (Low group 852 Hz) *
352 0xbd36L * 2, /* 941 Hz (Low group 941 Hz) *
353 0x9501L * 2, /* 1209 Hz (High group 1209 Hz
354 0x7f89L * 2, /* 1336 Hz (High group 1336 Hz
355 0x6639L * 2, /* 1477 Hz (High group 1477 Hz
356 0x48c6L * 2, /* 1633 Hz (High group 1633 Hz
357 0xe14cL * 2, /* 630 Hz (Lower guard of low
358 0xb2e0L * 2, /* 1015 Hz (Upper guard of low
359 0xa1a0L * 2, /* 1130 Hz (Lower guard of hig
360 0x8a87L * 2, /* 1272 Hz (Guard between 1209
361 0x7353L * 2, /* 1405 Hz (2nd harmonics of 6
362 0x583bL * 2, /* 1552 Hz (2nd harmonics of 7
363 0x37d8L * 2, /* 1720 Hz (2nd harmonics of 8
364 0x0000L * 2 /* 100-630 Hz (fundamentals) *
365 };
366
367
368 static word capidtmf_recv_guard_snr_low_table[
369 {
370 14, /* Lo
371 14, /* Lo
372 16, /* Lo
373 16, /* Lo
374 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
375 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
376 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
377 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
378 14, /* Lo
379 16, /* Lo
380 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
381 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Lo
382 DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 8, /* Lo
383 DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4, /* Lo
384 DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4, /* Lo
385 12 /* Lo
386 };
387
388
389 static word capidtmf_recv_guard_snr_high_table
390 {
391 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
392 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
393 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
394 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
395 20, /* Hi
396 20, /* Hi
397 20, /* Hi
398 20, /* Hi
399 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
400 CAPIDTMF_RECV_GUARD_SNR_DONTCARE, /* Hi
401 16, /* Hi
402 4, /* Hi
403 6, /* Hi
404 8, /* Hi
405 16, /* Hi
406 12 /* Hi
407 };
408
409
410 /*--------------------------------------------
411
412 static void capidtmf_recv_init (t_capidtmf_sta
413 {
414 p_state->recv.min_gap_duration = 1;
415 p_state->recv.min_digit_duration = 1;
416
417 p_state->recv.cycle_counter = 0;
418 p_state->recv.current_digit_on_time = 0;
419 p_state->recv.current_digit_off_time = 0;
420 p_state->recv.current_digit_value = CAPIDTMF
421
422 p_state->recv.digit_write_pos = 0;
423 p_state->recv.digit_read_pos = 0;
424 p_state->recv.indication_state = 0;
425 p_state->recv.indication_state_ack = 0;
426 p_state->recv.state = CAPIDTMF_RECV_STATE_ID
427 }
428
429
430 void capidtmf_recv_enable (t_capidtmf_state
431 {
432 p_state->recv.indication_state_ack &= CAPIDT
433 p_state->recv.min_digit_duration = (word)(((
434 ((dword)(CAPIDTMF_RECV_TIME_GRANULARITY /
435 if (p_state->recv.min_digit_duration <= 1)
436 p_state->recv.min_digit_duration = 1;
437 else
438 (p_state->recv.min_digit_duration)--;
439 p_state->recv.min_gap_duration =
440 (word)((((dword) min_gap_duration) * 8) /
441 if (p_state->recv.min_gap_duration <= 1)
442 p_state->recv.min_gap_duration = 1;
443 else
444 (p_state->recv.min_gap_duration)--;
445 p_state->recv.state |= CAPIDTMF_RECV_STATE_D
446 }
447
448
449 void capidtmf_recv_disable (t_capidtmf_state
450 {
451 p_state->recv.state &= ~CAPIDTMF_RECV_STATE_
452 if (p_state->recv.state == CAPIDTMF_RECV_STA
453 capidtmf_recv_init (p_state);
454 else
455 {
456 p_state->recv.cycle_counter = 0;
457 p_state->recv.current_digit_on_time = 0;
458 p_state->recv.current_digit_off_time = 0;
459 p_state->recv.current_digit_value = CAPIDT
460 }
461 }
462
463
464 word capidtmf_recv_indication (t_capidtmf_stat
465 {
466 word i, j, k, flags;
467
468 flags = p_state->recv.indication_state ^ p_s
469 p_state->recv.indication_state_ack ^= flags
470 if (p_state->recv.digit_write_pos != p_state
471 {
472 i = 0;
473 k = p_state->recv.digit_write_pos;
474 j = p_state->recv.digit_read_pos;
475 do
476 {
477 buffer[i++] = p_state->recv.digit_buffer
478 j = (j == CAPIDTMF_RECV_DIGIT_BUFFER_SIZ
479 } while (j != k);
480 p_state->recv.digit_read_pos = k;
481 return (i);
482 }
483 p_state->recv.indication_state_ack ^= flags;
484 return (0);
485 }
486
487
488 #define CAPIDTMF_RECV_WINDOWED_SAMPLES 32
489
490 void capidtmf_recv_block (t_capidtmf_state *
491 {
492 byte result_digit;
493 word sample_number, cycle_counter, n, i;
494 word low_peak, high_peak;
495 dword lo, hi;
496 byte *p;
497 short *q;
498 byte goertzel_result_buffer[CAPIDTMF_RECV_TO
499 short windowed_sample_buffer[CAPIDTMF_RECV
500
501
502 if (p_state->recv.state & CAPIDTMF_RECV_STAT
503 {
504 cycle_counter = p_state->recv.cycle_counte
505 sample_number = 0;
506 while (sample_number < length)
507 {
508 if (cycle_counter < CAPIDTMF_RECV_ACCUMU
509 {
510 if (cycle_counter == 0)
511 {
512 for (i = 0; i < CAPIDTMF_RECV_TOTAL_
513 {
514 p_state->recv.goertzel_buffer[0][i
515 p_state->recv.goertzel_buffer[1][i
516 }
517 }
518 n = CAPIDTMF_RECV_ACCUMULATE_CYCLES -
519 if (n > length - sample_number)
520 n = length - sample_number;
521 if (n > CAPIDTMF_RECV_WINDOWED_SAMPLES
522 n = CAPIDTMF_RECV_WINDOWED_SAMPLES;
523 p = buffer + sample_number;
524 q = capidtmf_recv_window_function + cy
525 if (p_state->ulaw)
526 {
527 for (i = 0; i < n; i++)
528 {
529 windowed_sample_buffer[i] =
530 (short)((capidtmf_expand_table_u
531 }
532 }
533 else
534 {
535 for (i = 0; i < n; i++)
536 {
537 windowed_sample_buffer[i] =
538 (short)((capidtmf_expand_table_a
539 }
540 }
541 capidtmf_recv_goertzel_coef_table[CAPI
542 capidtmf_goertzel_loop (p_state->recv.
543 capidtmf_recv_goertzel_coef_table, w
544 cycle_counter += n;
545 sample_number += n;
546 }
547 else
548 {
549 capidtmf_goertzel_result (p_state->rec
550 capidtmf_recv_goertzel_coef_table);
551 for (i = 0; i < CAPIDTMF_RECV_TOTAL_FR
552 {
553 lo = (dword)(p_state->recv.goertzel_
554 hi = (dword)(p_state->recv.goertzel_
555 if (hi != 0)
556 {
557 n = capidtmf_dword_leading_zeroes
558 hi = (hi << n) | (lo >> (32 - n));
559 }
560 else
561 {
562 n = capidtmf_dword_leading_zeroes
563 hi = lo << n;
564 n += 32;
565 }
566 n = 195 - 3 * n;
567 if (hi >= 0xcb300000L)
568 n += 2;
569 else if (hi >= 0xa1450000L)
570 n++;
571 goertzel_result_buffer[i] = (byte) n
572 }
573 low_peak = DSPDTMF_RX_SENSITIVITY_LOW_
574 result_digit = CAPIDTMF_RECV_NO_DIGIT;
575 for (i = 0; i < CAPIDTMF_LOW_GROUP_FRE
576 {
577 if (goertzel_result_buffer[i] > low_
578 {
579 low_peak = goertzel_result_buffer[
580 result_digit = (byte) i;
581 }
582 }
583 high_peak = DSPDTMF_RX_SENSITIVITY_HIG
584 n = CAPIDTMF_RECV_NO_DIGIT;
585 for (i = CAPIDTMF_LOW_GROUP_FREQUENCIE
586 {
587 if (goertzel_result_buffer[i] > high
588 {
589 high_peak = goertzel_result_buffer
590 n = (i - CAPIDTMF_LOW_GROUP_FREQUE
591 }
592 }
593 result_digit |= (byte) n;
594 if (low_peak + DSPDTMF_RX_HIGH_EXCEEDI
595 result_digit = CAPIDTMF_RECV_NO_DIGI
596 if (high_peak + DSPDTMF_RX_LOW_EXCEEDI
597 result_digit = CAPIDTMF_RECV_NO_DIGI
598 n = 0;
599 for (i = 0; i < CAPIDTMF_RECV_TOTAL_FR
600 {
601 if ((((short)(low_peak - goertzel_re
602 || (((short)(high_peak - goertzel_r
603 {
604 n++;
605 }
606 }
607 if (n != 2)
608 result_digit = CAPIDTMF_RECV_NO_DIGI
609
610 if (result_digit == CAPIDTMF_RECV_NO_D
611 {
612 if (p_state->recv.current_digit_on_t
613 {
614 if (++(p_state->recv.current_digit
615 {
616 p_state->recv.current_digit_on_t
617 p_state->recv.current_digit_off_
618 }
619 }
620 else
621 {
622 if (p_state->recv.current_digit_of
623 (p_state->recv.current_digit_off
624 }
625 }
626 else
627 {
628 if ((p_state->recv.current_digit_on_
629 && (p_state->recv.current_digit_off
630 {
631 (p_state->recv.current_digit_off_t
632 }
633 else
634 {
635 n = p_state->recv.current_digit_of
636 if ((p_state->recv.current_digit_o
637 && (result_digit != p_state->recv
638 {
639 p_state->recv.current_digit_on_t
640 n = 0;
641 }
642 p_state->recv.current_digit_value
643 p_state->recv.current_digit_off_ti
644 if (p_state->recv.current_digit_on
645 {
646 p_state->recv.current_digit_on_t
647 if (p_state->recv.current_digit_
648 {
649 p_state->recv.current_digit_on
650 i = (p_state->recv.digit_write
651 0 : p_state->recv.digit_writ
652 if (i == p_state->recv.digit_r
653 {
654 trace (dprintf ("%s,%d: Rece
655 (char *)(FILE_), __LINE_
656 }
657 else
658 {
659 p_state->recv.digit_buffer[p
660 p_state->recv.digit_write_po
661 p_state->recv.indication_sta
662 (p_state->recv.indication_
663 (~p_state->recv.indication
664 }
665 }
666 }
667 }
668 }
669 cycle_counter = 0;
670 sample_number++;
671 }
672 }
673 p_state->recv.cycle_counter = cycle_counte
674 }
675 }
676
677
678 void capidtmf_init (t_capidtmf_state *p_stat
679 {
680 p_state->ulaw = ulaw;
681 capidtmf_recv_init (p_state);
682 }
683
684
685 /*--------------------------------------------
686
| This page was automatically generated by the LXR engine. |