aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/channels/xpmr/xpmr_coef.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/channels/xpmr/xpmr_coef.h')
-rwxr-xr-xtrunk/channels/xpmr/xpmr_coef.h951
1 files changed, 951 insertions, 0 deletions
diff --git a/trunk/channels/xpmr/xpmr_coef.h b/trunk/channels/xpmr/xpmr_coef.h
new file mode 100755
index 000000000..fda6762da
--- /dev/null
+++ b/trunk/channels/xpmr/xpmr_coef.h
@@ -0,0 +1,951 @@
+/*
+ * xpmr_coef.h - for Xelatec Private Mobile Radio Processes
+ *
+ * All Rights Reserved. Copyright (C)2007, Xelatec, LLC
+ *
+ * 20070808 1235 Steven Henke, W9SH, sph@xelatec.com
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Private Land Mobile Radio Channel Voice and Signaling Processor
+ *
+ * \author Steven Henke, W9SH <sph@xelatec.com> Xelatec, LLC
+ */
+
+#ifndef XPMR_COEF_H
+#define XMPR_COEF_H 1
+
+// frequencies in 0.1 Hz
+const u32 dtmf_row[] =
+{
+ 6970, 7700, 8520, 9410
+};
+const u32 dtmf_col[] =
+{
+ 12090, 13360, 14770, 16330
+};
+
+const i16 coef_dcs_rx = 1488; // dcs rx data divisor for oversampling 8000/134.4
+const i16 coef_dcs_tx = 5952; // dcs tx data divisor
+
+const i16 coef_lsd_div = 672; // low speed data divisor
+const u32 coef_lsd_sync = 0x158; // 000101011000
+const u32 coef_lsd_sync_pattern[] = {0x0000000F, 0x0F0FF000};
+
+#define CTCSS_COEF_INT 120
+#define CTCSS_SAMPLE_RATE 8000
+#define TDIV(x) ((CTCSS_SAMPLE_RATE*1000/x)+5)/10
+
+i32 coef_ctcss[4][5]=
+{
+ // freq, divisor, integrator, filter
+ {770,TDIV(770),CTCSS_COEF_INT,0,0},
+ {1000,TDIV(1000),CTCSS_COEF_INT,0,0},
+ {1035,TDIV(1035),CTCSS_COEF_INT,0,0},
+ {0,0,0,0}
+};
+
+
+i16 coef_ctcss_div[]=
+{
+2985, // 00 067.0
+2782, // 01 071.9
+2688, // 02 074.4
+2597, // 03 077.0
+2509, // 04 079.7
+2424, // 05 082.5
+2342, // 06 085.4
+2260, // 07 088.5
+2186, // 08 091.5
+2110, // 09 094.8
+2053, // 10 097.4
+2000, // 11 100.0
+1932, // 12 103.5
+1866, // 13 107.2
+1803, // 14 110.9
+1742, // 15 114.8
+1684, // 16 118.8
+1626, // 17 123.0
+1571, // 18 127.3
+1517, // 19 131.8
+1465, // 20 136.5
+1415, // 21 141.3
+1368, // 22 146.2
+1321, // 23 151.4
+1276, // 24 156.7
+1233, // 25 162.2
+1191, // 26 167.9
+1151, // 27 173.8
+1112, // 28 179.9
+1074, // 29 186.2
+1037, // 30 192.8
+983, // 31 203.5
+949, // 32 210.7
+917, // 33 218.1
+886, // 34 225.7
+856, // 35 233.6
+827, // 36 241.8
+799 // 37 250.3
+};
+
+float freq_ctcss[]=
+{
+067.0, // 00
+071.9, // 01
+074.4, // 02
+077.0, // 03
+079.7, // 04
+082.5, // 05
+085.4, // 06
+088.5, // 07
+091.5, // 08
+094.8, // 09
+097.4, // 10
+100.0, // 11
+103.5, // 12
+107.2, // 13
+110.9, // 14
+114.8, // 15
+118.8, // 16
+123.0, // 17
+127.3, // 18
+131.8, // 19
+136.5, // 20
+141.3, // 21
+146.2, // 22
+151.4, // 23
+156.7, // 24
+162.2, // 25
+167.9, // 26
+173.8, // 27
+179.9, // 28
+186.2, // 29
+192.8, // 30
+203.5, // 31
+210.7 , // 32
+218.1 , // 33
+225.7 , // 34
+233.6 , // 35
+241.8 , // 36
+250.3 // 37
+};
+
+/*
+ noise squelch carrier detect filter
+*/
+static const int16_t taps_fir_bpf_noise_1 = 66;
+static const int32_t gain_fir_bpf_noise_1 = 65536;
+static const int16_t coef_fir_bpf_noise_1[] = {
+ 139,
+ -182,
+ -269,
+ -66,
+ 56,
+ 59,
+ 250,
+ 395,
+ -80,
+ -775,
+ -557,
+ 437,
+ 779,
+ 210,
+ -17,
+ 123,
+ -692,
+ -1664,
+ -256,
+ 2495,
+ 2237,
+ -1018,
+ -2133,
+ -478,
+ -1134,
+ -2711,
+ 2642,
+ 10453,
+ 4010,
+ -14385,
+ -16488,
+ 6954,
+ 23030,
+ 6954,
+ -16488,
+ -14385,
+ 4010,
+ 10453,
+ 2642,
+ -2711,
+ -1134,
+ -478,
+ -2133,
+ -1018,
+ 2237,
+ 2495,
+ -256,
+ -1664,
+ -692,
+ 123,
+ -17,
+ 210,
+ 779,
+ 437,
+ -557,
+ -775,
+ -80,
+ 395,
+ 250,
+ 59,
+ 56,
+ -66,
+ -269,
+ -182,
+ 139,
+ 257
+};
+/*
+ tbd
+*/
+static const int16_t taps_fir_lpf_3K_1 = 66;
+static const int32_t gain_fir_lpf_3K_1 = 131072;
+static const int16_t coef_fir_lpf_3K_1[] = {
+ 259,
+ 58,
+ -185,
+ -437,
+ -654,
+ -793,
+ -815,
+ -696,
+ -434,
+ -48,
+ 414,
+ 886,
+ 1284,
+ 1523,
+ 1529,
+ 1254,
+ 691,
+ -117,
+ -1078,
+ -2049,
+ -2854,
+ -3303,
+ -3220,
+ -2472,
+ -995,
+ 1187,
+ 3952,
+ 7086,
+ 10300,
+ 13270,
+ 15672,
+ 17236,
+ 17778,
+ 17236,
+ 15672,
+ 13270,
+ 10300,
+ 7086,
+ 3952,
+ 1187,
+ -995,
+ -2472,
+ -3220,
+ -3303,
+ -2854,
+ -2049,
+ -1078,
+ -117,
+ 691,
+ 1254,
+ 1529,
+ 1523,
+ 1284,
+ 886,
+ 414,
+ -48,
+ -434,
+ -696,
+ -815,
+ -793,
+ -654,
+ -437,
+ -185,
+ 58,
+ 259,
+ 393
+};
+
+/**************************************************************
+Filter type: Low Pass
+Filter model: Butterworth
+Filter order: 9
+Sampling Frequency: 8 KHz
+Cut Frequency: 0.250000 KHz
+Coefficents Quantization: 16-bit
+***************************************************************/
+static const int16_t taps_fir_lpf_250_11_64 = 64;
+static const int32_t gain_fir_lpf_250_11_64 = 262144;
+static const int16_t coef_fir_lpf_250_11_64[] =
+{
+ 366,
+ -3,
+ -418,
+ -865,
+ -1328,
+ -1788,
+ -2223,
+ -2609,
+ -2922,
+ -3138,
+ -3232,
+ -3181,
+ -2967,
+ -2573,
+ -1988,
+ -1206,
+ -228,
+ 937,
+ 2277,
+ 3767,
+ 5379,
+ 7077,
+ 8821,
+ 10564,
+ 12259,
+ 13855,
+ 15305,
+ 16563,
+ 17588,
+ 18346,
+ 18812,
+ 18968,
+ 18812,
+ 18346,
+ 17588,
+ 16563,
+ 15305,
+ 13855,
+ 12259,
+ 10564,
+ 8821,
+ 7077,
+ 5379,
+ 3767,
+ 2277,
+ 937,
+ -228,
+ -1206,
+ -1988,
+ -2573,
+ -2967,
+ -3181,
+ -3232,
+ -3138,
+ -2922,
+ -2609,
+ -2223,
+ -1788,
+ -1328,
+ -865,
+ -418,
+ -3,
+ 366,
+ 680
+};
+
+// de-emphasis integrator 300 Hz with 8KS/s
+// a0, b1
+static const int16_t taps_int_lpf_300_1_2 = 2;
+static const int32_t gain_int_lpf_300_1_2 = 8182;
+static const int16_t coef_int_lpf_300_1_2[]={
+6878,
+25889
+};
+
+// pre-emphasis differentiator 4000 Hz with 8KS/s
+// a0,a1,b0,
+static const int16_t taps_int_hpf_4000_1_2 = 2;
+static const int32_t gain_int_hpf_4000_1_2 = 16384;
+static const int16_t coef_int_hpf_4000_1_2[]={
+17610,
+-17610,
+2454
+};
+
+
+/*
+ ltr crc table
+ from http://www.radioreference.com/forums/showthread.php?t=24126
+*/
+
+static const u8 ltr_table[]=
+{
+0x38, // 00 Area 0111000
+0x1c, // 01 Channel 4 0011100
+0x0e, // 02 Channel 3 0001110
+0x46, // 03 Channel 2 1000110
+0x23, // 04 Channel 1 0100011
+0x51, // 05 Channel 0 1010001
+0x68, // 06 Home 4 1101000
+0x75, // 07 Home 3 1110101
+0x7a, // 08 Home 2 1111010
+0x3d, // 09 Home 1 0111101
+0x1f, // 10 Home 0 0011111
+0x4f, // 11 Group 7 1001111
+0x26, // 12 Group 6 0100110
+0x52, // 13 Group 5 1010010
+0x29, // 14 Group 4 0101001
+0x15, // 15 Group 3 0010101
+0x0d, // 16 Group 2 0001101
+0x45, // 17 Group 1 1000101
+0x62, // 18 Group 0 1100010
+0x31, // 19 Free 4 0110001
+0x19, // 20 Free 3 0011001
+0x0d, // 21 Free 2 0001101
+0x07, // 22 Free 1 0000111
+0x43 // 23 Free 0 1000011
+};
+
+static const i16 bitWeight[]=
+{
+0, // 0
+1, // 1
+1, // 2
+2, // 3
+1, // 4
+2, // 5
+2, // 6
+3, // 7
+1, // 8
+2, // 9
+2, // 10
+3, // 11
+2, // 12
+3, // 13
+3, // 14
+4, // 15
+1, // 16
+2, // 17
+2, // 18
+3, // 19
+2, // 20
+3, // 21
+3, // 22
+4, // 23
+2, // 24
+3, // 25
+3, // 26
+4, // 27
+3, // 28
+4, // 29
+4, // 30
+5, // 31
+1, // 32
+2, // 33
+2, // 34
+3, // 35
+2, // 36
+3, // 37
+3, // 38
+4, // 39
+2, // 40
+3, // 41
+3, // 42
+4, // 43
+3, // 44
+4, // 45
+4, // 46
+5, // 47
+2, // 48
+3, // 49
+3, // 50
+4, // 51
+3, // 52
+4, // 53
+4, // 54
+5, // 55
+3, // 56
+4, // 57
+4, // 58
+5, // 59
+4, // 60
+5, // 61
+5, // 62
+6, // 63
+1, // 64
+2, // 65
+2, // 66
+3, // 67
+2, // 68
+3, // 69
+3, // 70
+4, // 71
+2, // 72
+3, // 73
+3, // 74
+4, // 75
+3, // 76
+4, // 77
+4, // 78
+5, // 79
+2, // 80
+3, // 81
+3, // 82
+4, // 83
+3, // 84
+4, // 85
+4, // 86
+5, // 87
+3, // 88
+4, // 89
+4, // 90
+5, // 91
+4, // 92
+5, // 93
+5, // 94
+6, // 95
+2, // 96
+3, // 97
+3, // 98
+4, // 99
+3, // 100
+4, // 101
+4, // 102
+5, // 103
+3, // 104
+4, // 105
+4, // 106
+5, // 107
+4, // 108
+5, // 109
+5, // 110
+6, // 111
+3, // 112
+4, // 113
+4, // 114
+5, // 115
+4, // 116
+5, // 117
+5, // 118
+6, // 119
+4, // 120
+5, // 121
+5, // 122
+6, // 123
+5, // 124
+6, // 125
+6, // 126
+7, // 127
+1, // 128
+2, // 129
+2, // 130
+3, // 131
+2, // 132
+3, // 133
+3, // 134
+4, // 135
+2, // 136
+3, // 137
+3, // 138
+4, // 139
+3, // 140
+4, // 141
+4, // 142
+5, // 143
+2, // 144
+3, // 145
+3, // 146
+4, // 147
+3, // 148
+4, // 149
+4, // 150
+5, // 151
+3, // 152
+4, // 153
+4, // 154
+5, // 155
+4, // 156
+5, // 157
+5, // 158
+6, // 159
+2, // 160
+3, // 161
+3, // 162
+4, // 163
+3, // 164
+4, // 165
+4, // 166
+5, // 167
+3, // 168
+4, // 169
+4, // 170
+5, // 171
+4, // 172
+5, // 173
+5, // 174
+6, // 175
+3, // 176
+4, // 177
+4, // 178
+5, // 179
+4, // 180
+5, // 181
+5, // 182
+6, // 183
+4, // 184
+5, // 185
+5, // 186
+6, // 187
+5, // 188
+6, // 189
+6, // 190
+7, // 191
+2, // 192
+3, // 193
+3, // 194
+4, // 195
+3, // 196
+4, // 197
+4, // 198
+5, // 199
+3, // 200
+4, // 201
+4, // 202
+5, // 203
+4, // 204
+5, // 205
+5, // 206
+6, // 207
+3, // 208
+4, // 209
+4, // 210
+5, // 211
+4, // 212
+5, // 213
+5, // 214
+6, // 215
+4, // 216
+5, // 217
+5, // 218
+6, // 219
+5, // 220
+6, // 221
+6, // 222
+7, // 223
+3, // 224
+4, // 225
+4, // 226
+5, // 227
+4, // 228
+5, // 229
+5, // 230
+6, // 231
+4, // 232
+5, // 233
+5, // 234
+6, // 235
+5, // 236
+6, // 237
+6, // 238
+7, // 239
+4, // 240
+5, // 241
+5, // 242
+6, // 243
+5, // 244
+6, // 245
+6, // 246
+7, // 247
+5, // 248
+6, // 249
+6, // 250
+7, // 251
+6, // 252
+7, // 253
+7, // 254
+8 // 255
+};
+
+
+/*
+ ctcss decode filter
+*/
+/**************************************************************
+Filter type: Low Pass
+Filter model: Butterworth
+Filter order: 9
+Sampling Frequency: 8 KHz
+Cut Frequency: 0.250000 KHz
+Coefficents Quantization: 16-bit
+***************************************************************/
+static const int16_t taps_fir_lpf_250_9_66 = 66;
+static const int32_t gain_fir_lpf_250_9_66 = 262144;
+static const int16_t coef_fir_lpf_250_9_66[] =
+{
+ 676,
+ 364,
+ -3,
+ -415,
+ -860,
+-1320,
+-1777,
+-2209,
+-2593,
+-2904,
+-3119,
+-3212,
+-3162,
+-2949,
+-2557,
+-1975,
+-1198,
+ -226,
+ 932,
+ 2263,
+ 3744,
+ 5346,
+ 7034,
+ 8767,
+10499,
+12184,
+13770,
+15211,
+16462,
+17480,
+18234,
+18696,
+18852,
+18696,
+18234,
+17480,
+16462,
+15211,
+13770,
+12184,
+10499,
+ 8767,
+ 7034,
+ 5346,
+ 3744,
+ 2263,
+ 932,
+ -226,
+-1198,
+-1975,
+-2557,
+-2949,
+-3162,
+-3212,
+-3119,
+-2904,
+-2593,
+-2209,
+-1777,
+-1320,
+ -860,
+ -415,
+ -3,
+ 364,
+ 676,
+ 927
+};
+/* *************************************************************
+Filter type: Low Pass
+Filter model: Butterworth
+Filter order: 9
+Sampling Frequency: 8 KHz
+Cut Frequency: 0.215 KHz
+Coefficents Quantization: 16-bit
+***************************************************************/
+static const int16_t taps_fir_lpf_215_9_88 = 88;
+static const int32_t gain_fir_lpf_215_9_88 = 524288;
+static const int16_t coef_fir_lpf_215_9_88[] = {
+ 2038,
+ 2049,
+ 1991,
+ 1859,
+ 1650,
+ 1363,
+ 999,
+ 562,
+ 58,
+ -502,
+-1106,
+-1739,
+-2382,
+-3014,
+-3612,
+-4153,
+-4610,
+-4959,
+-5172,
+-5226,
+-5098,
+-4769,
+-4222,
+-3444,
+-2430,
+-1176,
+ 310,
+ 2021,
+ 3937,
+ 6035,
+ 8284,
+10648,
+13086,
+15550,
+17993,
+20363,
+22608,
+24677,
+26522,
+28099,
+29369,
+30299,
+30867,
+31058,
+30867,
+30299,
+29369,
+28099,
+26522,
+24677,
+22608,
+20363,
+17993,
+15550,
+13086,
+10648,
+ 8284,
+ 6035,
+ 3937,
+ 2021,
+ 310,
+-1176,
+-2430,
+-3444,
+-4222,
+-4769,
+-5098,
+-5226,
+-5172,
+-4959,
+-4610,
+-4153,
+-3612,
+-3014,
+-2382,
+-1739,
+-1106,
+ -502,
+ 58,
+ 562,
+ 999,
+ 1363,
+ 1650,
+ 1859,
+ 1991,
+ 2049,
+ 2038,
+ 1966
+};
+// end coef fir_lpf_215_9_88
+//
+/**************************************************************
+Filter type: High Pass
+Filter model: Butterworth
+Filter order: 9
+Sampling Frequency: 8 KHz
+Cut Frequency: 0.300000 KHz
+Coefficents Quantization: 16-bit
+***************************************************************/
+static const int16_t taps_fir_hpf_300_9_66 = 66;
+static const int32_t gain_fir_hpf_300_9_66 = 32768;
+static const int16_t coef_fir_hpf_300_9_66[] =
+{
+ -141,
+ -114,
+ -77,
+ -30,
+ 23,
+ 83,
+ 147,
+ 210,
+ 271,
+ 324,
+ 367,
+ 396,
+ 407,
+ 396,
+ 362,
+ 302,
+ 216,
+ 102,
+ -36,
+ -199,
+ -383,
+ -585,
+ -798,
+-1017,
+-1237,
+-1452,
+-1653,
+-1836,
+-1995,
+-2124,
+-2219,
+-2278,
+30463,
+-2278,
+-2219,
+-2124,
+-1995,
+-1836,
+-1653,
+-1452,
+-1237,
+-1017,
+ -798,
+ -585,
+ -383,
+ -199,
+ -36,
+ 102,
+ 216,
+ 302,
+ 362,
+ 396,
+ 407,
+ 396,
+ 367,
+ 324,
+ 271,
+ 210,
+ 147,
+ 83,
+ 23,
+ -30,
+ -77,
+ -114,
+ -141,
+ -158
+ };
+#endif /* !XPMR_COEF_H */
+/* end of file */
+
+
+
+