1 | /*
|
---|
2 | =============================================================================
|
---|
3 | htgen.c -- Harmonic table file generator for MIDAS-VII
|
---|
4 | Written by: D.N. Lynx Crowe
|
---|
5 |
|
---|
6 | See VERSION, below, for version number and date.
|
---|
7 |
|
---|
8 | This program creates a .h file to be included as harmonic
|
---|
9 | coefficient tables for MIDAS-VII.
|
---|
10 |
|
---|
11 | WIDTH is the number of points in the table
|
---|
12 | CENTER is the center point in the table
|
---|
13 | N is the number of points scanned on either side of CENTER
|
---|
14 | K and L are the lower and upper limits of the scan, respectively
|
---|
15 | PER is the number of values generated per line
|
---|
16 |
|
---|
17 | HARM is the number of harmonics generated
|
---|
18 | i is the harmonic number (1 is the fundamental)
|
---|
19 | j is the point number, K LE j LE L
|
---|
20 | =============================================================================
|
---|
21 | */
|
---|
22 |
|
---|
23 | #include "stdio.h"
|
---|
24 | #include "math.h"
|
---|
25 | #include "stddefs.h"
|
---|
26 |
|
---|
27 | #define PGMNAME "htgen"
|
---|
28 | #define VERSION "Version 2 -- 1988-09-20"
|
---|
29 |
|
---|
30 | #define FILENAME "knmtab.h" /* output file name */
|
---|
31 | #define TABNAME "knmtab" /* table name */
|
---|
32 |
|
---|
33 | #define WIDTH 256 /* table width */
|
---|
34 | #define RANGE 1023 /* maximum value */
|
---|
35 | #define HARM 32 /* number of harmonics */
|
---|
36 |
|
---|
37 | #define N 115 /* number of points scanned */
|
---|
38 | #define PER 16 /* values per line */
|
---|
39 |
|
---|
40 | #define CENTER ((WIDTH/2)-1) /* center of the table */
|
---|
41 | #define K (CENTER-N) /* first point scanned */
|
---|
42 | #define L (CENTER+N) /* last point scanned */
|
---|
43 |
|
---|
44 | #define M_PI 3.14159265358979323846
|
---|
45 | #define M_HALFPI (M_PI / 2.0)
|
---|
46 |
|
---|
47 | #define ACOSFN(x) atan(sqrt(1.0 - (x * x)) / x)
|
---|
48 |
|
---|
49 | extern char *now(); /* get current date-time group */
|
---|
50 | extern char *strcat(); /* append a string onto another */
|
---|
51 | extern char *strcpy(); /* copy a string into another */
|
---|
52 |
|
---|
53 | /* |
---|
54 |
|
---|
55 | */
|
---|
56 |
|
---|
57 | /* variables */
|
---|
58 |
|
---|
59 | double a; /* unscaled harmonic coefficient */
|
---|
60 | double c; /* scaled harmonic coefficient */
|
---|
61 | double y; /* intermediate coefficient value */
|
---|
62 |
|
---|
63 | double ltend; /* left endpoint value */
|
---|
64 | double rtend; /* right endpoint value */
|
---|
65 |
|
---|
66 | double hartab[WIDTH]; /* the current harmonic table */
|
---|
67 |
|
---|
68 | int nol; /* number of values on the line so far */
|
---|
69 |
|
---|
70 | FILE *fp; /* output file pointer */
|
---|
71 |
|
---|
72 | char bar[81]; /* bar of equal signs */
|
---|
73 | char dtg[32]; /* date-time group */
|
---|
74 | char intc[32]; /* value output work area */
|
---|
75 | char result[128]; /* line output work area */
|
---|
76 |
|
---|
77 | /* |
---|
78 |
|
---|
79 | */
|
---|
80 |
|
---|
81 | /*
|
---|
82 | =============================================================================
|
---|
83 | CalcArc() -- Calculate the scaled Arc Cosine of 'arg'
|
---|
84 | =============================================================================
|
---|
85 | */
|
---|
86 |
|
---|
87 | double
|
---|
88 | CalcArc(arg)
|
---|
89 | double arg;
|
---|
90 | {
|
---|
91 | double y;
|
---|
92 |
|
---|
93 | if (arg EQ 0.0) /* Return PI/2 if arg = 0.0 */
|
---|
94 | return((double)M_HALFPI);
|
---|
95 |
|
---|
96 | y = ACOSFN(arg);
|
---|
97 |
|
---|
98 | if (arg < 0.0) /* Adjust by PI if arg was negative */
|
---|
99 | y = y + (double)M_PI;
|
---|
100 |
|
---|
101 | return(y);
|
---|
102 | }
|
---|
103 |
|
---|
104 | /*
|
---|
105 | =============================================================================
|
---|
106 | DoOut() -- Output result string
|
---|
107 | =============================================================================
|
---|
108 | */
|
---|
109 |
|
---|
110 | DoOut(j, k)
|
---|
111 | int j, k;
|
---|
112 | {
|
---|
113 | if (j EQ (WIDTH - 1)) { /* end of line ? */
|
---|
114 |
|
---|
115 | if (k EQ HARM) /* last table ? */
|
---|
116 | fprintf(fp, "\t%s }\t/* %3d */\n", result, j);
|
---|
117 | else
|
---|
118 | fprintf(fp, "\t%s },\t/* %3d */\n", result, j);
|
---|
119 |
|
---|
120 | } else {
|
---|
121 |
|
---|
122 | fprintf(fp, "\t%s,\t/* %3d */\n", result, j);
|
---|
123 | }
|
---|
124 |
|
---|
125 | result[0] = '\0';
|
---|
126 | nol = 0;
|
---|
127 | }
|
---|
128 |
|
---|
129 | /* |
---|
130 |
|
---|
131 | */
|
---|
132 |
|
---|
133 | main()
|
---|
134 | {
|
---|
135 | register int c, i, j;
|
---|
136 |
|
---|
137 | printf("\n%s -- %s -- run on ",
|
---|
138 | PGMNAME, VERSION);
|
---|
139 |
|
---|
140 | now(dtg);
|
---|
141 |
|
---|
142 | printf("%10.10s at %s\n\n",
|
---|
143 | dtg, &dtg[12]);
|
---|
144 |
|
---|
145 | for (c = 0; c < 3; c++)
|
---|
146 | bar[c] = ' ';
|
---|
147 |
|
---|
148 | for (; c < 80; c++)
|
---|
149 | bar[c] = '=';
|
---|
150 |
|
---|
151 | bar[80] = '\0';
|
---|
152 |
|
---|
153 | printf("Generating coefficient tables for %d harmonics\n\n", HARM);
|
---|
154 |
|
---|
155 | printf("Full scale range = %d\n", RANGE);
|
---|
156 | printf("Width of table = %d\n", WIDTH);
|
---|
157 | printf("Center of table = %d\n", CENTER);
|
---|
158 | printf("Scan width (N) = %d\n", N);
|
---|
159 | printf("Points scanned = %d thru %d\n\n", K, L);
|
---|
160 |
|
---|
161 | printf("Creating file \"%s\"\n", FILENAME);
|
---|
162 |
|
---|
163 | if ((FILE *)NULL EQ (fp = fopen(FILENAME, "w"))) {
|
---|
164 |
|
---|
165 | printf("ERROR: unable to open \"%s\" for writing\n", FILENAME);
|
---|
166 | exit(1);
|
---|
167 | }
|
---|
168 |
|
---|
169 | printf("\n");
|
---|
170 |
|
---|
171 | fprintf(fp, "/*\n%s\n\t %s -- MIDAS-VII Harmonic coefficient tables\n",
|
---|
172 | bar, FILENAME);
|
---|
173 |
|
---|
174 | fprintf(fp, "\tCalculated %10.10s -- %s\n%s\n*/\n\n",
|
---|
175 | dtg, &dtg[12], bar);
|
---|
176 |
|
---|
177 | fprintf(fp, "/*\n%s\n", bar);
|
---|
178 | fprintf(fp, "\tCalculated by htgen.c -- %s\n", VERSION);
|
---|
179 | fprintf(fp, "\tfor MIDAS-VII using:\n");
|
---|
180 | fprintf(fp, "\n");
|
---|
181 | fprintf(fp, "\t\tFull scale range = %d\n", RANGE);
|
---|
182 | fprintf(fp, "\n");
|
---|
183 | fprintf(fp, "\t\tWidth of table = %d\n", WIDTH);
|
---|
184 | fprintf(fp, "\t\tCenter of table = %d\n", CENTER);
|
---|
185 | fprintf(fp, "\t\tScan width (N) = %d\n", N);
|
---|
186 | fprintf(fp, "\t\tPoints scanned = %d thru %d\n", K, L);
|
---|
187 | fprintf(fp, "%s\n*/\n\n", bar);
|
---|
188 |
|
---|
189 | fprintf(fp, "short\t%s[%d][%d] = {\n", TABNAME, HARM, WIDTH);
|
---|
190 | fprintf(fp, "\n");
|
---|
191 |
|
---|
192 | /* |
---|
193 |
|
---|
194 | */
|
---|
195 | for (i = 1; i < (HARM + 1); i++) {
|
---|
196 |
|
---|
197 | printf("Calculating harmonic %d ...\r", i);
|
---|
198 |
|
---|
199 | for (j = K; j < (L + 1); j++) {
|
---|
200 |
|
---|
201 | y = CalcArc((double)(j - CENTER) / (double)N);
|
---|
202 | a = cos((double)i * y);
|
---|
203 | hartab[j] = ((double)RANGE * a) + 0.5;
|
---|
204 | }
|
---|
205 |
|
---|
206 | ltend = hartab[K];
|
---|
207 | rtend = hartab[L];
|
---|
208 |
|
---|
209 | printf("Outputting harmonic %d ...\r", i);
|
---|
210 |
|
---|
211 | if (i & 1) {
|
---|
212 |
|
---|
213 | fprintf(fp, "/* \f\n");
|
---|
214 | fprintf(fp, "*/\n");
|
---|
215 | }
|
---|
216 |
|
---|
217 | fprintf(fp, "\n");
|
---|
218 | fprintf(fp, "/* Harmonic table # %d */\n", i);
|
---|
219 | fprintf(fp, "\n");
|
---|
220 |
|
---|
221 | nol = 1;
|
---|
222 | result[0] = '\0';
|
---|
223 | sprintf(intc, "%5d", (int)ltend);
|
---|
224 |
|
---|
225 | for (j = 0; j < K; j++) {
|
---|
226 |
|
---|
227 | if (nol EQ 1) {
|
---|
228 |
|
---|
229 | if (j EQ 0)
|
---|
230 | strcat(strcat(result, "{"), intc);
|
---|
231 | else
|
---|
232 | strcat(strcat(result, " "), intc);
|
---|
233 |
|
---|
234 | } else {
|
---|
235 |
|
---|
236 | strcat(strcat(result, ","), intc);
|
---|
237 | }
|
---|
238 |
|
---|
239 | if (nol EQ PER)
|
---|
240 | DoOut(j, i);
|
---|
241 |
|
---|
242 | ++nol;
|
---|
243 | }
|
---|
244 | /* |
---|
245 |
|
---|
246 | */
|
---|
247 | for (; j < (L + 1); j++) {
|
---|
248 |
|
---|
249 | sprintf(intc, "%5d", (int)hartab[j]);
|
---|
250 |
|
---|
251 | if (nol EQ 1)
|
---|
252 | strcat(strcat(result, " "), intc);
|
---|
253 | else
|
---|
254 | strcat(strcat(result, ","), intc);
|
---|
255 |
|
---|
256 | if (nol EQ PER)
|
---|
257 | DoOut(j, i);
|
---|
258 |
|
---|
259 | ++nol;
|
---|
260 | }
|
---|
261 |
|
---|
262 | sprintf(intc, "%5d", (int)rtend);
|
---|
263 |
|
---|
264 | for (; j < WIDTH; j++) {
|
---|
265 |
|
---|
266 | if (nol EQ 1)
|
---|
267 | strcat(strcat(result, " "), intc);
|
---|
268 | else
|
---|
269 | strcat(strcat(result, ","), intc);
|
---|
270 |
|
---|
271 | if (nol EQ PER)
|
---|
272 | DoOut(j, i);
|
---|
273 |
|
---|
274 | ++nol;
|
---|
275 | }
|
---|
276 |
|
---|
277 | if (nol NE 1)
|
---|
278 | DoOut(j - 1, i);
|
---|
279 | }
|
---|
280 |
|
---|
281 | fprintf(fp, "};\n");
|
---|
282 | fclose(fp);
|
---|
283 |
|
---|
284 | printf("Output complete. End of program.\n");
|
---|
285 | exit(0);
|
---|
286 | }
|
---|