#include #include #include #include #include "rftime.h" #include "rfio.h" struct spectrogram read_spectrogram(char *prefix,int isub,int nsub,double f0,double df0,int nbin,double foff) { int i,j,k,l,flag=0,status,msub,ibin,nadd,nbits=-32; char filename[128],header[256],nfd[32]; FILE *file; struct spectrogram s; float *z,zavg,zstd; char *cz; int nch,j0,j1; double freq,samp_rate; float length; int nchan,dummy; float s1,s2; // Open first file to get number of channels sprintf(filename,"%s_%06d.bin",prefix,isub); // Open file file=fopen(filename,"r"); if (file==NULL) { printf("%s does not exist\n",filename); s.nsub=0; return s; } // Read header status=fread(header,sizeof(char),256,file); if (strstr(header,"NBITS 8")==NULL) { status=sscanf(header,"HEADER\nUTC_START %s\nFREQ %lf Hz\nBW %lf Hz\nLENGTH %f s\nNCHAN %d\nNSUB %d\n",s.nfd0,&s.freq,&s.samp_rate,&length,&nch,&msub); } else { status=sscanf(header,"HEADER\nUTC_START %s\nFREQ %lf Hz\nBW %lf Hz\nLENGTH %f s\nNCHAN %d\nNSUB %d\nNBITS 8\nMEAN %f\nRMS %f",s.nfd0,&s.freq,&s.samp_rate,&length,&nch,&dummy,&zavg,&zstd); nbits=8; } s.freq+=foff; // Close file fclose(file); // Compute plotting channel if (f0>0.0 && df0>0.0) { s.nchan=(int) (df0/s.samp_rate*(float) nch); j0=(int) ((f0-0.5*df0-s.freq+0.5*s.samp_rate)*(float) nch/s.samp_rate); j1=(int) ((f0+0.5*df0-s.freq+0.5*s.samp_rate)*(float) nch/s.samp_rate); if (j0<0 || j1>nch) { fprintf(stderr,"Requested frequency range out of limits\n"); s.nsub=0; s.nchan=0; return s; } } else { s.nchan=nch; j0=0; j1=s.nchan; } // Read whole file if not specified if (nsub==0 && msub>0) nsub=msub; // Number of subints s.nsub=nsub/nbin; // Allocate s.z=(float *) malloc(sizeof(float)*s.nchan*s.nsub); s.zavg=(float *) malloc(sizeof(float)*s.nsub); s.zstd=(float *) malloc(sizeof(float)*s.nsub); z=(float *) malloc(sizeof(float)*nch); cz=(char *) malloc(sizeof(char)*nch); s.mjd=(double *) malloc(sizeof(double)*s.nsub); s.length=(float *) malloc(sizeof(float)*s.nsub); // Initialize for (j=0;j0) { s.mjd[i]/=(float) nadd; for (j=0;j0.0 && df0>0.0) { s.freq=f0; s.samp_rate=df0; } // Compute averages for (i=0;is.zmax) s.zmax=s.zavg[i]+1.0*s.zstd[i]; } } // Free free(z); free(cz); return s; } void write_spectrogram(struct spectrogram s,char *prefix) { int i,j; FILE *file; char header[256]="",filename[256],nfd[32]; float *z; double mjd; // Allocate z=(float *) malloc(sizeof(float)*s.nchan); // Generate filename sprintf(filename,"%s_%06d.bin",prefix,0); // Open file file=fopen(filename,"w"); // Loop over subints for (i=0;i