4b7274e5a950ae4580e4a8f92bda91e1599e2817
[asterisk/asterisk.git] / channels / xpmr / xpmr_coef.h
1 /*
2  * xpmr_coef.h - for Xelatec Private Mobile Radio Processes
3  * 
4  * All Rights Reserved. Copyright (C)2007, Xelatec, LLC
5  * 
6  * 20070808 1235 Steven Henke, W9SH, sph@xelatec.com
7  * 
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  * 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  *               
22  * This version may be optionally licenced under the GNU LGPL licence.
23  *
24  * A license has been granted to Digium (via disclaimer) for the use of
25  * this code.
26  *
27  * Some filter coeficients via 'WinFilter' http://www.winfilter.20m.com.
28  *
29  */
30
31 /*! \file
32  *
33  * \brief Private Land Mobile Radio Channel Voice and Signaling Processor
34  *
35  * \author Steven Henke, W9SH <sph@xelatec.com> Xelatec, LLC
36  */
37
38 #ifndef XPMR_COEF_H
39 #define XMPR_COEF_H 1
40
41 // frequencies in 0.1 Hz
42 const u32 dtmf_row[] =
43 {
44         6970,  7700,  8520,  9410
45 };
46 const u32 dtmf_col[] =
47 {
48         12090, 13360, 14770, 16330
49 };
50
51 const i16 coef_dcs_rx  = 1488;                  // dcs rx data divisor for oversampling 8000/134.4
52 const i16 coef_dcs_tx  = 5952;                  // dcs tx data divisor
53
54 const i16 coef_lsd_div  = 672;                  // low speed data divisor
55 const u32 coef_lsd_sync = 0x158;        // 000101011000
56 const u32 coef_lsd_sync_pattern[] = {0x0000000F, 0x0F0FF000};
57
58 #define CTCSS_COEF_INT          120
59 #define CTCSS_SAMPLE_RATE   8000
60 #define TDIV(x) ((CTCSS_SAMPLE_RATE*1000/x)+5)/10
61
62 i32 coef_ctcss[4][5]=
63 {
64         // freq, divisor, integrator, filter
65         {770,TDIV(770),CTCSS_COEF_INT,0,0},
66         {1000,TDIV(1000),CTCSS_COEF_INT,0,0},
67         {1035,TDIV(1035),CTCSS_COEF_INT,0,0},
68         {0,0,0,0}
69 };
70
71
72 i16 coef_ctcss_div[]=
73 {
74 2985,    // 00   067.0
75 2782,    // 01   071.9
76 2688,    // 02   074.4
77 2597,    // 03   077.0
78 2509,    // 04   079.7
79 2424,    // 05   082.5
80 2342,    // 06   085.4
81 2260,    // 07   088.5
82 2186,    // 08   091.5
83 2110,    // 09   094.8
84 2053,    // 10   097.4
85 2000,    // 11   100.0
86 1932,    // 12   103.5
87 1866,    // 13   107.2
88 1803,    // 14   110.9
89 1742,    // 15   114.8
90 1684,    // 16   118.8
91 1626,    // 17   123.0
92 1571,    // 18   127.3
93 1517,    // 19   131.8
94 1465,    // 20   136.5
95 1415,    // 21   141.3
96 1368,    // 22   146.2
97 1321,    // 23   151.4
98 1276,    // 24   156.7
99 1233,    // 25   162.2
100 1191,    // 26   167.9
101 1151,    // 27   173.8
102 1112,    // 28   179.9
103 1074,    // 29   186.2
104 1037,    // 30   192.8
105 983,    // 31   203.5
106 949,    // 32   210.7
107 917,    // 33   218.1
108 886,    // 34   225.7
109 856,    // 35   233.6
110 827,    // 36   241.8
111 799     // 37   250.3
112 };
113
114 float freq_ctcss[]=
115 {
116 067.0,    // 00   
117 071.9,    // 01   
118 074.4,    // 02   
119 077.0,    // 03   
120 079.7,    // 04   
121 082.5,    // 05   
122 085.4,    // 06   
123 088.5,    // 07   
124 091.5,    // 08   
125 094.8,    // 09   
126 097.4,    // 10   
127 100.0,    // 11   
128 103.5,    // 12   
129 107.2,    // 13   
130 110.9,    // 14   
131 114.8,    // 15   
132 118.8,    // 16   
133 123.0,    // 17   
134 127.3,    // 18   
135 131.8,    // 19   
136 136.5,    // 20   
137 141.3,    // 21   
138 146.2,    // 22   
139 151.4,    // 23   
140 156.7,    // 24   
141 162.2,    // 25   
142 167.9,    // 26   
143 173.8,    // 27   
144 179.9,    // 28   
145 186.2,    // 29   
146 192.8,    // 30   
147 203.5,    // 31  
148 210.7 ,    // 32  
149 218.1 ,    // 33  
150 225.7 ,    // 34  
151 233.6 ,    // 35  
152 241.8 ,    // 36  
153 250.3      // 37  
154 };
155
156 /*
157         noise squelch carrier detect filter
158 */
159 static const int16_t taps_fir_bpf_noise_1 = 66;
160 static const int32_t gain_fir_bpf_noise_1 = 65536;
161 static const int16_t coef_fir_bpf_noise_1[] = { 
162       139,
163      -182,
164      -269,
165       -66,
166        56,
167        59,
168       250,
169       395,
170       -80,
171      -775,
172      -557,
173       437,
174       779,
175       210,
176       -17,
177       123,
178      -692,
179     -1664,
180      -256,
181      2495,
182      2237,
183     -1018,
184     -2133,
185      -478,
186     -1134,
187     -2711,
188      2642,
189     10453,
190      4010,
191     -14385,
192     -16488,
193      6954,
194     23030,
195      6954,
196     -16488,
197     -14385,
198      4010,
199     10453,
200      2642,
201     -2711,
202     -1134,
203      -478,
204     -2133,
205     -1018,
206      2237,
207      2495,
208      -256,
209     -1664,
210      -692,
211       123,
212       -17,
213       210,
214       779,
215       437,
216      -557,
217      -775,
218       -80,
219       395,
220       250,
221        59,
222        56,
223       -66,
224      -269,
225      -182,
226       139,
227       257
228 };
229 /*
230         tbd
231 */
232 static const int16_t taps_fir_lpf_3K_1 = 66;
233 static const int32_t gain_fir_lpf_3K_1 = 131072;
234 static const int16_t coef_fir_lpf_3K_1[] = { 
235       259,
236        58,
237      -185,
238      -437,
239      -654,
240      -793,
241      -815,
242      -696,
243      -434,
244       -48,
245       414,
246       886,
247      1284,
248      1523,
249      1529,
250      1254,
251       691,
252      -117,
253     -1078,
254     -2049,
255     -2854,
256     -3303,
257     -3220,
258     -2472,
259      -995,
260      1187,
261      3952,
262      7086,
263     10300,
264     13270,
265     15672,
266     17236,
267     17778,
268     17236,
269     15672,
270     13270,
271     10300,
272      7086,
273      3952,
274      1187,
275      -995,
276     -2472,
277     -3220,
278     -3303,
279     -2854,
280     -2049,
281     -1078,
282      -117,
283       691,
284      1254,
285      1529,
286      1523,
287      1284,
288       886,
289       414,
290       -48,
291      -434,
292      -696,
293      -815,
294      -793,
295      -654,
296      -437,
297      -185,
298        58,
299       259,
300       393
301 };
302
303 /**************************************************************
304 Filter type: Low Pass
305 Filter model: Butterworth
306 Filter order: 9
307 Sampling Frequency: 8 KHz
308 Cut Frequency: 0.250000 KHz
309 Coefficents Quantization: 16-bit
310 ***************************************************************/
311 static const int16_t taps_fir_lpf_250_11_64 = 64;
312 static const int32_t gain_fir_lpf_250_11_64 = 262144;
313 static const int16_t coef_fir_lpf_250_11_64[] = 
314 {
315       366,
316        -3,
317      -418,
318      -865,
319     -1328,
320     -1788,
321     -2223,
322     -2609,
323     -2922,
324     -3138,
325     -3232,
326     -3181,
327     -2967,
328     -2573,
329     -1988,
330     -1206,
331      -228,
332       937,
333      2277,
334      3767,
335      5379,
336      7077,
337      8821,
338     10564,
339     12259,
340     13855,
341     15305,
342     16563,
343     17588,
344     18346,
345     18812,
346     18968,
347     18812,
348     18346,
349     17588,
350     16563,
351     15305,
352     13855,
353     12259,
354     10564,
355      8821,
356      7077,
357      5379,
358      3767,
359      2277,
360       937,
361      -228,
362     -1206,
363     -1988,
364     -2573,
365     -2967,
366     -3181,
367     -3232,
368     -3138,
369     -2922,
370     -2609,
371     -2223,
372     -1788,
373     -1328,
374      -865,
375      -418,
376        -3,
377       366,
378       680
379 };
380
381 // de-emphasis integrator 300 Hz with 8KS/s
382 // a0, b1
383 static const int16_t taps_int_lpf_300_1_2 = 2;
384 static const int32_t gain_int_lpf_300_1_2 = 8182;
385 static const int16_t coef_int_lpf_300_1_2[]={
386 6878,
387 25889
388 };
389
390 // pre-emphasis differentiator 4000 Hz with 8KS/s
391 // a0,a1,b0,
392 static const int16_t taps_int_hpf_4000_1_2 = 2;
393 static const int32_t gain_int_hpf_4000_1_2 = 16384;
394 static const int16_t coef_int_hpf_4000_1_2[]={
395 17610,
396 -17610,
397 2454
398 };
399
400
401 /*
402         ltr crc table
403         from http://www.radioreference.com/forums/showthread.php?t=24126
404 */
405
406 static const u8 ltr_table[]=
407 {
408 0x38, // 00 Area                0111000
409 0x1c, // 01     Channel 4       0011100
410 0x0e, // 02 Channel 3   0001110
411 0x46, // 03 Channel 2   1000110
412 0x23, // 04 Channel 1   0100011
413 0x51, // 05 Channel 0   1010001
414 0x68, // 06 Home 4      1101000
415 0x75, // 07 Home 3              1110101
416 0x7a, // 08 Home 2              1111010
417 0x3d, // 09 Home 1              0111101
418 0x1f, // 10 Home 0              0011111
419 0x4f, // 11 Group 7     1001111
420 0x26, // 12 Group 6     0100110
421 0x52, // 13 Group 5     1010010
422 0x29, // 14 Group 4     0101001
423 0x15, // 15 Group 3     0010101
424 0x0d, // 16 Group 2     0001101
425 0x45, // 17 Group 1     1000101
426 0x62, // 18 Group 0     1100010
427 0x31, // 19 Free 4              0110001
428 0x19, // 20 Free 3              0011001
429 0x0d, // 21 Free 2              0001101
430 0x07, // 22 Free 1              0000111
431 0x43  // 23 Free 0              1000011
432 };
433
434 static const i16 bitWeight[]=
435 {
436 0,   // 0
437 1,   // 1
438 1,   // 2
439 2,   // 3
440 1,   // 4
441 2,   // 5
442 2,   // 6
443 3,   // 7
444 1,   // 8
445 2,   // 9
446 2,   // 10
447 3,   // 11
448 2,   // 12
449 3,   // 13
450 3,   // 14
451 4,   // 15
452 1,   // 16
453 2,   // 17
454 2,   // 18
455 3,   // 19
456 2,   // 20
457 3,   // 21
458 3,   // 22
459 4,   // 23
460 2,   // 24
461 3,   // 25
462 3,   // 26
463 4,   // 27
464 3,   // 28
465 4,   // 29
466 4,   // 30
467 5,   // 31
468 1,   // 32
469 2,   // 33
470 2,   // 34
471 3,   // 35
472 2,   // 36
473 3,   // 37
474 3,   // 38
475 4,   // 39
476 2,   // 40
477 3,   // 41
478 3,   // 42
479 4,   // 43
480 3,   // 44
481 4,   // 45
482 4,   // 46
483 5,   // 47
484 2,   // 48
485 3,   // 49
486 3,   // 50
487 4,   // 51
488 3,   // 52
489 4,   // 53
490 4,   // 54
491 5,   // 55
492 3,   // 56
493 4,   // 57
494 4,   // 58
495 5,   // 59
496 4,   // 60
497 5,   // 61
498 5,   // 62
499 6,   // 63
500 1,   // 64
501 2,   // 65
502 2,   // 66
503 3,   // 67
504 2,   // 68
505 3,   // 69
506 3,   // 70
507 4,   // 71
508 2,   // 72
509 3,   // 73
510 3,   // 74
511 4,   // 75
512 3,   // 76
513 4,   // 77
514 4,   // 78
515 5,   // 79
516 2,   // 80
517 3,   // 81
518 3,   // 82
519 4,   // 83
520 3,   // 84
521 4,   // 85
522 4,   // 86
523 5,   // 87
524 3,   // 88
525 4,   // 89
526 4,   // 90
527 5,   // 91
528 4,   // 92
529 5,   // 93
530 5,   // 94
531 6,   // 95
532 2,   // 96
533 3,   // 97
534 3,   // 98
535 4,   // 99
536 3,   // 100
537 4,   // 101
538 4,   // 102
539 5,   // 103
540 3,   // 104
541 4,   // 105
542 4,   // 106
543 5,   // 107
544 4,   // 108
545 5,   // 109
546 5,   // 110
547 6,   // 111
548 3,   // 112
549 4,   // 113
550 4,   // 114
551 5,   // 115
552 4,   // 116
553 5,   // 117
554 5,   // 118
555 6,   // 119
556 4,   // 120
557 5,   // 121
558 5,   // 122
559 6,   // 123
560 5,   // 124
561 6,   // 125
562 6,   // 126
563 7,   // 127
564 1,   // 128
565 2,   // 129
566 2,   // 130
567 3,   // 131
568 2,   // 132
569 3,   // 133
570 3,   // 134
571 4,   // 135
572 2,   // 136
573 3,   // 137
574 3,   // 138
575 4,   // 139
576 3,   // 140
577 4,   // 141
578 4,   // 142
579 5,   // 143
580 2,   // 144
581 3,   // 145
582 3,   // 146
583 4,   // 147
584 3,   // 148
585 4,   // 149
586 4,   // 150
587 5,   // 151
588 3,   // 152
589 4,   // 153
590 4,   // 154
591 5,   // 155
592 4,   // 156
593 5,   // 157
594 5,   // 158
595 6,   // 159
596 2,   // 160
597 3,   // 161
598 3,   // 162
599 4,   // 163
600 3,   // 164
601 4,   // 165
602 4,   // 166
603 5,   // 167
604 3,   // 168
605 4,   // 169
606 4,   // 170
607 5,   // 171
608 4,   // 172
609 5,   // 173
610 5,   // 174
611 6,   // 175
612 3,   // 176
613 4,   // 177
614 4,   // 178
615 5,   // 179
616 4,   // 180
617 5,   // 181
618 5,   // 182
619 6,   // 183
620 4,   // 184
621 5,   // 185
622 5,   // 186
623 6,   // 187
624 5,   // 188
625 6,   // 189
626 6,   // 190
627 7,   // 191
628 2,   // 192
629 3,   // 193
630 3,   // 194
631 4,   // 195
632 3,   // 196
633 4,   // 197
634 4,   // 198
635 5,   // 199
636 3,   // 200
637 4,   // 201
638 4,   // 202
639 5,   // 203
640 4,   // 204
641 5,   // 205
642 5,   // 206
643 6,   // 207
644 3,   // 208
645 4,   // 209
646 4,   // 210
647 5,   // 211
648 4,   // 212
649 5,   // 213
650 5,   // 214
651 6,   // 215
652 4,   // 216
653 5,   // 217
654 5,   // 218
655 6,   // 219
656 5,   // 220
657 6,   // 221
658 6,   // 222
659 7,   // 223
660 3,   // 224
661 4,   // 225
662 4,   // 226
663 5,   // 227
664 4,   // 228
665 5,   // 229
666 5,   // 230
667 6,   // 231
668 4,   // 232
669 5,   // 233
670 5,   // 234
671 6,   // 235
672 5,   // 236
673 6,   // 237
674 6,   // 238
675 7,   // 239
676 4,   // 240
677 5,   // 241
678 5,   // 242
679 6,   // 243
680 5,   // 244
681 6,   // 245
682 6,   // 246
683 7,   // 247
684 5,   // 248
685 6,   // 249
686 6,   // 250
687 7,   // 251
688 6,   // 252
689 7,   // 253
690 7,   // 254
691 8    // 255
692 };
693
694
695 /*
696         ctcss decode filter
697 */
698 /**************************************************************
699 Filter type: Low Pass
700 Filter model: Butterworth
701 Filter order: 9
702 Sampling Frequency: 8 KHz
703 Cut Frequency: 0.250000 KHz
704 Coefficents Quantization: 16-bit
705 ***************************************************************/
706 static const int16_t taps_fir_lpf_250_9_66 = 66;
707 static const int32_t gain_fir_lpf_250_9_66 = 262144;
708 static const int16_t coef_fir_lpf_250_9_66[] = 
709
710   676,
711   364,
712    -3,
713  -415,
714  -860,
715 -1320,
716 -1777,
717 -2209,
718 -2593,
719 -2904,
720 -3119,
721 -3212,
722 -3162,
723 -2949,
724 -2557,
725 -1975,
726 -1198,
727  -226,
728   932,
729  2263,
730  3744,
731  5346,
732  7034,
733  8767,
734 10499,
735 12184,
736 13770,
737 15211,
738 16462,
739 17480,
740 18234,
741 18696,
742 18852,
743 18696,
744 18234,
745 17480,
746 16462,
747 15211,
748 13770,
749 12184,
750 10499,
751  8767,
752  7034,
753  5346,
754  3744,
755  2263,
756   932,
757  -226,
758 -1198,
759 -1975,
760 -2557,
761 -2949,
762 -3162,
763 -3212,
764 -3119,
765 -2904,
766 -2593,
767 -2209,
768 -1777,
769 -1320,
770  -860,
771  -415,
772    -3,
773   364,
774   676,
775   927
776 };
777 /* *************************************************************
778 Filter type: Low Pass
779 Filter model: Butterworth
780 Filter order: 9
781 Sampling Frequency: 8 KHz
782 Cut Frequency: 0.215 KHz
783 Coefficents Quantization: 16-bit
784 ***************************************************************/
785 static const int16_t taps_fir_lpf_215_9_88 = 88;
786 static const int32_t gain_fir_lpf_215_9_88 = 524288;
787 static const int16_t coef_fir_lpf_215_9_88[] = {
788  2038,
789  2049,
790  1991,
791  1859,
792  1650,
793  1363,
794   999,
795   562,
796    58,
797  -502,
798 -1106,
799 -1739,
800 -2382,
801 -3014,
802 -3612,
803 -4153,
804 -4610,
805 -4959,
806 -5172,
807 -5226,
808 -5098,
809 -4769,
810 -4222,
811 -3444,
812 -2430,
813 -1176,
814   310,
815  2021,
816  3937,
817  6035,
818  8284,
819 10648,
820 13086,
821 15550,
822 17993,
823 20363,
824 22608,
825 24677,
826 26522,
827 28099,
828 29369,
829 30299,
830 30867,
831 31058,
832 30867,
833 30299,
834 29369,
835 28099,
836 26522,
837 24677,
838 22608,
839 20363,
840 17993,
841 15550,
842 13086,
843 10648,
844  8284,
845  6035,
846  3937,
847  2021,
848   310,
849 -1176,
850 -2430,
851 -3444,
852 -4222,
853 -4769,
854 -5098,
855 -5226,
856 -5172,
857 -4959,
858 -4610,
859 -4153,
860 -3612,
861 -3014,
862 -2382,
863 -1739,
864 -1106,
865  -502,
866    58,
867   562,
868   999,
869  1363,
870  1650,
871  1859,
872  1991,
873  2049,
874  2038,
875  1966
876 };
877 // end coef fir_lpf_215_9_88
878 //
879 /**************************************************************
880 Filter type: High Pass
881 Filter model: Butterworth
882 Filter order: 9
883 Sampling Frequency: 8 KHz
884 Cut Frequency: 0.300000 KHz
885 Coefficents Quantization: 16-bit
886 ***************************************************************/
887 static const int16_t taps_fir_hpf_300_9_66 = 66;
888 static const int32_t gain_fir_hpf_300_9_66 = 32768;
889 static const int16_t coef_fir_hpf_300_9_66[] = 
890
891  -141,
892  -114,
893   -77,
894   -30,
895    23,
896    83,
897   147,
898   210,
899   271,
900   324,
901   367,
902   396,
903   407,
904   396,
905   362,
906   302,
907   216,
908   102,
909   -36,
910  -199,
911  -383,
912  -585,
913  -798,
914 -1017,
915 -1237,
916 -1452,
917 -1653,
918 -1836,
919 -1995,
920 -2124,
921 -2219,
922 -2278,
923 30463,
924 -2278,
925 -2219,
926 -2124,
927 -1995,
928 -1836,
929 -1653,
930 -1452,
931 -1237,
932 -1017,
933  -798,
934  -585,
935  -383,
936  -199,
937   -36,
938   102,
939   216,
940   302,
941   362,
942   396,
943   407,
944   396,
945   367,
946   324,
947   271,
948   210,
949   147,
950    83,
951    23,
952   -30,
953   -77,
954  -114,
955  -141,
956  -158
957     };
958 #endif /* !XPMR_COEF_H */
959 /* end of file */
960
961
962
963