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

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

#include <carl/libran.h>

/*
 * corrand - variable correlated number generator.
 * 
 * This routine produces noise that goes from white to increasingly more
 * correlated (to a dc constant) as cor_factor goes from 0 to 1.  Values
 * are produced in the range of lb to ub.  Informal tests have shown that
 * values of cor_factor=.96 produce roughly the same spectrogram as 1/f
 * noise (drops 6dB per octave when piped to spect).  Values of cor_factor
 * much greater than that roll off much more quickly.  Values in excess of
 * .99 tend to never get out to the extremes of the boundaries except in
 * very large samples.  For cor_factor=1.0, the output will continue to be
 * whatever was the last contents of save.
 * It is interesting to compare true 1/f noise to the result of this
 * routine.
 */

double cor_factor;

double corrand(lb, ub)
	double lb, ub;
{
	static double save;
	double range, wlb, wub;

	range = (ub-lb) - (ub-lb) * cor_factor;
	wlb = save - range;
	if (wlb < lb) wlb = lb;
	wub = save + range;
	if (wub > ub) wub = ub;
	save = frand(wlb, wub);
	return(save);
	}

/*
 * #include<stdio.h>
 * #include<math.h>
 * 
 * main(argc, argv)
 * 	char **argv;
 * {
 * 	int otty = isatty(1), n;
 * 	float input, lb, ub;
 * 	n = atoi(argv[1]);
 * 	cor_factor = atof(argv[2]);
 * 	lb = atof(argv[3]);
 * 	ub = atof(argv[4]);
 * 	while (n--)
 * 		{
 * 		input = corrand(lb, ub);
 * 		if (otty) printf("%f\n", input);
 * 		else putfloat(&input);
 * 		}
 * 	flushfloat();
 * 	}
 * 
 */

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