void get_chan_stats(struct psrfits *pfi, struct subband_info *si){ int ii; double avg, std; for (ii = 0 ; ii < si->bufwid ; ii++) { // Only use 1/8 of the total length in order to speed things up avg_std(pfi->sub.fdata + ii, si->buflen / 8, &avg, &std, si->bufwid); //printf("%d %f %f\n", ii, avg, std); si->chan_avgs[ii] = avg; si->chan_stds[ii] = std; } }
void print_raw_chan_stats(unsigned char *data, int nspect, int nchan, int npol){ int ii, jj; double avg, std; float *tmparr; tmparr = (float *)malloc(sizeof(float) * nspect); for (ii = 0 ; ii < nchan ; ii++) { // Grab the raw data for (jj = 0 ; jj < nspect ; jj++) tmparr[jj] = (float)data[npol * nchan * jj + ii]; avg_std(tmparr, nspect, &avg, &std, 1); printf("%4d: %10.3f %10.3f\n", ii, avg, std); } free(tmparr); }
void new_scales_and_offsets(struct psrfits *pfo, int numunsigned) { int ii, poln; double avg, std; const int nspec = pfo->hdr.nsblk / pfo->hdr.ds_time_fact; const int nchan = pfo->hdr.nchan / pfo->hdr.ds_freq_fact; const int npoln = (pfo->hdr.onlyI) ? 1 : pfo->hdr.npol; const int bufwid = npoln * nchan; const float target_std = 20.0; // This is reasonable for 8-bit data for (poln = 0 ; poln < npoln ; poln++) { float target_avg = (poln < numunsigned) ? 128.0 : 0.0; float *out_scls = pfo->sub.dat_scales + poln * nchan; float *out_offs = pfo->sub.dat_offsets + poln * nchan; for (ii = 0 ; ii < nchan ; ii++) { float *fptr = pfo->sub.fdata + poln * nchan + ii; avg_std(fptr, nspec, &avg, &std, bufwid); out_scls[ii] = std / target_std; out_offs[ii] = avg - (target_avg * out_scls[ii]); } } }
void new_scales_and_offsets(struct psrfits *pfo, int numunsigned, Cmdline *cmd) { int ii, poln; double avg, std; const int nspec = pfo->hdr.nsblk / pfo->hdr.ds_time_fact; const int nchan = pfo->hdr.nchan / pfo->hdr.ds_freq_fact; const int npoln = (pfo->hdr.onlyI) ? 1 : pfo->hdr.npol; const int bufwid = npoln * nchan; // Target avg is for unsigned; defaults to 0 float target_avg = cmd->tgtavg, target_std = cmd->tgtstd; float *avgs = NULL, *stds = NULL; if (cmd->tgtstd == 0.0) { // Set these to give ~6-sigma of total gaussian // variation across the full range of values // The numerator is (256.0, 16.0, 4.0) for (8, 4, 2) bits target_std = (1 << pfo->hdr.nbits) / 6.0; } if (cmd->tgtavg == 0.0) { // Set these slightly below the midpoints to // allow us more headroom for RFI // The 1st term is (127.5, 7.5, 1.5) for (8, 4, 2) bits target_avg = ((1 << (pfo->hdr.nbits - 1)) - 0.5) \ - 1.0 * target_std; } if (cmd->bandpassfileP) { int N; printf("Overriding input channel statistics with those in '%s'\n", cmd->bandpassfile); read_bandpass(pfo, cmd->bandpassfile, &N, &avgs, &stds); if (N != nchan) { printf("Error!: Problem reading %d bandpass from '%s'\n\n", N, cmd->bandpassfile); exit(-1); } } else { avgs = (float *)malloc(nchan * sizeof(float)); stds = (float *)malloc(nchan * sizeof(float)); } for (poln = 0 ; poln < npoln ; poln++) { float tgtavg = (poln < numunsigned) ? target_avg : 0.0; float *out_scls = pfo->sub.dat_scales + poln * nchan; float *out_offs = pfo->sub.dat_offsets + poln * nchan; if (!cmd->bandpassfileP) { for (ii = 0 ; ii < nchan ; ii++) { float *fptr = pfo->sub.fdata + poln * nchan + ii; avg_std(fptr, nspec, &avg, &std, bufwid); avgs[ii] = avg; stds[ii] = std; } } for (ii = 0 ; ii < nchan ; ii++) { out_scls[ii] = stds[ii] / target_std; out_offs[ii] = avgs[ii] - (tgtavg * out_scls[ii]); } } free(avgs); free(stds); }