ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/lib/libdgl/funstuff.c

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

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


/*
 * main(argc, argv)
 * 	char **argv;
 * {
 * 	int i;
 * 	float x;
 * 	int nsamps = 23;
 * 	FUN *f, *rautoxfun();
 * 	f = rautoxfun(argv[1]);
 * /1*	for (i = f->min_x; i < f->max_x; i++)*1/
 * /1*		printf("%f\n", f->y[i]);*1/
 * /1*	for (i = 0, x = 0; x < f->max_x; x += f->max_x/10)*1/
 * 	for (i = 0; i < nsamps; i++)
 * 		{
 * 		float y, ntrpfun();
 * 		x = (float) i/nsamps;
 * 		x *= f->max_x;
 * 		y = ntrpfun(f, x);
 * 		printf("%d:\t%3.1f:\t%f\n", i++, x, y);
 * 		}
 * 	}
 */

/*
 * rautoxfun - read function with automatic abcissas - only y values supplied,
 * x assumed to go from 0 to EOF
 * file must be binary floating point numbers
 */

FUN *rautoxfun(name)
	char *name;
{
	FUN *f;
	FILE *fp, *fopen();
	int bufsiz = BUFSIZ, sizeofbuf = sizeof(float)*BUFSIZ;
	register int i = 0;
	float input;

	if ((fp = fopen(name, "r")) == NULL) return(NULL);

	f = (FUN *) calloc(sizeof(FUN), 1);
	f->y = (float *) malloc(sizeof(float)*BUFSIZ);
	f->min_y = HUGE; f->max_y = -HUGE;

	while (fgetfloat(&input, fp) > 0)
		{
		if (i >= bufsiz) f->y = 
			(float *) realloc(f->y, bufsiz+=sizeofbuf);
		*(f->y+i++) = input;
		if (input < f->min_y) f->min_y = input;
		if (input > f->max_y) f->max_y = input;
		}
	fclose(fp);
	f->min_x = 0; f->max_x = i-1;
	f->y = (float *) realloc(f->y, i*sizeof(float));
	return(f);
	}


/*
 * ntrpfun - interpolate function f by x.  No checking that x lies within
 * range of f.
 */

float ntrpfun(f, x)
	FUN *f; float x;
{
	int is1, is2;
	float s1, s2;
	int ix1 = x, ix2;
	if (ix1 < f->max_x ) ix2 = ix1+1;	/* might have to wrap around */
	else ix2 = 0;
	return(f->y[ix1] + ((x - ix1) * (f->y[ix2] - f->y[ix1])));
	}


/*
 * incrfun - treat function f as though made up of n points, indexed by i
 */

float incrfun(f, i, n)
	FUN *f; int i, n;
{
	register float x, y; 
	float ntrpfun();
	x = (float) i/n;
	x *= f->max_x;
	return(ntrpfun(f, x));
	}

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