25 #include "errorHandling.h"
26 #include "midiGlobal.h"
27 #include "diagnostics.h"
28 #include "statistics.h"
35 #define FPMIN (1.0e-30)
37 #define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg)
69 const char routine[] =
"makeStats";
76 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
77 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
80 if (numdata < 1)
return;
81 for (i = 0; i < numdata; i++)
84 accum2 += data[i] * data[i];
86 *mean = accum/numdata;
87 if (numdata < 2)
return;
88 accum2 -= *mean * *mean * numdata;
89 if (accum2 < 0.F)
return;
90 *rms = sqrt(accum2/((
float) (numdata-1)));
118 const char routine[] =
"removeDc";
124 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
125 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
128 for (i = 0; i < size; i++)
130 if (inArray[i] > max) max = inArray[i];
132 for (i = 0; i < size; i++)
133 outArray[i] = inArray[i] - max;
158 const char routine[] =
"signalMean";
164 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
165 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
167 for (i = start; i < end; i++)
170 if ((end - start) != 0)
171 mean /= ((float) (end - start));
173 mean /= ((float) (VERY_SMALL_INT));
200 const char routine[] =
"signalPeak";
206 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
207 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
210 length = end - start;
211 if (length <= 0) midiReportError (midiReportPtr, routine, __FILE__, __LINE__,
"Invalid length");
215 sigPtr = signal + start;
216 for (i = 0; i < length; i++)
241 float signalVariance (
250 const char routine[] =
"signalVariance";
251 float mean, variance, diffCumSqr = 0.0, diff;
252 int i, length, length_1;
256 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
257 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
260 mean = signalMean (signal, start, end);
262 for (i = start; i < end; i++)
264 diff = signal[i] - mean;
265 diffCumSqr += (diff * diff);
268 length = end - start;
269 length_1 = end - start - 1;
272 length = VERY_SMALL_INT;
274 length_1 = VERY_SMALL_INT;
276 variance = diffCumSqr / (float) length_1;
277 *standDev = sqrt (variance);
302 const char routine[] =
"signalMedian";
303 float remainder, median, *buffer, *sigPtr, *bufPtr;
304 int i, length, lengthHalf;
308 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
309 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
312 length = end - start;
313 if (length <= 0) midiReportError (midiReportPtr, routine, __FILE__, __LINE__,
"Invalid length");
316 buffer = (
float *) calloc (length,
sizeof (
float));
318 sigPtr = signal + start;
321 for (i = 0; i < length; i++)
322 *bufPtr++ = *sigPtr++;
325 signalSort (buffer, 0, length);
328 remainder = (length % 2);
331 lengthHalf = 0.5 * (length -1);
332 median = buffer[lengthHalf];
336 lengthHalf = 0.5 * length;
337 median = 0.5 * (buffer[lengthHalf-1] + buffer[lengthHalf]);
366 const char routine[] =
"signalSortInt";
367 int i, j, searchStart, foundIndex;
368 int min, signalStart;
374 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
375 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
379 for (j = start; j < end; j++)
381 signalStart = signal[j];
382 min = signal[searchStart];
383 for (i = searchStart; i < end; i++)
385 if (signal[i] <= min)
392 signal[j] = signal[foundIndex];
393 signal[foundIndex] = signalStart;
400 tempFileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
402 sprintf (tempFileName,
"%s%s.MedianSortInt.log", outFileDir, outRootName);
403 tempFilePtr = fopen(tempFileName,
"w");
404 for (i = start; i < end; i++)
405 fprintf (tempFilePtr,
"%d\n", signal[i]);
408 fclose (tempFilePtr);
438 const char routine[] =
"signalSort";
439 int i, j, searchStart, foundIndex;
440 float min, signalStart;
444 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
445 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
447 if ((end - start) <= 0) midiReportError (midiReportPtr, routine, __FILE__, __LINE__,
"Invalid length");
451 for (j = start; j < end; j++)
453 signalStart = signal[j];
454 min = signal[searchStart];
455 for (i = searchStart; i < end; i++)
457 if (signal[i] <= min)
464 signal[j] = signal[foundIndex];
465 signal[foundIndex] = signalStart;
469 if (diagnostic > 4) midiCreatePlotFile2D (
"SortedSignal",
"Sorted Signal",
"x",
"y",
470 1, signal, start, end, 1, 0);
512 if (x <= 0.F)
return 0.F;
513 return (
float) sqrt(x);
532 void midiGetLinearFit (
550 const char routine[] =
"midiGetLinearFit";
552 double arg, wt, t, sxoss, sx=0.0, sy=0.0, st2=0.0, ss, sigdat;
556 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
557 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
566 for (i = 0; i < ndata; i++)
576 for (i = 0; i < ndata; i++)
586 for (i = 0; i < ndata; i++)
588 t = (x[i] - sxoss) / sig;
590 *b += t * y[i] / sig;
595 for (i = 0; i < ndata; i++)
603 *a = (sy - sx * (*b)) / ss;
604 *siga = sqrt ((1.0 + sx * sx / (ss * st2)) /ss);
605 *sigb = sqrt (1.0 / st2);
610 for (i = 0; i < ndata; i++)
611 *chi2 += SQR(y[i] - (*a) - (*b) * x[i]);
613 sigdat = sqrt ((*chi2) / (ndata - 2));
619 for (i = 0; i < ndata; i++)
621 arg = (y[i] - (*a) - (*b) * x[i]) / sig;
622 *chi2 += SQR((y[i] - (*a) - (*b) * x[i]) / sig);
624 if (ndata > 2) *q = midiGoodnessOfFit (0.5 * (ndata - 2), 0.5 * (*chi2), error);
627 sprintf (midiMessage,
"Cannot compute goodness-of-fit in routine '%s'", routine);
628 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
649 float midiGoodnessOfFit (
658 const char routine[] =
"midiGoodnessOfFit";
659 float gamser, gammcf, gln;
663 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
664 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
669 if (x < 0.0 || a <= 0.0)
672 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
673 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
678 gser (&gamser, a, x, &gln, error);
681 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
682 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
689 gcf (&gammcf, a, x, &gln, error);
692 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
693 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
727 const char routine[] =
"gser";
733 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
734 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
745 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
746 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
755 for (n = 0; n < ITMAX; n++)
760 if (fabs(del) < fabs(sum) * EPS)
762 *gamser = sum * exp (-x + a * log(x) - (*gln));
767 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
768 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
795 const char routine[] =
"gammln";
796 double x, y, tmp, ser;
797 static double cof[6] = {76.18009172947146,-86.50532032941677,
798 24.01409824083091,-1.231739572450155,
799 0.1208650973866179e-2,-0.5395239384953e-5};
804 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
805 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
809 tmp -= (x + 0.5) * log(tmp);
810 ser = 1.000000000190015;
811 for (j = 0; j <= 5; j++) ser += cof[j] / (++y);
813 return (-tmp + log (2.5066282746310005 * ser / x));
842 const char routine[] =
"gcf";
844 float an, b, c, d, del, h;
848 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
849 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
860 for (i = 0; i < ITMAX; i++)
865 if (fabs(d) < FPMIN) d = FPMIN;
867 if (fabs(c) < FPMIN) c = FPMIN;
871 if (fabs (del - 1.0) < EPS)
break;
877 sprintf (midiMessage,
"Invalid arguments in routine '%s'", routine);
878 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
882 *gammcf = exp (-x + a * log(x) - (*gln)) * h;