30 {
31
33
34 FILE *out;
35
36 char method[LEN], filename[LEN];
37
38 double Amax, phimax, lhmax, kxmax, kymax, alphamax, betamax, chisq;
39
40
41 if (argc < 3)
42 ERRMSG("Give parameters: <ctl> <spec.tab>");
43
44
45 const int nx = (int) scan_ctl(argc, argv, "NX", -1, "256", NULL);
46 const int ny = (int) scan_ctl(argc, argv, "NY", -1, "256", NULL);
47 const double sx = scan_ctl(argc, argv, "SX", -1, "1000.0", NULL);
48 const double sy = scan_ctl(argc, argv, "SY", -1, "1000.0", NULL);
49 const double amp = scan_ctl(argc, argv, "AMP", -1, "1.0", NULL);
50 const double phi = scan_ctl(argc, argv, "PHI", -1, "0.0", NULL);
51 const double lx0 = scan_ctl(argc, argv, "LX0", -1, "100.0", NULL);
52 const double lx1 = scan_ctl(argc, argv, "LX1", -1, "100.0", NULL);
53 const double dlx = scan_ctl(argc, argv, "DLX", -1, "10.0", NULL);
54 const double ly0 = scan_ctl(argc, argv, "LY0", -1, "200.0", NULL);
55 const double ly1 = scan_ctl(argc, argv, "LY1", -1, "200.0", NULL);
56 const double dly = scan_ctl(argc, argv, "DLY", -1, "10.0", NULL);
57 const double fwhm = scan_ctl(argc, argv, "FWHM", -1, "0.0", NULL);
58 const int inter_x = (int) scan_ctl(argc, argv, "INTER_X", -1, "0", NULL);
59 const int bg_poly_x =
60 (int) scan_ctl(argc, argv, "BG_POLY_X", -1, "5", NULL);
61 const int bg_poly_y =
62 (int) scan_ctl(argc, argv, "BG_POLY_Y", -1, "0", NULL);
63 const int bg_smooth_x =
64 (int) scan_ctl(argc, argv, "BG_SMOOTH_X", -1, "0", NULL);
65 const int bg_smooth_y =
66 (int) scan_ctl(argc, argv, "BG_SMOOTH_Y", -1, "0", NULL);
67 const double var_dh = scan_ctl(argc, argv, "VAR_DH", -1, "100.0", NULL);
68 const double lxymax = scan_ctl(argc, argv, "LXYMAX", -1, "1000.0", NULL);
69 const double dlxy = scan_ctl(argc, argv, "DLXY", -1, "10.0", NULL);
70 scan_ctl(argc, argv, "METHOD", -1, "P", method);
71 const int output = (int) scan_ctl(argc, argv, "OUTPUT", -1, "1", NULL);
72
73
75
76
77 printf("Write spectral data: %s\n", argv[2]);
78 if (!(out = fopen(argv[2], "w")))
79 ERRMSG("Cannot create file!");
80
81
82 fprintf(out,
83 "# $1 = real amplitude [K]\n"
84 "# $2 = real phase [deg]\n"
85 "# $3 = real horizontal wavelength [km]\n"
86 "# $4 = real wavelength x [km]\n"
87 "# $5 = real wavelength y [km]\n"
88 "# $6 = real rotation angle alpha [deg]\n");
89 fprintf(out,
90 "# $7 = amplitude [K]\n"
91 "# $8 = phase [deg]\n"
92 "# $9 = horizontal wavelength [km]\n"
93 "# $10 = wavelength x [km]\n"
94 "# $11 = wavelength y [km]\n"
95 "# $12 = rotation angle alpha [deg]\n"
96 "# $13 = rotation angle beta [deg]\n"
97 "# $14 = chi^2 of fit [K^2]\n"
98 "# $15 = box size x\n" "# $16 = box size y\n");
99
100
103 for (
int ix = 0; ix < wave->
nx; ix++)
104 for (
int iy = 0; iy < wave->
ny; iy++) {
105 wave->
x[ix] = sx / (nx - 1.) * ix - sx / 2.;
106 wave->
y[iy] = sy / (ny - 1.) * iy - sy / 2.;
107 }
108
109
110 for (double lx = lx0; lx <= lx1; lx += dlx) {
111
112
113 fprintf(out, "\n");
114
115
116 for (double ly = ly0; ly <= ly1; ly += dly) {
117
118
119 printf("Analyze lx = %g km and ly = %g km...\n", lx, ly);
120
121
122 double lh =
123 2 * M_PI / sqrt(gsl_pow_2(2 * M_PI / lx) + gsl_pow_2(2 * M_PI / ly));
124
125
126 double alpha = 90. - 180. / M_PI * atan2(2 * M_PI / lx, 2 * M_PI / ly);
127
128
130
131
134
135
137
138
140
141
142 if (method[0] == 'p' || method[0] == 'P') {
143 sprintf(filename, "period_%g_%g.tab", lx, ly);
144 period(wave, lxymax, dlxy, &Amax, &phimax, &lhmax, &kxmax, &kymax,
145 &alphamax, &betamax, output ? filename : NULL);
146 } else if (method[0] == 'f' || method[0] == 'F') {
147 sprintf(filename, "fft_%g_%g.tab", lx, ly);
148 fft(wave, &Amax, &phimax, &lhmax, &kxmax, &kymax,
149 &alphamax, &betamax, output ? filename : NULL);
150 } else
151 ERRMSG("Unkown method!");
152
153
154 fit_wave(wave, Amax, phimax, kxmax, kymax, &chisq);
155
156
157 sprintf(filename, "wave_%g_%g.tab", lx, ly);
158 if (output)
160
161
162 fprintf(out, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d %d\n",
163 amp, phi, lh, lx, ly, alpha, Amax, phimax, lhmax,
164 2 * M_PI / kxmax, 2 * M_PI / kymax, alphamax, betamax,
165 chisq, wave->
nx, wave->
ny);
166 }
167 }
168
169
170 fclose(out);
171
172
173 free(wave);
174
175 return EXIT_SUCCESS;
176}
void fit_wave(wave_t *wave, double amp, double phi, double kx, double ky, double *chisq)
Evaluate wave fit...
void create_wave(wave_t *wave, double amp, double lx, double ly, double phi, double fwhm)
Add linear wave pattern...
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
void intpol_x(wave_t *wave, int n)
Interpolate to regular grid in x-direction.
void fft(wave_t *wave, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Calculate 2-D FFT...
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
void variance(wave_t *wave, double dh)
Compute local variance.
void write_wave(char *filename, wave_t *wave)
Write wave analysis data.
void period(wave_t *wave, double lxymax, double dlxy, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Compute periodogram.
int nx
Number of across-track values.
int ny
Number of along-track values.
double x[WX]
Across-track distance [km].
double y[WY]
Along-track distance [km].