This is lpcanal.c in view mode; [Download] [Up]
/* Lpc analysis program, runs under cmix. Doesn't really have to but
* it was easy to work it up this way. The only things that would have
* to be replaced would be argument passing, and sample readins.
* It is hard-wired right now to only write to a file called 'analysis'
* There are a few settings in lpc.h which should be fussed with before
* compiling. They are used to set the maximum size of the arrays in
* alpol.c and gauss.c. On a separate i/d machine these can probably
* be expanded comfortably. The lpcprofile sets the sampling rate and
* defines the string lpcanal for data cards. (lpcprof.c). A sample
* data file might be:
*
* open 184 0 0 (opens ccss file 184, read only)
* lpcanal 9 10 18 125 1 (analyzes from time 9 to 10 on this file
* with a frame size of 125, and starts
* writing output file at frame 1.) */
#include <stdio.h>
#include <math.h>
#include "../H/ugens.h"
int NPOLE;
int FRAME;
int NPP1;
lpcanal(p,n_args)
float *p;
{
int jj,slice;
float input[4],coef[36];
double sig[500],errn,rms1,rms2,cc[40];
long i,nsamps,outskip;
int anal,ndata,nbytes,nblpc,iframe;
if((anal = open("analysis",2)) < 0) {
fprintf(stderr," Can't open data file\n");
closesf();
}
/* p0 is input skip, p1=dur, p2=npoles, p3=#new samps per frame,
* p4 is output frame number (defaults to input) */
ndata = 4; /* number of data values */
NPOLE = p[2];
FRAME = p[3] * 2;
NPP1 = NPOLE+1;
slice = FRAME/2;
nblpc = (NPOLE + ndata)*FLOAT;
if(!p[4]) p[4] = p[1] * SR/(float)slice;
iframe = p[4];
outskip = (long)(p[4]-1) * (long)nblpc;
if((lseek(anal,outskip,0)) < 0) {
fprintf(stderr,"Bad lseek on analysis file\n");
closesf();
}
nsamps = setnot(p[0],p[1],0);
for(i = 0; i<FRAME; i++) {
getin(input,0);
sig[i] = (double)input[0];
}
i = 0;
while(i < nsamps) {
alpol(sig,&errn,&rms1,&rms2,cc);
coef[0] = (float)rms2;
coef[1] = (float)rms1;
coef[2] = (float)errn;
printf("%d %f %f %f \n",iframe,coef[0],coef[1],coef[2]);
coef[3] = 0.; /*save for pitch of frame */
for(jj=4; jj<NPOLE+4; jj++)
coef[jj] = (float)-cc[NPOLE-jj+3];
for(jj=0; jj<slice; jj++,i++) {
getin(input,0);
sig[jj] = sig[jj+slice];
sig[jj+slice] = (double)input[0];
}
if((nbytes = write(anal,(char *)coef,nblpc))!= nblpc) {
printf(" write error, nbytes = %d\n",nbytes);
closesf();
}
iframe++;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.