Esempio n. 1
0
int main(int argc, char *argv[])
{
	FILE *f;
	if(argc !=3)
	{
		print_usage(argv);
		return(EXIT_FAILURE);
	}
	char *filename = argv[1];
	int beam = atoi(argv[2]);
	
	f = fopen(filename,"r");
	if(NULL == f)
        {
                printf("ERROR: file %s not found.\n",filename);
                exit(1);
        }

	float x[MAX_CHANNELS],y[MAX_CHANNELS];

	int i;
	for(i=0;i<MAX_CHANNELS;i++)
	{
		fscanf(f,"%f %f",&x[i],&y[i]);
		if(isnan(x[i]))
		{
			printf("found nan\n");
			x[i] = x[i-1];
		}
		if(isnan(y[i]))
		{
			printf("found nan\n");
			y[i] = y[i-1];
		}
	}
	fclose(f);
	moving_average_filter(x,MAX_CHANNELS,100);
	moving_average_filter(y,MAX_CHANNELS,100);

	char outfile[30];
	sprintf(outfile,"epsilon_phi%d.smooth",beam);
	f = fopen(outfile,"w");
	for(i=0;i<MAX_CHANNELS;i++)
	{
		fprintf(f,"%f %f\n",x[i],y[i]);
	}
	fclose(f);
}
Esempio n. 2
0
//----------------------------------------------------------------------------------------------------------
//void smooth_cal(SpecRecord dataset[], int size, int lowchan, int highchan, int window)
//void simple_smooth_cal(SpecRecord dataset[], int size, int lowchan, int highchan, int twindow, int fwindow)
void simple_smooth_cal(SpecRecord dataset[], int start, int end, int records, int lowchan, int highchan, int twindow, int fwindow)
{
	//fix this loop need to run for all 4096 channels
	lowchan = 0; highchan = MAX_CHANNELS;

	int n, chan, dchan = highchan - lowchan;
	int size = end-start;
	float mean[4], tmp;
	static float mean_t[4] = {0};
	float sigma[4] = {0};
	float *XRA, *Yxx, *Yyy, *Yxy, *Yyx;
	static float *Fxx, *Fyy, *Fxy, *Fyx, *w;

	//Y has band avg series
	Yxx = (float*) malloc(sizeof(float) * size);
	Yyy = (float*) malloc(sizeof(float) * size);
	Yxy = (float*) malloc(sizeof(float) * size);
	Yyx = (float*) malloc(sizeof(float) * size);
	
	float **Sxx,**Syy,**Syx,**Sxy;

	//Fxx is time avg band shape
	if(0 == start)
	{
		Fxx = (float*) malloc(sizeof(float) * dchan);
		Fyy = (float*) malloc(sizeof(float) * dchan);
		Fxy = (float*) malloc(sizeof(float) * dchan);
		Fyx = (float*) malloc(sizeof(float) * dchan);
		if(Fxx == NULL || Fyy == NULL || Fxy == NULL || Fyx == NULL)
		{
			printf("malloc failed !\n");
			exit(0);
		}
	}

	if(Yxx == NULL || Yyy == NULL || Yxy == NULL || Yyx == NULL)
	{
		printf("malloc failed !\n");
		exit(0);
	}

        FILE * outfile2 = fopen("avgtimecal.dat","w");
        if(outfile2 == NULL)
        {
                printf("Can't open avgtimecal.dat\n");
                exit(0);
        }

	for(chan=lowchan; chan<highchan; chan++) 
	{
		mean[0] = mean[1] = mean[2] = mean[3] = 0;
		int count[MAX_CHANNELS] = {0};
		//for(n=0; n<size; n++) 
		for(n=start; n<end; n++) 
		{
			if(dataset[n].flagBAD) continue;
                        //if(dataset[n].flagRFI[chan] == RFI_NONE)
			{
				mean[0] += dataset[n].cal.xx[chan];
				mean[1] += dataset[n].cal.yy[chan];
				mean[2] += dataset[n].cal.xy[chan];
				mean[3] += dataset[n].cal.yx[chan];
				count[chan]++;
			}
		}

		//avoid divide by zero
		if(count[chan])
		{
			mean[0] /= count[chan]; 
			mean[1] /= count[chan]; 
			mean[2] /= count[chan]; 
			mean[3] /= count[chan];
		}
	
		fprintf(outfile2,"%f %f %f %f\n",mean[0],mean[1],mean[2],mean[3]);		

		//for(n=0; n<size; n++) 
		for(n=start; n<end; n++) 
		{
			//if(dataset[n].flagBAD || dataset[n].flagRFI[chan] != RFI_NONE)
			if(dataset[n].flagBAD)
			{
				dataset[n].cal.xx[chan] = mean[0];
				dataset[n].cal.yy[chan] = mean[1];
				dataset[n].cal.xy[chan] = mean[2];
				dataset[n].cal.yx[chan] = mean[3];
			}
		}
	}
	fclose(outfile2);

//	mean[0] = mean[1] = mean[2] = mean[3] = 0;

	int cnt = 0;
	if(0 == start)
	{
		float sumxx,sumyy,sumxy,sumyx;
		for(n=0; n<records; n++) 
		{
			if(dataset[n].flagBAD) continue;
			sumxx = 0.0,sumyy = 0.0,sumxy = 0.0;sumyx = 0.0;
			for(chan=lowchan; chan<highchan; chan++) 
			{
				sumxx += dataset[n].cal.xx[chan];
				sumyy += dataset[n].cal.yy[chan];
				sumxy += dataset[n].cal.xy[chan];
				sumyx += dataset[n].cal.yx[chan];
			}

			sumxx /= dchan; 
			sumyy /= dchan; 
			sumxy /= dchan; 
			sumyx /= dchan;
			mean_t[0] += sumxx;
			mean_t[1] += sumyy;
			mean_t[2] += sumxy;
			mean_t[3] += sumyx;
			cnt++;
		}

		mean_t[0] /= cnt; 
		mean_t[1] /= cnt; 
		mean_t[2] /= cnt; 
		mean_t[3] /= cnt;
	
	}

	cnt = 0;	
	for(n=start; n<end; n++) 
	{
		if(dataset[n].flagBAD) continue;
		Yxx[cnt] = Yyy[cnt] = Yxy[cnt] = Yyx[cnt] = 0.0;
		for(chan=lowchan; chan<highchan; chan++) 
		{
			Yxx[cnt] += dataset[n].cal.xx[chan];
			Yyy[cnt] += dataset[n].cal.yy[chan];
			Yxy[cnt] += dataset[n].cal.xy[chan];
			Yyx[cnt] += dataset[n].cal.yx[chan];
		}

		Yxx[cnt] /= dchan; 
		Yyy[cnt] /= dchan; 
		Yxy[cnt] /= dchan; 
		Yyx[cnt] /= dchan;

		sigma[0] += (Yxx[cnt] - mean_t[0])*(Yxx[cnt] - mean_t[0]);
		sigma[1] += (Yyy[cnt] - mean_t[1])*(Yyy[cnt] - mean_t[1]);
		sigma[2] += (Yxy[cnt] - mean_t[2])*(Yxy[cnt] - mean_t[2]);
		sigma[3] += (Yyx[cnt] - mean_t[3])*(Yyx[cnt] - mean_t[3]);

		cnt++;
	}

	sigma[0] = sqrt(sigma[0]/cnt);
	sigma[1] = sqrt(sigma[1]/cnt);
	sigma[2] = sqrt(sigma[2]/cnt);
	sigma[3] = sqrt(sigma[3]/cnt);

	for(n=0; n<cnt; n++)
	{
		if(fabs(Yxx[n] - mean_t[0]) > 3.0*sigma[0]) Yxx[n] = mean_t[0];
		if(fabs(Yyy[n] - mean_t[1]) > 3.0*sigma[1]) Yyy[n] = mean_t[1];
		if(fabs(Yxy[n] - mean_t[2]) > 3.0*sigma[2]) Yxy[n] = mean_t[2];
		if(fabs(Yyx[n] - mean_t[3]) > 3.0*sigma[3]) Yyx[n] = mean_t[3];
	}

	for(n=0; n<cnt; n++) 
	{
		Yxx[n] /= mean_t[0];
		Yyy[n] /= mean_t[1];
		Yxy[n] /= mean_t[2];
		Yyx[n] /= mean_t[3];
	}

	//To avoid window parameter from overflowing
	if(twindow > (cnt/2 - 1))
		twindow = cnt/2 -1;

	//apply the moving average filter to reduce noise
	moving_average_filter(Yxx, cnt, twindow);
	moving_average_filter(Yyy, cnt, twindow);
	moving_average_filter(Yxy, cnt, twindow);
	moving_average_filter(Yyx, cnt, twindow);

	for(chan=lowchan; chan<highchan; chan++)
 	{
		Fxx[chan - lowchan] = 0.0;
		Fyy[chan - lowchan] = 0.0;
		Fxy[chan - lowchan] = 0.0;
		Fyx[chan - lowchan] = 0.0;
	}

	int cc[MAX_CHANNELS] = {0};

	if(0 == start)
	{
		for(chan=lowchan; chan<highchan; chan++) 
		{
			for(n=0; n<records; n++) 
			{
				//if(!dataset[n].flagBAD && dataset[n].flagRFI[chan] == RFI_NONE)
				{
					Fxx[chan - lowchan] += dataset[n].cal.xx[chan];
					Fyy[chan - lowchan] += dataset[n].cal.yy[chan];
					Fxy[chan - lowchan] += dataset[n].cal.xy[chan];
					Fyx[chan - lowchan] += dataset[n].cal.yx[chan];
					cc[chan]++;
				}
			}
			if(cc[chan])
			{
				Fxx[chan - lowchan] /= cc[chan];
				Fyy[chan - lowchan] /= cc[chan];
				Fxy[chan - lowchan] /= cc[chan];
				Fyx[chan - lowchan] /= cc[chan];
			}
			else
			{
				printf("Rec %d chan %d count zero.\n",n,chan);
				Fxx[chan - lowchan] = Fxx[chan-lowchan-1];
				Fyy[chan - lowchan] = Fyy[chan-lowchan-1];
				Fxy[chan - lowchan] = Fxy[chan-lowchan-1];
				Fyx[chan - lowchan] = Fyx[chan-lowchan-1];
			}

		}

		diffusion_filter(Fxx, dchan, fwindow);
		diffusion_filter(Fyy, dchan, fwindow);
		diffusion_filter(Fxy, dchan, fwindow);
		diffusion_filter(Fyx, dchan, fwindow);

		write_band(Fxx,Fyy, Fxy, Fyx,n,lowchan,highchan);
	}

	if(0 == start)
	        outfile2 = fopen("smoothcal.dat","w");
	else
	        outfile2 = fopen("smoothcal.dat","a+");
        if(outfile2 == NULL)
        {
                printf("Can't open avgbandcal.dat\n");
        }
	cnt = 0;
        for(n=start; n<end; n++)
        {
		for(chan=lowchan; chan<highchan; chan++) 
		{
			dataset[n].cal.xx[chan] = Yxx[cnt]*Fxx[chan-lowchan];
			dataset[n].cal.yy[chan] = Yyy[cnt]*Fyy[chan-lowchan];
			dataset[n].cal.xy[chan] = Yxy[cnt]*Fxy[chan-lowchan];
			dataset[n].cal.yx[chan] = Yyx[cnt]*Fyx[chan-lowchan];
		}
		if(dataset[n].flagBAD)
			continue;
                fprintf(outfile2, "%05i %7.6f %7.6f %7.6f %7.6f\n",n,Yxx[cnt],Yyy[cnt],Yxy[cnt],Yyx[cnt]);
		cnt++;
	}
	fclose(outfile2);

	free(Yxx);
	free(Yyy);
	free(Yxy);
	free(Yyx);
	if(records == end)
	{
		free(Fxx);
		free(Fyy);
		free(Fxy);
		free(Fyx);
	}
	return;
}
Esempio n. 3
0
int main(int argc, char **argv)
{
    int ret = 1;

    const char *input_data = "/dev/random", *output_data = NULL;
    int count = 0;

    struct moving_average_filter_state ma_state;
    unsigned int *array_in, *array_out;

    int opt;
    const struct option options[] = {
        {"order",             required_argument, NULL, 'P'},
        {"count",             required_argument, NULL, 'c'},
        {"input-data",        required_argument, NULL, 'i'},
        {"output-data",       required_argument, NULL, 'o'},
        {0,                   0,                 0,    0}
    };

    memset(&ma_state, 0x0, sizeof(ma_state));

    while ((opt = getopt_long(argc, argv, "P:c:i:o:", options, NULL)) != -1) {
        switch (opt) {
            case 'P':
                ma_state.P = atof(optarg);
                break;
            case 'c':
                count = atoi(optarg);
                break;
            case 'i':
                input_data = optarg;
                break;
            case 'o':
                output_data = optarg;
                break;
            case 0:
                break;
            default:
                return usage(argv[0]);
        }
    }

    if (generate_array(&array_in, &count, input_data) == -1)
        return 1;

    printf("Elements: %d\n", count);
    {
        int i;
        for (i=0;i<count;++i)
            array_in[i] %= 100;
    }

    if (moving_average_filter_init(&ma_state))
        goto out;

    printf("Moving Average parameters: P:%d\n",
            ma_state.P);
    {
        int i;

        printf("b:\n");
        for (i=0;i<ma_state.P;++i)
            printf("%f ", ma_state.b[i]);
        printf("\n");
    }

    array_out = malloc(sizeof(unsigned int)*count);
    if (!array_out) {
        fprintf(stderr, "Unable to allocate %d bytes", count);
        goto out;
    }
    memset(array_out, 0x0, sizeof(unsigned int)*count);

    {
        int i;

        for (i=0;i<count;++i)
            array_out[i] = moving_average_filter(&ma_state, array_in[i]);
    }

    if (output_data) {
        int i;
        int d = open(output_data, O_WRONLY|O_CREAT, 0666);
        if (d == -1) {
            fprintf(stderr, "Error opening %s: %s", output_data, strerror(errno));
            goto out;
        }
        ftruncate(d, 0);
        for (i=0;i<count;++i) {
            char b[1024] = {0x0, };
            int n;
            n = snprintf(b, sizeof(b), "%d %d %d\n", i, array_in[i], array_out[i]);
            if (write(d, b, n) == -1) {
                fprintf(stderr, "Error writing to %s: %s", output_data, strerror(errno));
                break;
            }
        }
        close(d);
    }

    ret = 0;
  out:
    moving_average_filter_destroy(&ma_state);
    if (array_in)
        free(array_in);
    if (array_out)
        free(array_out);

    return ret;
}