File: /usr/src/linux/drivers/net/hamradio/soundmodem/gentbl.c

1     /*****************************************************************************/
2     
3     /*
4      *      gentbl.c  -- soundcard radio modem driver table generator.
5      *
6      *      Copyright (C) 1996  Thomas Sailer (sailer@ife.ee.ethz.ch)
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., 675 Mass Ave, Cambridge, MA 02139, USA.
21      *
22      *  Please note that the GPL allows you to use the driver, NOT the radio.
23      *  In order to use the radio, you need a license from the communications
24      *  authority of your country.
25      *
26      */
27     
28     #include <stdio.h>
29     #include <stdlib.h>
30     #include <math.h>
31     #include <string.h>
32     
33     /* -------------------------------------------------------------------- */
34     
35     static void gentbl_offscostab(FILE *f, unsigned int nbits)
36     {
37     	int i;
38     
39     	fprintf(f, "\n/*\n * small cosine table in U8 format\n */\n"
40     		"#define OFFSCOSTABBITS %u\n"
41     		"#define OFFSCOSTABSIZE (1<<OFFSCOSTABBITS)\n\n", 
42     		nbits);
43     	fprintf(f, "static unsigned char offscostab[OFFSCOSTABSIZE] = {\n\t");
44     	for (i = 0; i < (1<<nbits); i++) {
45     		fprintf(f, "%4u", (int)
46     			(128+127.0*cos(i*2.0*M_PI/(1<<nbits))));
47     		if (i < (1<<nbits)-1) 
48     			fprintf(f, "%s", (i & 7) == 7 ? ",\n\t" : ",");
49     	}
50     	fprintf(f, "\n};\n\n"
51     		"#define OFFSCOS(x) offscostab[((x)>>%d)&0x%x]\n\n",
52     		16-nbits, (1<<nbits)-1);
53     }
54     
55     /* -------------------------------------------------------------------- */
56     
57     static void gentbl_costab(FILE *f, unsigned int nbits)
58     {
59             int i;
60     
61     	fprintf(f, "\n/*\n * more accurate cosine table\n */\n\n"
62     		"static const short costab[%d] = {", (1<<nbits));
63             for (i = 0; i < (1<<nbits); i++) {
64                     if (!(i & 7))
65                             fprintf(f, "\n\t");
66                     fprintf(f, "%6d", (int)(32767.0*cos(i*2.0*M_PI/(1<<nbits))));
67                     if (i != ((1<<nbits)-1))
68                             fprintf(f, ", ");
69             }
70             fprintf(f, "\n};\n\n#define COS(x) costab[((x)>>%d)&0x%x]\n"
71     		"#define SIN(x) COS((x)+0xc000)\n\n", 16-nbits,
72     		(1<<nbits)-1);
73     }
74     
75     /* -------------------------------------------------------------------- */
76     
77     #define AFSK12_SAMPLE_RATE 9600
78     #define AFSK12_TX_FREQ_LO 1200
79     #define AFSK12_TX_FREQ_HI 2200
80     #define AFSK12_CORRLEN 8
81     
82     static void gentbl_afsk1200(FILE *f)
83     {
84             int i, v, sum;
85     
86     #define ARGLO(x) 2.0*M_PI*(double)x*(double)AFSK12_TX_FREQ_LO/(double)AFSK12_SAMPLE_RATE
87     #define ARGHI(x) 2.0*M_PI*(double)x*(double)AFSK12_TX_FREQ_HI/(double)AFSK12_SAMPLE_RATE
88     
89     	fprintf(f, "\n/*\n * afsk1200 specific tables\n */\n"
90     		"#define AFSK12_SAMPLE_RATE %u\n"
91     		"#define AFSK12_TX_FREQ_LO %u\n"
92     		"#define AFSK12_TX_FREQ_HI %u\n"
93     		"#define AFSK12_CORRLEN %u\n\n",
94     		AFSK12_SAMPLE_RATE, AFSK12_TX_FREQ_LO, 
95     		AFSK12_TX_FREQ_HI, AFSK12_CORRLEN);
96     	fprintf(f, "static const int afsk12_tx_lo_i[] = {\n\t");
97             for(sum = i = 0; i < AFSK12_CORRLEN; i++) {
98     		sum += (v = 127.0*cos(ARGLO(i)));
99                     fprintf(f, " %4i%c", v, (i < AFSK12_CORRLEN-1) ? ',' : ' ');
100     	}
101             fprintf(f, "\n};\n#define SUM_AFSK12_TX_LO_I %d\n\n"
102     		"static const int afsk12_tx_lo_q[] = {\n\t", sum);
103             for(sum = i = 0; i < AFSK12_CORRLEN; i++) {
104     		sum += (v = 127.0*sin(ARGLO(i))); 
105                     fprintf(f, " %4i%c", v, (i < AFSK12_CORRLEN-1) ? ',' : ' ');
106     	}
107             fprintf(f, "\n};\n#define SUM_AFSK12_TX_LO_Q %d\n\n"
108     		"static const int afsk12_tx_hi_i[] = {\n\t", sum);
109             for(sum = i = 0; i < AFSK12_CORRLEN; i++) {
110     		sum += (v = 127.0*cos(ARGHI(i))); 
111                     fprintf(f, " %4i%c", v, (i < AFSK12_CORRLEN-1) ? ',' : ' ');
112     	}
113             fprintf(f, "\n};\n#define SUM_AFSK12_TX_HI_I %d\n\n"
114     		"static const int afsk12_tx_hi_q[] = {\n\t", sum);
115             for(sum = i = 0; i < AFSK12_CORRLEN; i++)  {
116     		sum += (v = 127.0*sin(ARGHI(i)));
117                     fprintf(f, " %4i%c", v, (i < AFSK12_CORRLEN-1) ? ',' : ' ');
118     	}
119     	fprintf(f, "\n};\n#define SUM_AFSK12_TX_HI_Q %d\n\n", sum);
120     #undef ARGLO
121     #undef ARGHI
122     }
123     
124     /* -------------------------------------------------------------------- */
125     
126     static const float fsk96_tx_coeff_4[32] = {
127                   -0.001152,        0.000554,        0.002698,        0.002753,
128                   -0.002033,       -0.008861,       -0.008002,        0.006607,
129                    0.023727,        0.018905,       -0.018056,       -0.057957,
130                   -0.044368,        0.055683,        0.207667,        0.322048,
131                    0.322048,        0.207667,        0.055683,       -0.044368,
132                   -0.057957,       -0.018056,        0.018905,        0.023727,
133                    0.006607,       -0.008002,       -0.008861,       -0.002033,
134                    0.002753,        0.002698,        0.000554,       -0.001152
135     };
136     
137     static const float fsk96_tx_coeff_5[40] = {
138                   -0.001009,       -0.000048,        0.001376,        0.002547,
139                    0.002061,       -0.001103,       -0.005795,       -0.008170,
140                   -0.004017,        0.006924,        0.018225,        0.019238,
141                    0.002925,       -0.025777,       -0.048064,       -0.039683,
142                    0.013760,        0.104144,        0.200355,        0.262346,
143                    0.262346,        0.200355,        0.104144,        0.013760,
144                   -0.039683,       -0.048064,       -0.025777,        0.002925,
145                    0.019238,        0.018225,        0.006924,       -0.004017,
146                   -0.008170,       -0.005795,       -0.001103,        0.002061,
147                    0.002547,        0.001376,       -0.000048,       -0.001009
148     };
149     
150     #define HAMMING(x) (0.54-0.46*cos(2*M_PI*(x)));
151     
152     static inline float hamming(float x)
153     {
154     	return 0.54-0.46*cos(2*M_PI*x);
155     }
156     
157     static inline float sinc(float x)
158     {
159     	if (x == 0)
160     		return 1;
161     	x *= M_PI;
162     	return sin(x)/x;
163     }
164     
165     static void gentbl_fsk9600(FILE *f)
166     {
167             int i, j, k, l, m;
168     	float s;
169     	float c[44];
170     	float min, max;
171     
172     	fprintf(f, "\n/*\n * fsk9600 specific tables\n */\n");
173     	min = max = 0;
174     	memset(c, 0, sizeof(c));
175     #if 0
176     	memcpy(c+2, fsk96_tx_coeff_4, sizeof(fsk96_tx_coeff_4));
177     #else
178     	for (i = 0; i < 29; i++)
179     		c[3+i] = sinc(1.2*((i-14.0)/4.0))*hamming(i/28.0)/3.5;
180     #endif
181     	fprintf(f, "static unsigned char fsk96_txfilt_4[] = {\n\t");
182     	for (i = 0; i < 4; i++) {
183     		for (j = 0; j < 256; j++) {
184     			for (k = 1, s = 0, l = i; k < 256; k <<= 1) {
185     				if (j & k) {
186     					for (m = 0; m < 4; m++, l++)
187     						s += c[l];
188     				} else {
189     					for (m = 0; m < 4; m++, l++)
190     						s -= c[l];
191     				}
192     			}
193     			s *= 0.75;
194     			if (s > max)
195     				max = s;
196     			if (s < min)
197     				min = s;
198     			fprintf(f, "%4d", (int)(128+127*s));
199     			if (i < 3 || j < 255)
200     				fprintf(f, ",%s", (j & 7) == 7 
201     					? "\n\t" : "");
202     		}
203     	}
204     #ifdef VERBOSE
205     	fprintf(stderr, "fsk9600: txfilt4: min = %f; max = %f\n", min, max);
206     #endif
207     	fprintf(f, "\n};\n\n");
208     	min = max = 0;
209     	memset(c, 0, sizeof(c));
210     #if 0
211     	memcpy(c+2, fsk96_tx_coeff_5, sizeof(fsk96_tx_coeff_5));
212     #else
213     	for (i = 0; i < 36; i++)
214     		c[4+i] = sinc(1.2*((i-17.5)/5.0))*hamming(i/35.0)/4.5;
215     #endif
216     	fprintf(f, "static unsigned char fsk96_txfilt_5[] = {\n\t");
217     	for (i = 0; i < 5; i++) {
218     		for (j = 0; j < 256; j++) {
219     			for (k = 1, s = 0, l = i; k < 256; k <<= 1) {
220     				if (j & k) {
221     					for (m = 0; m < 5; m++, l++)
222     						s += c[l];
223     				} else {
224     					for (m = 0; m < 5; m++, l++)
225     						s -= c[l];
226     				}
227     			}
228     			s *= 0.75;
229     			if (s > max)
230     				max = s;
231     			if (s < min)
232     				min = s;
233     			fprintf(f, "%4d", (int)(128+127*s));
234     			if (i < 4 || j < 255)
235     				fprintf(f, ",%s", (j & 7) == 7 
236     					? "\n\t" : "");
237     		}
238     	}
239     #ifdef VERBOSE
240     	fprintf(stderr, "fsk9600: txfilt5: min = %f; max = %f\n", min, max);
241     #endif
242     	fprintf(f, "\n};\n\n");
243     }
244     	
245     /* -------------------------------------------------------------------- */
246     
247     #define AFSK26_SAMPLERATE  16000
248     
249     #define AFSK26_NUMCAR      2
250     #define AFSK26_FIRSTCAR    2000
251     #define AFSK26_MSK_LEN     6
252     #define AFSK26_RXOVER      2
253     
254     #define AFSK26_DEMCORRLEN (2*AFSK26_MSK_LEN)
255     
256     #define AFSK26_WINDOW(x) ((1-cos(2.0*M_PI*(x)))/2.0)
257     
258     #define AFSK26_AMPL(x) (((x)?1.0:0.7))
259     
260     #undef AFSK26_AMPL
261     #define AFSK26_AMPL(x) 1
262     
263     static void gentbl_afsk2666(FILE *f)
264     {
265             int i, j, k, l, o, v, sumi, sumq;
266             float window[AFSK26_DEMCORRLEN*AFSK26_RXOVER];
267     	int cfreq[AFSK26_NUMCAR];
268     
269     	fprintf(f, "\n/*\n * afsk2666 specific tables\n */\n"
270     		"#define AFSK26_DEMCORRLEN %d\n"
271     		"#define AFSK26_SAMPLERATE %d\n\n", AFSK26_DEMCORRLEN,
272     		AFSK26_SAMPLERATE);
273     	fprintf(f, "static const unsigned int afsk26_carfreq[%d] = { ",
274     		AFSK26_NUMCAR);
275     	for (i = 0; i < AFSK26_NUMCAR; i++) {
276     		cfreq[i] = 0x10000*AFSK26_FIRSTCAR/AFSK26_SAMPLERATE+
277     			0x10000*i/AFSK26_MSK_LEN/2;
278     		fprintf(f, "0x%x", cfreq[i]);
279     		if (i < AFSK26_NUMCAR-1)
280     			fprintf(f, ", ");
281     	}
282     	fprintf(f, " };\n\n");
283             for (i = 0; i < AFSK26_DEMCORRLEN*AFSK26_RXOVER; i++)
284                     window[i] = AFSK26_WINDOW(((float)i)/(AFSK26_DEMCORRLEN*
285     						      AFSK26_RXOVER)) * 127.0;
286             fprintf(f, "\nstatic const struct {\n\t"
287                    "int i[%d];\n\tint q[%d];\n} afsk26_dem_tables[%d][%d] = {\n", 
288                    AFSK26_DEMCORRLEN, AFSK26_DEMCORRLEN, AFSK26_RXOVER, AFSK26_NUMCAR);
289             for (o = AFSK26_RXOVER-1; o >= 0; o--) {
290                     fprintf(f, "\t{\n");
291                     for (i = 0; i < AFSK26_NUMCAR; i++) {
292                             j = cfreq[i];
293                             fprintf(f, "\t\t{{ ");
294                             for (l = AFSK26_DEMCORRLEN-1, k = (j * o)/AFSK26_RXOVER, sumi = 0; l >= 0; 
295                                  l--, k = (k+j)&0xffffu) {
296     				sumi += (v = AFSK26_AMPL(i)*window[l*AFSK26_RXOVER+o]*
297     					 cos(M_PI*k/32768.0));
298                                     fprintf(f, "%6d%s", v, l ? ", " : " }, { ");
299     			}
300                             for (l = AFSK26_DEMCORRLEN-1, k = (j * o)/AFSK26_RXOVER, sumq = 0; l >= 0; 
301                                  l--, k = (k+j)&0xffffu) {
302     				sumq += (v = AFSK26_AMPL(i)*window[l*AFSK26_RXOVER+o]*
303     					 sin(M_PI*k/32768.0));
304                                     fprintf(f, "%6d%s", v, l ? ", " : " }}");
305     			}
306                             if (i < 1)
307                                     fprintf(f, ",");
308                             fprintf(f, "\n#define AFSK26_DEM_SUM_I_%d_%d %d\n"
309     				"#define AFSK26_DEM_SUM_Q_%d_%d %d\n", 
310     				AFSK26_RXOVER-1-o, i, sumi, AFSK26_RXOVER-1-o, i, sumq);
311                     }
312                     fprintf(f, "\t}%s\n", o ? "," : "");
313             }
314             fprintf(f, "};\n\n");
315     }
316     
317     /* -------------------------------------------------------------------- */
318     
319     #define ATAN_TABLEN 1024
320     
321     static void gentbl_atantab(FILE *f)
322     {
323             int i;
324             short x;
325     
326     	fprintf(f, "\n/*\n"
327     		" * arctan table (indexed by i/q; should really be indexed by i/(i+q)\n"
328     		" */\n""#define ATAN_TABLEN %d\n\n"
329     		"static const unsigned short atan_tab[ATAN_TABLEN+2] = {",
330                    ATAN_TABLEN);
331             for (i = 0; i <= ATAN_TABLEN; i++) {
332                     if (!(i & 7))
333                             fprintf(f, "\n\t");
334                     x = atan(i / (float)ATAN_TABLEN) / M_PI * 0x8000;
335                     fprintf(f, "%6d, ", x);
336             }
337             fprintf(f, "%6d\n};\n\n", x);
338     	
339     }
340     
341     /* -------------------------------------------------------------------- */
342     
343     #define PSK48_TXF_OVERSAMPLING 5
344     #define PSK48_TXF_NUMSAMPLES 16
345     #define PSK48_RXF_LEN     64
346     
347     static const float psk48_tx_coeff[80] = {
348                   -0.000379,       -0.000640,       -0.000000,        0.000772,
349                    0.000543,       -0.000629,       -0.001187,       -0.000000,
350                    0.001634,        0.001183,       -0.001382,       -0.002603,
351                   -0.000000,        0.003481,        0.002472,       -0.002828,
352                   -0.005215,       -0.000000,        0.006705,        0.004678,
353                   -0.005269,       -0.009584,       -0.000000,        0.012065,
354                    0.008360,       -0.009375,       -0.017028,       -0.000000,
355                    0.021603,        0.015123,       -0.017229,       -0.032012,
356                   -0.000000,        0.043774,        0.032544,       -0.040365,
357                   -0.084963,       -0.000000,        0.201161,        0.374060,
358                    0.374060,        0.201161,       -0.000000,       -0.084963,
359                   -0.040365,        0.032544,        0.043774,       -0.000000,
360                   -0.032012,       -0.017229,        0.015123,        0.021603,
361                   -0.000000,       -0.017028,       -0.009375,        0.008360,
362                    0.012065,       -0.000000,       -0.009584,       -0.005269,
363                    0.004678,        0.006705,       -0.000000,       -0.005215,
364                   -0.002828,        0.002472,        0.003481,       -0.000000,
365                   -0.002603,       -0.001382,        0.001183,        0.001634,
366                   -0.000000,       -0.001187,       -0.000629,        0.000543,
367                    0.000772,       -0.000000,       -0.000640,       -0.000379
368     };
369     
370     static const float psk48_rx_coeff[PSK48_RXF_LEN] = {
371                   -0.000219,        0.000360,        0.000873,        0.001080,
372                    0.000747,       -0.000192,       -0.001466,       -0.002436,
373                   -0.002328,       -0.000699,        0.002101,        0.004809,
374                    0.005696,        0.003492,       -0.001633,       -0.007660,
375                   -0.011316,       -0.009627,       -0.001780,        0.009712,
376                    0.019426,        0.021199,        0.011342,       -0.008583,
377                   -0.030955,       -0.044093,       -0.036634,       -0.002651,
378                    0.054742,        0.123101,        0.184198,        0.220219,
379                    0.220219,        0.184198,        0.123101,        0.054742,
380                   -0.002651,       -0.036634,       -0.044093,       -0.030955,
381                   -0.008583,        0.011342,        0.021199,        0.019426,
382                    0.009712,       -0.001780,       -0.009627,       -0.011316,
383                   -0.007660,       -0.001633,        0.003492,        0.005696,
384                    0.004809,        0.002101,       -0.000699,       -0.002328,
385                   -0.002436,       -0.001466,       -0.000192,        0.000747,
386                    0.001080,        0.000873,        0.000360,       -0.000219
387     };
388     
389     static void gentbl_psk4800(FILE *f)
390     {
391             int i, j, k;
392             short x;
393     
394     	fprintf(f, "\n/*\n * psk4800 specific tables\n */\n"
395     		"#define PSK48_TXF_OVERSAMPLING %d\n"
396     		"#define PSK48_TXF_NUMSAMPLES %d\n\n"
397     		"#define PSK48_SAMPLERATE  8000\n"
398     		"#define PSK48_CAR_FREQ    2000\n"
399     		"#define PSK48_PSK_LEN     5\n"
400     		"#define PSK48_RXF_LEN     %u\n"
401     		"#define PSK48_PHASEINC    (0x10000*PSK48_CAR_FREQ/PSK48_SAMPLERATE)\n"
402     		"#define PSK48_SPHASEINC   (0x10000/(2*PSK48_PSK_LEN))\n\n"
403     		"static const short psk48_tx_table[PSK48_TXF_OVERSAMPLING*"
404     		"PSK48_TXF_NUMSAMPLES*8*2] = {", 
405     		PSK48_TXF_OVERSAMPLING, PSK48_TXF_NUMSAMPLES, PSK48_RXF_LEN);
406             for (i = 0; i < PSK48_TXF_OVERSAMPLING; i++) {
407                     for (j = 0; j < PSK48_TXF_NUMSAMPLES; j++) {
408                             fprintf(f, "\n\t");
409                             for (k = 0; k < 8; k++) {
410                                     x = 32767.0 * cos(k*M_PI/4.0) * 
411                                             psk48_tx_coeff[j * PSK48_TXF_OVERSAMPLING + i];
412                                     fprintf(f, "%6d, ", x);
413                             }
414                             fprintf(f, "\n\t");
415                             for (k = 0; k < 8; k++) {
416                                     x = 32767.0 * sin(k*M_PI/4.0) * 
417                                             psk48_tx_coeff[j * PSK48_TXF_OVERSAMPLING + i];
418                                     fprintf(f, "%6d", x);
419                                     if (k != 7 || j != PSK48_TXF_NUMSAMPLES-1 || 
420                                         i != PSK48_TXF_OVERSAMPLING-1)
421                                             fprintf(f, ", ");
422                             }
423                     }
424             }
425             fprintf(f, "\n};\n\n");
426     
427     	fprintf(f, "static const short psk48_rx_coeff[PSK48_RXF_LEN] = {\n\t");
428     	for (i = 0; i < PSK48_RXF_LEN; i++) {
429     		fprintf(f, "%6d", (int)(psk48_rx_coeff[i]*32767.0));
430     		if (i < PSK48_RXF_LEN-1)
431     			fprintf(f, ",%s", (i & 7) == 7 ? "\n\t" : "");
432     	}
433     	fprintf(f, "\n};\n\n");
434     }
435     
436     /* -------------------------------------------------------------------- */
437     
438     static void gentbl_hapn4800(FILE *f)
439     {
440             int i, j, k, l;
441     	float s;
442     	float c[44];
443     	float min, max;
444     
445     	fprintf(f, "\n/*\n * hapn4800 specific tables\n */\n\n");
446     	/*
447     	 * firstly generate tables for the FM transmitter modulator
448     	 */
449     	min = max = 0;
450     	memset(c, 0, sizeof(c));
451     	for (i = 0; i < 24; i++)
452     		c[8+i] = sinc(1.5*((i-11.5)/8.0))*hamming(i/23.0)/2.4;
453     	for (i = 0; i < 24; i++)
454     		c[i] -= c[i+8];
455     	fprintf(f, "static unsigned char hapn48_txfilt_8[] = {\n\t");
456     	for (i = 0; i < 8; i++) {
457     		for (j = 0; j < 16; j++) {
458     			for (k = 1, s = 0, l = i; k < 16; k <<= 1, l += 8) {
459     				if (j & k)
460     					s += c[l];
461     				else 
462     					s -= c[l];
463     			}
464     			if (s > max)
465     				max = s;
466     			if (s < min)
467     				min = s;
468     			fprintf(f, "%4d", (int)(128+127*s));
469     			if (i < 7 || j < 15)
470     				fprintf(f, ",%s", (j & 7) == 7 
471     					? "\n\t" : "");
472     		}
473     	}
474     #ifdef VERBOSE
475     	fprintf(stderr, "hapn4800: txfilt8: min = %f; max = %f\n", min, max);
476     #endif
477     	fprintf(f, "\n};\n\n");
478     	min = max = 0;
479     	memset(c, 0, sizeof(c));
480     	for (i = 0; i < 30; i++)
481     		c[10+i] = sinc(1.5*((i-14.5)/10.0))*hamming(i/29.0)/2.4;
482     	for (i = 0; i < 30; i++)
483     		c[i] -= c[i+10];
484     	fprintf(f, "static unsigned char hapn48_txfilt_10[] = {\n\t");
485     	for (i = 0; i < 10; i++) {
486     		for (j = 0; j < 16; j++) {
487     			for (k = 1, s = 0, l = i; k < 16; k <<= 1, l += 10) {
488     				if (j & k) 
489     					s += c[l];
490     				else 
491     					s -= c[l];
492     			}
493     			if (s > max)
494     				max = s;
495     			if (s < min)
496     				min = s;
497     			fprintf(f, "%4d", (int)(128+127*s));
498     			if (i < 9 || j < 15)
499     				fprintf(f, ",%s", (j & 7) == 7 
500     					? "\n\t" : "");
501     		}
502     	}
503     #ifdef VERBOSE
504     	fprintf(stderr, "hapn4800: txfilt10: min = %f; max = %f\n", min, max);
505     #endif
506     	fprintf(f, "\n};\n\n");
507     	/*
508     	 * secondly generate tables for the PM transmitter modulator
509     	 */
510     	min = max = 0;
511     	memset(c, 0, sizeof(c));
512     	for (i = 0; i < 25; i++)
513     		c[i] = sinc(1.4*((i-12.0)/8.0))*hamming(i/24.0)/6.3;
514     	for (i = 0; i < 25; i++)
515     		for (j = 1; j < 8; j++)
516     			c[i] += c[i+j];
517     	fprintf(f, "static unsigned char hapn48_txfilt_pm8[] = {\n\t");
518     	for (i = 0; i < 8; i++) {
519     		for (j = 0; j < 16; j++) {
520     			for (k = 1, s = 0, l = i; k < 16; k <<= 1, l += 8) {
521     				if (j & k)
522     					s += c[l];
523     				else 
524     					s -= c[l];
525     			}
526     			if (s > max)
527     				max = s;
528     			if (s < min)
529     				min = s;
530     			fprintf(f, "%4d", (int)(128+127*s));
531     			if (i < 7 || j < 15)
532     				fprintf(f, ",%s", (j & 7) == 7 
533     					? "\n\t" : "");
534     		}
535     	}
536     #ifdef VERBOSE
537     	fprintf(stderr, "hapn4800: txfiltpm8: min = %f; max = %f\n", min, max);
538     #endif
539     	fprintf(f, "\n};\n\n");
540     	min = max = 0;
541     	memset(c, 0, sizeof(c));
542     	for (i = 0; i < 31; i++)
543     		c[10+i] = sinc(1.4*((i-15.0)/10.0))*hamming(i/30.0)/7.9;
544     	for (i = 0; i < 31; i++)
545     		for (j = 1; j < 10; j++)
546     			c[i] += c[i+j];
547     	fprintf(f, "static unsigned char hapn48_txfilt_pm10[] = {\n\t");
548     	for (i = 0; i < 10; i++) {
549     		for (j = 0; j < 16; j++) {
550     			for (k = 1, s = 0, l = i; k < 16; k <<= 1, l += 10) {
551     				if (j & k) 
552     					s += c[l];
553     				else 
554     					s -= c[l];
555     			}
556     			if (s > max)
557     				max = s;
558     			if (s < min)
559     				min = s;
560     			fprintf(f, "%4d", (int)(128+127*s));
561     			if (i < 9 || j < 15)
562     				fprintf(f, ",%s", (j & 7) == 7 
563     					? "\n\t" : "");
564     		}
565     	}
566     #ifdef VERBOSE
567     	fprintf(stderr, "hapn4800: txfiltpm10: min = %f; max = %f\n", min, max);
568     #endif
569     	fprintf(f, "\n};\n\n");
570     	
571     }
572     
573     /* -------------------------------------------------------------------- */
574     
575     #define AFSK24_SAMPLERATE  16000
576     #define AFSK24_CORRLEN     14
577     
578     static void gentbl_afsk2400(FILE *f, float tcm3105clk)
579     {
580     	int i, sum, v;
581     
582     	fprintf(f, "\n/*\n * afsk2400 specific tables (tcm3105 clk %7fHz)\n */\n"
583     		"#define AFSK24_TX_FREQ_LO %d\n"
584     		"#define AFSK24_TX_FREQ_HI %d\n"
585     		"#define AFSK24_BITPLL_INC %d\n"
586     		"#define AFSK24_SAMPLERATE %d\n\n", tcm3105clk, 
587     		(int)(tcm3105clk/3694.0), (int)(tcm3105clk/2015.0), 
588     		0x10000*2400/AFSK24_SAMPLERATE, AFSK24_SAMPLERATE);
589     
590     #define ARGLO(x) 2.0*M_PI*(double)x*(tcm3105clk/3694.0)/(double)AFSK24_SAMPLERATE
591     #define ARGHI(x) 2.0*M_PI*(double)x*(tcm3105clk/2015.0)/(double)AFSK24_SAMPLERATE
592     #define WINDOW(x) hamming((float)(x)/(AFSK24_CORRLEN-1.0))
593     
594     	fprintf(f, "static const int afsk24_tx_lo_i[] = {\n\t");
595             for(sum = i = 0; i < AFSK24_CORRLEN; i++) {
596     		sum += (v = 127.0*cos(ARGLO(i))*WINDOW(i));
597                     fprintf(f, " %4i%c", v, (i < AFSK24_CORRLEN-1) ? ',' : ' ');
598     	}
599             fprintf(f, "\n};\n#define SUM_AFSK24_TX_LO_I %d\n\n"
600     		"static const int afsk24_tx_lo_q[] = {\n\t", sum);
601             for(sum = i = 0; i < AFSK24_CORRLEN; i++) {
602     		sum += (v = 127.0*sin(ARGLO(i))*WINDOW(i)); 
603                     fprintf(f, " %4i%c", v, (i < AFSK24_CORRLEN-1) ? ',' : ' ');
604     	}
605             fprintf(f, "\n};\n#define SUM_AFSK24_TX_LO_Q %d\n\n"
606     		"static const int afsk24_tx_hi_i[] = {\n\t", sum);
607             for(sum = i = 0; i < AFSK24_CORRLEN; i++) {
608     		sum += (v = 127.0*cos(ARGHI(i))*WINDOW(i)); 
609                     fprintf(f, " %4i%c", v, (i < AFSK24_CORRLEN-1) ? ',' : ' ');
610     	}
611             fprintf(f, "\n};\n#define SUM_AFSK24_TX_HI_I %d\n\n"
612     		"static const int afsk24_tx_hi_q[] = {\n\t", sum);
613             for(sum = i = 0; i < AFSK24_CORRLEN; i++)  {
614     		sum += (v = 127.0*sin(ARGHI(i))*WINDOW(i));
615                     fprintf(f, " %4i%c", v, (i < AFSK24_CORRLEN-1) ? ',' : ' ');
616     	}
617     	fprintf(f, "\n};\n#define SUM_AFSK24_TX_HI_Q %d\n\n", sum);
618     #undef ARGLO
619     #undef ARGHI
620     #undef WINDOW
621     }
622     
623     /* -------------------------------------------------------------------- */
624     
625     static char *progname;
626     
627     static void gentbl_banner(FILE *f)
628     {
629     	fprintf(f, "/*\n * THIS FILE IS GENERATED AUTOMATICALLY BY %s, "
630     		"DO NOT EDIT!\n */\n\n", progname);
631     }
632     
633     /* -------------------------------------------------------------------- */
634     
635     int main(int argc, char *argv[])
636     {
637     	FILE *f;
638     	
639     	progname = argv[0];
640     	if (!(f = fopen("sm_tbl_afsk1200.h", "w")))
641     		exit(1);
642     	gentbl_banner(f);
643     	gentbl_offscostab(f, 6);
644     	gentbl_costab(f, 6);
645     	gentbl_afsk1200(f);
646     	fclose(f);
647     	if (!(f = fopen("sm_tbl_afsk2666.h", "w")))
648     		exit(1);
649     	gentbl_banner(f);
650     	gentbl_offscostab(f, 6);
651     	gentbl_costab(f, 6);
652     	gentbl_afsk2666(f);
653     	fclose(f);
654     	if (!(f = fopen("sm_tbl_psk4800.h", "w")))
655     		exit(1);
656     	gentbl_banner(f);
657     	gentbl_psk4800(f);
658     	gentbl_costab(f, 8);
659     	gentbl_atantab(f);
660     	fclose(f);
661     	if (!(f = fopen("sm_tbl_hapn4800.h", "w")))
662     		exit(1);
663     	gentbl_banner(f);
664     	gentbl_hapn4800(f);
665     	fclose(f);
666     	if (!(f = fopen("sm_tbl_fsk9600.h", "w")))
667     		exit(1);
668     	gentbl_banner(f);
669     	gentbl_fsk9600(f);
670     	fclose(f);
671     	if (!(f = fopen("sm_tbl_afsk2400_8.h", "w")))
672     		exit(1);
673     	gentbl_banner(f);
674     	gentbl_offscostab(f, 6);
675     	gentbl_costab(f, 6);
676     	gentbl_afsk2400(f, 8000000);
677     	fclose(f);
678     	if (!(f = fopen("sm_tbl_afsk2400_7.h", "w")))
679     		exit(1);
680     	gentbl_banner(f);
681     	gentbl_offscostab(f, 6);
682     	gentbl_costab(f, 6);
683     	gentbl_afsk2400(f, 7372800);
684     	fclose(f);
685     	exit(0);
686     }
687     
688     
689     /* -------------------------------------------------------------------- */
690