10 #include <gsl/gsl_fit.h>
47 int idx_x = floorf((x - arrx->start) / arrx->step);
48 int idx_y = floorf((y - arry->start) / arry->step);
50 float t = (x - (arrx->start + arrx->step*idx_x)) / arrx->step;
51 float u = (y - (arry->start + arry->step*idx_y)) / arry->step;
53 out = (1-t)*(1-u) * vals[idx_x * arry->num + idx_y + offset];
54 out += t*(1-u) * vals[(idx_x + 1) * arry->num + idx_y + offset];
55 out += (1-t)*u * vals[idx_x * arry->num + idx_y + 1 + offset];
56 out += t*u * vals[(idx_x + 1) * arry->num + idx_y + 1 + offset];
76 return eta * psd_in + (1 - eta) * psd_parasitic;
80 void resp_calibration(
101 float eta_atm_interp;
106 float psd_parasitic_use;
113 float *eta_atm_smooth =
new float[nf_ch]();
115 for(
int idx=start; idx<stop; idx++)
117 pwv_loc = PWV_START + idx*DPWV;
118 for(
int idy=0; idy<f_src->num; idy++)
120 freq = f_src->start + f_src->step * idy;
132 psd_atm_loc = psd_atm[idy];
133 psd_cmb_loc = psd_cmb[idy];
145 for (
int n=0; n<num_stage; n++)
147 psd_parasitic_use = psd_cascade[n*f_src->num + idy];
148 if (psd_parasitic_use < 0)
150 psd_parasitic_use = psd_sky;
155 eta_cascade[n*f_src->num + idy],
160 for(
int k=0; k<nf_ch; k++)
162 eta_kj = filterbank[k*f_src->num + idy];
164 psd_in_k = psd_in * eta_kj;
166 Psky[k*NPWV + idx] += psd_in_k * f_src->step;
167 eta_atm_smooth[k] += eta_kj * eta_atm_interp;
171 for(
int k=0; k<nf_ch; k++)
173 Tsky[k*NPWV + idx] += (1 - eta_atm_smooth[k] / eta_kj_sum[k]) * Tp_atm;
174 eta_atm_smooth[k] = 0.;
177 delete[] eta_atm_smooth;
181 void fit_calibration(
189 double c0_loc, c1_loc, cov00, cov01, cov11, sumsq;
191 double *Psky_k =
new double[NPWV];
192 double *Tsky_k =
new double[NPWV];
194 for(
int k=0; k<nf_ch; k++)
196 for(
int j=0; j<NPWV; j++)
198 Psky_k[j] =
static_cast<double>(Psky[k*NPWV + j]);
199 Tsky_k[j] =
static_cast<double>(Tsky[k*NPWV + j]);
215 c0[k] =
static_cast<float>(c0_loc);
216 c1[k] =
static_cast<float>(c1_loc);