ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/sig/glitch.c

This is glitch.c in view mode; [Download] [Up]

#include<stdio.h>
#include<math.h>
#include <carl/carl.h>


/*-------------------------------------------------------

			glitch.c

This program calculates a rough approximation to the second
	derivative of the input signal.  It calculates the slope
	at each point in time and compares it to the slope at
	the next point in time.  The N greatest differences
	are saved by the function saveerr.  A glitch should show
	up as a one, two, or three successive large differences with
	alternating signs. 

	cc -O glitch.c -lcarl -lm -o glitch

-------------------------------------------------------*/

main(argc, argv)
	char **argv;
{
	float	in1, in2, oldslope, newslope, err;
	double	agerr = 0;
	long 	nsamps = 2;
	int	N = 22;
	char	ch;

	if (isatty(0))
		usage(1);

/* call crack to interpret command line */

	while ((ch = crack(argc,argv,"N|h",0)) != NULL){
		switch (ch) {
			case 'N': N =  sfexpr(arg_option,1.0); break;
			case 'h': usage(0);
			default:  usage(1);
		}
	}

	if (N > 1024) {
		fprintf(stderr,"glitch: maximum N is 1024\n");
		N = 1024;
	}
	if (N < 1) {
		fprintf(stderr,"glitch: minimum N is 1\n");
		N = 1;
	} 

/* main program */

	if (getfloat(&in1) <= 0)
		exit(1);
	if (getfloat(&in2) <= 0)
		exit(1);
	oldslope = in2 - in1;
	in1 = in2;
	while (getfloat(&in2) > 0) {
		newslope = in2 - in1;
		err = newslope - oldslope;
		saveerr(nsamps, err, N);
		agerr += fabs(err);
		oldslope = newslope;
		in1 = in2;
		nsamps++;
	}
	diag(N);
	printf("average error=\t%f\n", agerr/nsamps);
}

#define HISTLEN 1024
float hist[HISTLEN];
int histind[HISTLEN];
int hi;

/*  hist contains the HISTLEN greatest errors in decreasing order */

saveerr(x, y, N)
	long	x;
	float	y;
	int	N;
{

	hi = N - 1;
	if (fabs(y) <= fabs(hist[hi]))
		return;
	while (fabs(y) > fabs(hist[--hi])) {
		hist[hi+1] = hist[hi];
		histind[hi+1] = histind[hi];
		if (hi == 0){
			hist[0] = y;
			histind[0] = x;
			return;
		}
	}
	hist[++hi] = y;
	histind[hi] = x;
	return;
}

diag(N)
	int N;
{
	register int i, j, k;

	float	list[HISTLEN];
	int	listind[HISTLEN];

	k = 0;

	/* try to group adjacent indices together */

	for (i=0; i < N; i++) if (histind[i] != 0){
		list[k] = hist[i];
		listind[k] = histind[i];
		k++;
		for (j=i+1; j < N; j++){
			if (abs(histind[j] - histind[i]) < 3){
				list[k] = hist[j];
				listind[k] = histind[j];
				histind[j] = 0;
				k++;
			}
		}
	}


	for (i=0; i < N; i++)
		printf("%d:\t%f\n",listind[i],list[i]);
}

usage(exitcode)
	int	exitcode;
{
	fprintf(stderr,"%s%s",
	"\nglitch [-Nnumber] < floatsams\n",
	"\n\t-N  number of possible glitches to report (22)\n");

	exit(exitcode);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.