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);
}
示例#3
0
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);
}