/* * * COMPUTE VARIANCE OF THE CURVE RESULTING FROM FFT FILTER * * CUTOFF - FILTER CUTOFF VALUE DEFINED IN SAME UNITS AS X(*) * DINTERV - SAMPLING INTERVAL SPECIFIED IN SAME UNITS AS X(*) * XFILT - TIME VALUES OF FILTERED CURVE * FILT - ARRAY OF FILTERED VALUES * NFILT - NUMBER OF POINTS IN XFILT(*), FILT(*) * X - ARRAY SPECIFYING TIME VALUES OF ORIGINAL DATA POINTS * Y - ARRAY OF CONCENTRATIONS OF ORIGINAL DATA POINTS * */ #include #include #include #include "filter.h" #define NSIZE 2048 /***************************************************************/ float filtvar ( float cutoff, float dinterv, double xfilt[], double filt[], int nfilt, double x[], double y[], int n ) { int n0, z, i, j; int nw; double *xtemp, *ytemp, weights[2*NSIZE+2], xtemp2[2*NSIZE+2]; double ssw, yv, yd, sm, cor, r; float rmean, rsd, var; /* * First step: Compute weights of filter by filtering a single * point in the middle of zero values (impulse response) */ #ifdef DEBUG printf ("Start filtvar, cutoff = %f, dinterv = %e\n", cutoff, dinterv); printf ("n = %d, nfilt = %d\n", n, nfilt); #endif n0 = 4* (int) (cutoff/dinterv); z=1; while (n0 > z) z = z<<1; n0 = z; if ( NSIZE < z) n0 = NSIZE; if (n0 <= 1) { return (0.0); } #ifdef DEBUG printf ("In filtvar, n0 = %d\n", n0); #endif ytemp = (double *) calloc (n0, sizeof(double)); xtemp = (double *) calloc (n0, sizeof(double)); if (!xtemp) { fprintf (stderr, "In filtvar: Can't allocate double array of %d elements.\n", n0); exit (1); } for (i=0; i