This is lpc.anallpc.c in view mode; [Download] [Up]
#include "../../H/sfheader.h"
#include <stdio.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include <math.h>
/* analysis program, designed to read only integer, mono
* sound files. Seems to be able to squeeze in 34 pole analysis.
* Right now it is scaled to a maximum of 34 poles and a maximum
* segment size of 500, which means that the frame slices must not
* exceed 250. On a separate i/d machine these can be comfortably
* increased. This program takes about 58k as scaled here. */
/* origin: cmix "anallpc.c" */
/* WARNING _ THESE ARE USED AS EXTERNS BY OTHER FUNCTIONS! */
/* DON'T CLEAN THEM UP UNLESS YOU *REALLY* KNOW WHAT YOU'RE DOING! */
int NPOLE;
int FRAME;
int NPP1;
#define POLEMAX 100
#define FLOAT 4
#define FRAMAX 500
#define NDATA 4 /* number of data values stored with frame */
anallpc(_lpc_anal, _soundfile, _poles, _framesize, _inskip, _duration, verbose)
char *_lpc_anal, *_soundfile;
int _poles, _framesize;
double _inskip, _duration;
int verbose;
{
int jj,ii,counter;
SFHEADER sfh;
int pos;
float coef[POLEMAX+NDATA],inskip,dur;
char name[36];
double errn,rms1,rms2,cc[40];
short sigs[FRAMAX];
int sigi[FRAMAX];
long i,nsamps,begbyte,outskip,nframes;
short *cyllist;
int anal,sound,nbytes,nblpc,firstframe,nread;
struct stat sfst;
int result;
if((anal = open(_lpc_anal,2)) < 0) {
perror(_lpc_anal);
return(-1);
}
drwopensf(_soundfile,sound,sfh,sfst,"anallpc",result,2);
if(result < 0) {
perror(_soundfile);
return(-1);
}
if(verbose)
printsf(&sfh);
if(sfchans(&sfh) != 1) {
fprintf(stderr," Can only analyze mono file, sorry\n");
return(-1);
}
if(sfclass(&sfh) != SF_SHORT) {
fprintf(stderr," Can only analyze integer file\n");
return(-1);
}
NPOLE = _poles; /* set NPOLE for extern use */
if(_poles > POLEMAX) {
fprintf(stderr,"number of poles exceeds maximum allowed\n");
return(-1);
}
FRAME = _framesize * 2;
if(FRAME > FRAMAX) {
fprintf(stderr,"exceeds maximum allowed\n");
return(-1);
}
inskip = _inskip;
dur = _duration;
begbyte = (long)(inskip * sfsrate(&sfh)) * (long)sfclass(&sfh);
if(pos = sflseek(sound,begbyte,0) < 0) {
fprintf(stderr,"Bad sflseek\n");
return(-1);
}
firstframe = 1;
NPP1 = _poles+1;
nblpc = (_poles + NDATA)*FLOAT;
outskip = firstframe * nblpc;
if((lseek(anal,outskip,0)) < 0) {
fprintf(stderr,"Bad lseek on analysis file\n");
return(-1);
}
nsamps = dur * sfsrate(&sfh);
nread = read(sound, (char *)sigs, FRAME * sfclass(&sfh));
if(nread < 0){
fprintf(stderr," Bad sfread, nread = %d\n",nread);
return(-1);
}
for(i=0;i<(nread/sfclass(&sfh));i++)
sigi[i] = sigs[i];
nframes = nsamps/_framesize;
for(i = counter = 0; i < nframes; i++) {
alpol(sigi,&errn,&rms1,&rms2,cc);
coef[0] = (float)rms2;
coef[1] = (float)rms1;
coef[2] = (float)errn;
if(verbose)
printf("%d %f %f %f %f\n",
counter++,coef[0],coef[1],coef[2],coef[3]);
coef[3] = 0.; /*save for pitch of frame */
for(jj=NDATA; jj<_poles+NDATA; jj++) /* reverse order and change sign */
coef[jj] = (float)-cc[_poles-jj+(NDATA - 1)];
for(jj=0; jj<_framesize; jj++) {
sigi[jj] = sigi[jj+_framesize];
}
nread=read(sound,(char *)(sigs+(short)_framesize),_framesize * sfclass(&sfh));
if(nread < 0) {
fprintf(stderr," bad read, n= %d\n",nread);
return(-1);
}
for(jj=0;jj<(nread/sfclass(&sfh));jj++)
sigi[jj+_framesize] = sigs[jj+_framesize];
if((nbytes = write(anal,(char *)coef,nblpc))!= nblpc) {
printf(" write error, nbytes = %d\n",nbytes);
return(-1);
}
}
return(nframes);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.