gentbl.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:23k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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