Implemented reading different data types
parent
13189bd54e
commit
a29b182c4f
130
rffft.c
130
rffft.c
|
@ -18,8 +18,7 @@ void usage(void)
|
|||
printf("-t <tint> Integration time [1s]\n");
|
||||
printf("-n <nsub> Number of integrations per file [60]\n");
|
||||
printf("-m <use> Use every mth integration [1]\n");
|
||||
printf("-l Treat as lower subband\n");
|
||||
printf("-d Treat input as dada file\n");
|
||||
printf("-F <format> char, int, float [int]\n");
|
||||
printf("-h This help\n");
|
||||
|
||||
return;
|
||||
|
@ -28,13 +27,14 @@ void usage(void)
|
|||
int main(int argc,char *argv[])
|
||||
{
|
||||
int i,j,k,l,m,nchan,nint=1,arg=0,nbytes,nsub=60,flag,nuse=1;
|
||||
int lowersubband=0,dadaformat=0;
|
||||
fftwf_complex *c,*d;
|
||||
fftwf_plan fft;
|
||||
FILE *infile,*outfile;
|
||||
char infname[128],outfname[128],path[64]="/data/record",prefix[32]="";
|
||||
char infname[128],outfname[128],path[64]=".",prefix[32]="";
|
||||
char format='i';
|
||||
int16_t *ibuf;
|
||||
char *cbuf;
|
||||
float *fbuf;
|
||||
float *z,length,fchan=100.0,tint=1.0;
|
||||
double freq,samp_rate;
|
||||
struct timeval start,end;
|
||||
|
@ -42,7 +42,7 @@ int main(int argc,char *argv[])
|
|||
|
||||
// Read arguments
|
||||
if (argc>1) {
|
||||
while ((arg=getopt(argc,argv,"i:f:s:c:t:p:n:hm:ld"))!=-1) {
|
||||
while ((arg=getopt(argc,argv,"i:f:s:c:t:p:n:hm:F:"))!=-1) {
|
||||
switch(arg) {
|
||||
|
||||
case 'i':
|
||||
|
@ -65,12 +65,13 @@ int main(int argc,char *argv[])
|
|||
fchan=atof(optarg);
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
lowersubband=1;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
dadaformat=1;
|
||||
case 'F':
|
||||
if (strcmp(optarg,"char")==0)
|
||||
format='c';
|
||||
else if (strcmp(optarg,"int")==0)
|
||||
format='i';
|
||||
else if (strcmp(optarg,"float")==0)
|
||||
format='f';
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
|
@ -120,12 +121,10 @@ int main(int argc,char *argv[])
|
|||
c=fftwf_malloc(sizeof(fftwf_complex)*nchan);
|
||||
d=fftwf_malloc(sizeof(fftwf_complex)*nchan);
|
||||
ibuf=(int16_t *) malloc(sizeof(int16_t)*2*nchan);
|
||||
cbuf=(char *) malloc(sizeof(char)*2*nchan);
|
||||
fbuf=(float *) malloc(sizeof(float)*2*nchan);
|
||||
z=(float *) malloc(sizeof(float)*nchan);
|
||||
|
||||
// Allocate character buffer
|
||||
if (dadaformat==1)
|
||||
cbuf=(char *) malloc(sizeof(char)*4*nchan);
|
||||
|
||||
// Plan
|
||||
fft=fftwf_plan_dft_1d(nchan,c,d,FFTW_FORWARD,FFTW_ESTIMATE);
|
||||
|
||||
|
@ -133,17 +132,9 @@ int main(int argc,char *argv[])
|
|||
gettimeofday(&start,0);
|
||||
strftime(prefix,30,"%Y-%m-%dT%T",gmtime(&start.tv_sec));
|
||||
|
||||
// Override if dada format
|
||||
if (dadaformat==1)
|
||||
strcpy(prefix,"dada");
|
||||
|
||||
// Open file
|
||||
infile=fopen(infname,"r");
|
||||
|
||||
// Read 4096 byte header if dada format
|
||||
if (dadaformat==1)
|
||||
nbytes=fread(cbuf,sizeof(char),4096,infile);
|
||||
|
||||
// Forever loop
|
||||
for (m=0;;m++) {
|
||||
// File name
|
||||
|
@ -161,11 +152,15 @@ int main(int argc,char *argv[])
|
|||
|
||||
// Integrate
|
||||
for (j=0;j<nint;j++) {
|
||||
// nbytes=fread(fbuf,sizeof(float),2*nchan,infile);
|
||||
if (dadaformat==1)
|
||||
nbytes=fread(cbuf,sizeof(char),4*nchan,infile);
|
||||
else
|
||||
// Read buffer
|
||||
if (format=='i')
|
||||
nbytes=fread(ibuf,sizeof(int16_t),2*nchan,infile);
|
||||
else if (format=='c')
|
||||
nbytes=fread(cbuf,sizeof(char),2*nchan,infile);
|
||||
else if (format=='f')
|
||||
nbytes=fread(fbuf,sizeof(float),2*nchan,infile);
|
||||
|
||||
// End on empty buffer
|
||||
if (nbytes==0)
|
||||
break;
|
||||
|
||||
|
@ -173,64 +168,35 @@ int main(int argc,char *argv[])
|
|||
if (j%nuse!=0)
|
||||
continue;
|
||||
|
||||
// Unpack single polarization data
|
||||
if (dadaformat==0) {
|
||||
// Unpack
|
||||
if (format=='i') {
|
||||
for (i=0;i<nchan;i++) {
|
||||
c[i][0]=(float) ibuf[2*i]/32768.0;
|
||||
c[i][1]=(float) ibuf[2*i+1]/32768.0;
|
||||
}
|
||||
|
||||
// Execute
|
||||
fftwf_execute(fft);
|
||||
}
|
||||
} else if (format=='c') {
|
||||
for (i=0;i<nchan;i++) {
|
||||
c[i][0]=(float) cbuf[2*i]/256.0;
|
||||
c[i][1]=(float) cbuf[2*i+1]/256.0;
|
||||
}
|
||||
} else if (format=='f') {
|
||||
for (i=0;i<nchan;i++) {
|
||||
c[i][0]=(float) fbuf[2*i];
|
||||
c[i][1]=(float) fbuf[2*i+1];
|
||||
}
|
||||
}
|
||||
|
||||
// Execute
|
||||
fftwf_execute(fft);
|
||||
|
||||
// Add
|
||||
for (i=0;i<nchan;i++) {
|
||||
if (i<nchan/2)
|
||||
l=i+nchan/2;
|
||||
else
|
||||
l=i-nchan/2;
|
||||
|
||||
if (lowersubband==1)
|
||||
l=nchan-l;
|
||||
z[l]+=d[i][0]*d[i][0]+d[i][1]*d[i][1];
|
||||
}
|
||||
} else {
|
||||
for (i=0;i<nchan;i++) {
|
||||
c[i][0]=(float) cbuf[4*i]/256.0;
|
||||
c[i][1]=(float) cbuf[4*i+1]/256.0;
|
||||
}
|
||||
// Execute
|
||||
fftwf_execute(fft);
|
||||
|
||||
// Add
|
||||
for (i=0;i<nchan;i++) {
|
||||
if (i<nchan/2)
|
||||
l=i+nchan/2;
|
||||
else
|
||||
l=i-nchan/2;
|
||||
|
||||
if (lowersubband==1)
|
||||
l=nchan-l;
|
||||
z[l]+=d[i][0]*d[i][0]+d[i][1]*d[i][1];
|
||||
}
|
||||
for (i=0;i<nchan;i++) {
|
||||
c[i][0]=(float) cbuf[4*i+2]/256.0;
|
||||
c[i][1]=(float) cbuf[4*i+3]/256.0;
|
||||
}
|
||||
// Execute
|
||||
fftwf_execute(fft);
|
||||
|
||||
// Add
|
||||
for (i=0;i<nchan;i++) {
|
||||
if (i<nchan/2)
|
||||
l=i+nchan/2;
|
||||
else
|
||||
l=i-nchan/2;
|
||||
|
||||
if (lowersubband==1)
|
||||
l=nchan-l;
|
||||
z[l]+=d[i][0]*d[i][0]+d[i][1]*d[i][1];
|
||||
}
|
||||
// Add
|
||||
for (i=0;i<nchan;i++) {
|
||||
if (i<nchan/2)
|
||||
l=i+nchan/2;
|
||||
else
|
||||
l=i-nchan/2;
|
||||
|
||||
z[l]+=d[i][0]*d[i][0]+d[i][1]*d[i][1];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -279,8 +245,6 @@ int main(int argc,char *argv[])
|
|||
fftwf_free(c);
|
||||
fftwf_free(d);
|
||||
free(z);
|
||||
if (dadaformat==1)
|
||||
free(cbuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue