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

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

#define NPOLE 6
#define NPOLEM1 5
float cq,outold;
main()
{
	float z,sig[100],past[100],d,c[100],out[100],x;
	float bwarppol(),past4[100],out2[100],ballpole(),allpole();
	float warpset(),cl,warppol(),zz,past2[100],past3[100];
	int i,npoles,nvals,j,jcount;
	jcount = 0;
	for(j=0; j<100; j++) {
	sig[j] = past[j] = out[j]= past2[j] = past3[j] = past4[j] = out2[j];
	c[j] = 1./(float)((j+1)*100);
	}
	z=d=0;
	warpinit();
	cl=warpset(d,c);
	x=1;
	sig[0]=1;
	ballpole(sig,&jcount,NPOLE,past3,c,out,30);
	bwarppol(sig,NPOLE,past4,d,c,out2,30);
	warpinit();
	cl=warpset(d,c);
	jcount=0;
	for(i=0; i<30; i++) {
		z=allpole(x,&jcount,NPOLE,past,c);
		zz=warppol(x,past2,d,c);
		printf("%d %e %e %e %e %e\n",i,z,zz,cl,out[i],out2[i]);
		x=0;
	}
}
float allpole(x,jcount,npoles,past,c)
float x,*past,*c;
long  *jcount,npoles;
{
	int j,nfint;
	for(j= *jcount, nfint=0;  nfint<npoles;  nfint++,j++)
		x += (*(c+nfint) * *(past+j));
	*(past+ *jcount) = *(past+*jcount+npoles) = x;
	*jcount = (*jcount + 1) % npoles;
	return(x);
}
float warppol(sig,past,d,c)
float sig,*past,d,*c;
{
	float temp1,temp2;
	register n;

	temp1 = past[NPOLEM1];
	past[NPOLEM1] = cq * outold - d * past[NPOLEM1];
	for(n=NPOLE-2; n>=0; n--) {
		temp2 = past[n];
		past[n] = d * (past[n+1] - past[n]) + temp1;
		temp1 = temp2;
		}
	for(n=0;n<NPOLE;n++)  sig += c[n] * past[n];
	outold = sig;
	return(sig);
}

float warpset(d,c)     
float d,*c;
{
	register m;
	float cl;

	for(m=1; m<NPOLE; m++)   c[m] += d * c[m-1];
	cl = 1./(1.-d * c[NPOLEM1]);
	cq = cl * (1. - d * d);
	return(cl);
}

warpinit()
{
	outold = 0;
}


float ballpole(x,jcount,npoles,past,c,out,nvals)
float *x,*past,*c,*out;
long  *jcount,npoles,nvals;
{
	register i,j,nfint;
	register float *temp;
	for(i=0;i<nvals;++i){
		*temp = *x++;
		for(j= *jcount, nfint=0;  nfint<npoles;  nfint++,j++)
			*temp += (*(c+nfint) * *(past+j));
		*out++ =  *(past+ *jcount) = *(past+*jcount+npoles) = *temp;
		*jcount = (*jcount + 1) % npoles;
		}
}
float bwarppol(sig,npoles,past,d,c,out,nvals)
float *sig,*past,d,*c,*out;
{
	float temp1,temp2;
	int i,n;
	for(i=0; i<nvals; i++) {
		temp1 = past[npoles-1];
		past[npoles-1] = cq * outold - d * past[npoles-1];
		for(n=npoles-2; n>=0; n--) {
			temp2 = past[n];
			past[n] = d * (past[n+1] - past[n]) + temp1;
			temp1 = temp2;
			}
		for(n=0;n<npoles;n++)   *sig += c[n] * past[n];
		*out++ = outold = *sig++;
	}
}

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