[3ae31e9] | 1 | /*
|
---|
| 2 | =============================================================================
|
---|
| 3 | dbwave.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 "dbwave"
|
---|
| 28 | #define VERSION "Version 16 -- 1988-09-08"
|
---|
| 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 127 /* number of points scanned */
|
---|
| 38 | #define PER 16 /* values per line */
|
---|
| 39 |
|
---|
| 40 | #define CENTER (WIDTH / 2) /* 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 | int nol; /* number of values on the line so far */
|
---|
| 64 |
|
---|
| 65 | FILE *fp; /* output file pointer */
|
---|
| 66 |
|
---|
| 67 | char bar[81]; /* bar of equal signs */
|
---|
| 68 | char dtg[32]; /* date-time group */
|
---|
| 69 | char intc[32]; /* value output work area */
|
---|
| 70 | char result[128]; /* line output work area */
|
---|
| 71 |
|
---|
| 72 | /* |
---|
| 73 |
|
---|
| 74 | */
|
---|
| 75 |
|
---|
| 76 | /*
|
---|
| 77 | =============================================================================
|
---|
| 78 | CalcArc() -- Calculate the scaled Arc Cosine of 'arg'
|
---|
| 79 | =============================================================================
|
---|
| 80 | */
|
---|
| 81 |
|
---|
| 82 | double
|
---|
| 83 | CalcArc(arg)
|
---|
| 84 | double arg;
|
---|
| 85 | {
|
---|
| 86 | double y;
|
---|
| 87 |
|
---|
| 88 | if (arg EQ 0.0) /* Return PI/2 if arg = 0.0 */
|
---|
| 89 | return((double)M_HALFPI);
|
---|
| 90 |
|
---|
| 91 | y = ACOSFN(arg);
|
---|
| 92 |
|
---|
| 93 | if (arg < 0.0) /* Adjust by PI if arg was negative */
|
---|
| 94 | y = y + (double)M_PI;
|
---|
| 95 |
|
---|
| 96 | return(y);
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | /*
|
---|
| 100 | =============================================================================
|
---|
| 101 | DoOut() -- Output result string
|
---|
| 102 | =============================================================================
|
---|
| 103 | */
|
---|
| 104 |
|
---|
| 105 | DoOut(j, k)
|
---|
| 106 | int j, k;
|
---|
| 107 | {
|
---|
| 108 | if (j EQ (WIDTH - 1)) { /* end of line ? */
|
---|
| 109 |
|
---|
| 110 | if (k EQ HARM) /* last table ? */
|
---|
| 111 | fprintf(fp, "\t%s }\t/* %3d */\n", result, j);
|
---|
| 112 | else
|
---|
| 113 | fprintf(fp, "\t%s },\t/* %3d */\n", result, j);
|
---|
| 114 |
|
---|
| 115 | } else {
|
---|
| 116 |
|
---|
| 117 | fprintf(fp, "\t%s,\t/* %3d */\n", result, j);
|
---|
| 118 | }
|
---|
| 119 |
|
---|
| 120 | result[0] = '\0';
|
---|
| 121 | nol = 0;
|
---|
| 122 | }
|
---|
| 123 |
|
---|
| 124 | /* |
---|
| 125 |
|
---|
| 126 | */
|
---|
| 127 |
|
---|
| 128 | main()
|
---|
| 129 | {
|
---|
| 130 | register int c, i, j;
|
---|
| 131 |
|
---|
| 132 | printf("\n%s -- %s -- run on ",
|
---|
| 133 | PGMNAME, VERSION);
|
---|
| 134 |
|
---|
| 135 | now(dtg);
|
---|
| 136 |
|
---|
| 137 | printf("%10.10s at %s\n\n",
|
---|
| 138 | dtg, &dtg[12]);
|
---|
| 139 |
|
---|
| 140 | for (c = 0; c < 3; c++)
|
---|
| 141 | bar[c] = ' ';
|
---|
| 142 |
|
---|
| 143 | for (; c < 80; c++)
|
---|
| 144 | bar[c] = '=';
|
---|
| 145 |
|
---|
| 146 | bar[80] = '\0';
|
---|
| 147 |
|
---|
| 148 | printf("Generating coefficient tables for %d harmonics\n\n", HARM);
|
---|
| 149 |
|
---|
| 150 | printf("Full scale range = %d\n", RANGE);
|
---|
| 151 | printf("Width of table = %d\n", WIDTH);
|
---|
| 152 | printf("Center of table = %d\n", CENTER);
|
---|
| 153 | printf("Scan width (N) = %d\n", N);
|
---|
| 154 | printf("Points scanned = %d thru %d\n\n", K, L);
|
---|
| 155 |
|
---|
| 156 | printf("Creating file \"%s\"\n", FILENAME);
|
---|
| 157 |
|
---|
| 158 | if ((FILE *)NULL EQ (fp = fopen(FILENAME, "w"))) {
|
---|
| 159 |
|
---|
| 160 | printf("ERROR: unable to open \"%s\" for writing\n", FILENAME);
|
---|
| 161 | exit(1);
|
---|
| 162 | }
|
---|
| 163 |
|
---|
| 164 | printf("\n");
|
---|
| 165 |
|
---|
| 166 | fprintf(fp, "/*\n%s\n\t %s -- MIDAS-VII Harmonic coefficient tables\n",
|
---|
| 167 | bar, FILENAME);
|
---|
| 168 |
|
---|
| 169 | fprintf(fp, "\tCalculated %10.10s -- %s\n%s\n*/\n\n",
|
---|
| 170 | dtg, &dtg[12], bar);
|
---|
| 171 |
|
---|
| 172 | fprintf(fp, "/*\n%s\n", bar);
|
---|
| 173 | fprintf(fp, "\tCalculated by dbwave.c -- %s\n", VERSION);
|
---|
| 174 | fprintf(fp, "\tfor MIDAS-VII using:\n");
|
---|
| 175 | fprintf(fp, "\n");
|
---|
| 176 | fprintf(fp, "\t\tFull scale range = %d\n", RANGE);
|
---|
| 177 | fprintf(fp, "\n");
|
---|
| 178 | fprintf(fp, "\t\tWidth of table = %d\n", WIDTH);
|
---|
| 179 | fprintf(fp, "\t\tCenter of table = %d\n", CENTER);
|
---|
| 180 | fprintf(fp, "\t\tScan width (N) = %d\n", N);
|
---|
| 181 | fprintf(fp, "\t\tPoints scanned = %d thru %d\n", K, L);
|
---|
| 182 | fprintf(fp, "%s\n*/\n\n", bar);
|
---|
| 183 |
|
---|
| 184 | fprintf(fp, "short\t%s[%d][%d] = {\n", TABNAME, HARM, WIDTH);
|
---|
| 185 | fprintf(fp, "\n");
|
---|
| 186 |
|
---|
| 187 | /* |
---|
| 188 |
|
---|
| 189 | */
|
---|
| 190 | for (i = 1; i < (HARM + 1); i++) {
|
---|
| 191 |
|
---|
| 192 | printf("Calculating harmonic %d ...\r", i);
|
---|
| 193 |
|
---|
| 194 | if (i & 1) {
|
---|
| 195 |
|
---|
| 196 | fprintf(fp, "/* \f\n");
|
---|
| 197 | fprintf(fp, "*/\n");
|
---|
| 198 | }
|
---|
| 199 |
|
---|
| 200 | fprintf(fp, "\n");
|
---|
| 201 | fprintf(fp, "/* Harmonic table # %d */\n", i);
|
---|
| 202 | fprintf(fp, "\n");
|
---|
| 203 |
|
---|
| 204 | nol = 1;
|
---|
| 205 | result[0] = '\0';
|
---|
| 206 |
|
---|
| 207 | for (j = 0; j < K; j++) {
|
---|
| 208 |
|
---|
| 209 | if (nol EQ 1) {
|
---|
| 210 |
|
---|
| 211 | if (j EQ 0)
|
---|
| 212 | strcat(result, "{ 0");
|
---|
| 213 | else
|
---|
| 214 | strcat(result, " 0");
|
---|
| 215 |
|
---|
| 216 | } else {
|
---|
| 217 |
|
---|
| 218 | strcat(result, ", 0");
|
---|
| 219 | }
|
---|
| 220 |
|
---|
| 221 | if (nol EQ PER)
|
---|
| 222 | DoOut(j, i);
|
---|
| 223 |
|
---|
| 224 | ++nol;
|
---|
| 225 | }
|
---|
| 226 | /* |
---|
| 227 |
|
---|
| 228 | */
|
---|
| 229 | for (; j < (L + 1); j++) {
|
---|
| 230 |
|
---|
| 231 | y = CalcArc((double)(j - CENTER) / (double)N);
|
---|
| 232 | a = cos((double)i * y);
|
---|
| 233 | c = ((double)RANGE * a) + 0.5;
|
---|
| 234 |
|
---|
| 235 | sprintf(intc, "%5d", (int)c);
|
---|
| 236 |
|
---|
| 237 | if (nol EQ 1)
|
---|
| 238 | strcat(strcat(result, " "), intc);
|
---|
| 239 | else
|
---|
| 240 | strcat(strcat(result, ","), intc);
|
---|
| 241 |
|
---|
| 242 | if (nol EQ PER)
|
---|
| 243 | DoOut(j, i);
|
---|
| 244 |
|
---|
| 245 | ++nol;
|
---|
| 246 | }
|
---|
| 247 |
|
---|
| 248 | for (; j < WIDTH; j++) {
|
---|
| 249 |
|
---|
| 250 | if (nol EQ 1)
|
---|
| 251 | strcat(result, " 0");
|
---|
| 252 | else
|
---|
| 253 | strcat(result, ", 0");
|
---|
| 254 |
|
---|
| 255 | if (nol EQ PER)
|
---|
| 256 | DoOut(j, i);
|
---|
| 257 |
|
---|
| 258 | ++nol;
|
---|
| 259 | }
|
---|
| 260 |
|
---|
| 261 | if (nol NE 1)
|
---|
| 262 | DoOut(j - 1, i);
|
---|
| 263 | }
|
---|
| 264 |
|
---|
| 265 | fprintf(fp, "};\n");
|
---|
| 266 | fclose(fp);
|
---|
| 267 |
|
---|
| 268 | printf("Output complete. End of program.\n");
|
---|
| 269 | exit(0);
|
---|
| 270 | }
|
---|