ftp.nice.ch/pub/next/unix/audio/cmix.s.tar.gz#/cmix/rlrlpc/lpc.c

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

#include <math.h>
#include <stdio.h>
#include <sys/file.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include </musr/H/sfheader.h>

#define POLE_DEFAULT 24
#define FRAMESIZE_DEFAULT 200
char lpc_anal[MAXPATHLEN], unstable[MAXPATHLEN], soundfile[MAXPATHLEN];
int poles = POLE_DEFAULT;
int framesize = FRAMESIZE_DEFAULT;
double inskip = 0;
double duration;
int durset = 0;
int verbose = 0;

int first_frame = 1;
int last_frame = 0;

main(ac,av)
int ac;
char *av[];
	{
	int i, valid_sf, sffd;
	SFHEADER  sfh;
	struct stat sfst;

	/* set up parameters by setting up defaults, reading args,
	/* and overriding defaults as needed 
	*/

	/* have to have at least the nsame of the soundfile */
	if(ac < 2)
		usage();
	strcpy(soundfile, av[ac-1]);
	/* make sure it's valid, and find out the duration so we
	/* can have a default duration 
	*/
	readopensf(soundfile, sffd, sfh, sfst, av[0], valid_sf);
	close(sffd);
	if(valid_sf != 0)
		usage();
	if(verbose)
		printf("srate:%f chans:%d bsize:%d class:%d\n", 
		  sfsrate(&sfh),sfchans(&sfh),sfbsize(&sfst),sfclass(&sfh));
	/* default duration - whole file */
	duration=(double)sfbsize(&sfst)/(double)sfsrate(&sfh)/(double)sfchans(&sfh)/(double)sfclass(&sfh);
	sprintf(lpc_anal, "%s.la", soundfile);
	sprintf(unstable, "%s.uf", soundfile);
	for(i = 1; i < ac && av[i][0] == '-'; i++)
		{
		if(strlen(av[i]) != 2)
			usage();
		if(i >= ac-1)
			usage();
		switch(av[i][1])
			{
			case 'v':
			 verbose = 1;
			 break;
			case 'o':
			 strcpy(lpc_anal, av[++i]);
			 break;
			case 'p':
			 poles = atoi(av[++i]);
		         break;
			case 'i':
			 inskip = atof(av[++i]);
			 break;
			case 'd':
			 duration = atof(av[++i]);
			 durset = 1;
			 break;
			case 'f':
			 framesize = atoi(av[++i]);
			 break;
			default:
			 usage();
			 break;
			}
		}
	/* 'cuz then the soundfile was not at the end */
	if(i != ac-1)
		usage();
	/* now look - if we set inskip but let duration default, then we      
	/* need to keep the durn thing from reading off the end 
	*/
	if(inskip > 0.0 && !durset)
		duration -= inskip;
	create(lpc_anal);
	create(unstable);
	if((last_frame = anallpc(lpc_anal, soundfile, poles, framesize, inskip, duration,verbose)) < 0)
		{
		fprintf(stderr, "fatal error from anallpc\n");
		fprintf(stderr, "BUT I'M GOING ON ANYWAY!\n");

		/* exit(-1); */
		}
	rootst_(lpc_anal, unstable, &poles, &first_frame, &last_frame);
	stabl_(lpc_anal, unstable, &poles);
	unlink(unstable);
	fprintf(stderr, "DONE\n");
	}



usage()
	{
	char *use =
"lpc [-o lpc_anal_file] [-p #poles] [-f framesize] \
[-v] [-i inskip] [-d duration] soundfile\n\n\
Defaults: soundfile.la for lpc_analysis file\n\
	  %d for number of poles\n\
	  %d for frame size\n\
	  non-verbose (use -v for verbose)\n\
	  0 for inskip (seconds to skip before readin soundfile)\n\
	  (length of file minus inskip) for duration\n";

	fprintf(stderr, use, POLE_DEFAULT, FRAMESIZE_DEFAULT);
	exit(-1);
	}

create(f)
char *f;
	{
	FILE *fp = NULL;

	if((fp = fopen(f, "w")) == NULL)
		{
		perror(f);
		usage();
		}
	fclose(fp);
	}

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