ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/sigsf/cfr4syn.c

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

#include <math.h>

/*-------------------------------
	cfr4syn.c

radix 4 synthesis
-------------------------------*/

cfr4syn(off,nn,b0,b1,b2,b3,b4,b5,b6,b7)
	float	*b0, *b1, *b2, *b3, *b4, *b5, *b6, *b7;
	long	off, nn;
{
	extern	double	pii, pi2, p7, p7two, c22, s22;

	float	piovn, arg, c1, c2, c3, s1, s2, s3, 
		t0, t1, t2, t3, t4, t5, t6, t7;

	long	i, off4, jj0, jlast, k0, kl, ji, jl, jr, j, k,
		jj1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12,
		j13, j14, j15, j16, j17, j18, jthet, th2,
		l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12,
		l13, l14, l15, l16, l17, l18, l19,
		l[19];

/* jthet is a reversed binary counter; jr steps two at a time to
	locate real parts of intermediate results, and ji locates
	the imaginary part corresponding to jr.
*/

	l[0] = nn/4;
	for (i=1; i<19; i++){
		if (l[i-1]<2) l[i-1] = 2;
		else if (l[i-1]!=2) {
			l[i] = l[i-1]/2;
			continue;
		}
		l[i] = 2;
	}

	l1 = l[18];
	l2 = l[17];
	l3 = l[16];
	l4 = l[15];
	l5 = l[14];
	l6 = l[13];
	l7 = l[12];
	l8 = l[11];
	l9 = l[10];
	l10 = l[9];
	l11 = l[8];
	l12 = l[7];
	l13 = l[6];
	l14 = l[5];
	l15 = l[4];
	l16 = l[3];
	l17 = l[2];
	l18 = l[1];
	l19 = l[0];

	piovn = pii / nn;
	ji = 3;
	jl = 2;
	jr = 2;

	/* for (jj1=2; jj1<=l1; jj1+=2){ */
	jj1 = 2;
loop1:	 /* for (j2=jj1; j2<=l2; j2+=l1){ */
	 j2 = jj1;
loop2:	  /* for (j3=j2; j3<=l3; j3+=l2){ */
	  j3 = j2;
loop3:	   /* for (j4=j3; j4<=l4; j4+=l3){ */
	   j4 = j3;
loop4:	    /* for (j5=j4; j5<=l5; j5+=l4){ */
	    j5 = j4;
loop5:	     for (j6=j5; j6<=l6; j6+=l5){
	      for (j7=j6; j7<=l7; j7+=l6){
	       for (j8=j7; j8<=l8; j8+=l7){
		for (j9=j8; j9<=l9; j9+=l8){
		 for (j10=j9; j10<=l10; j10+=l9){
		  for (j11=j10; j11<=l11; j11+=l10){
		   for (j12=j11; j12<=l12; j12+=l11){
		    for (j13=j12; j13<=l13; j13+=l12){
		     for (j14=j13; j14<=l14; j14+=l13){
		      for (j15=j14; j15<=l15; j15+=l14){
		       for (j16=j15; j16<=l16; j16+=l15){
			for (j17=j16; j17<=l17; j17+=l16){
			 for (j18=j17; j18<=l18; j18+=l17){
			  for (jthet=j18; jthet<=l19; jthet+=l18){
			   th2 = jthet - 2;
			   if (th2 > 0) {
			    arg = th2 * piovn;
			    c1 = cos(arg);
			    s1 = -sin(arg);
			    c2 = c1*c1 - s1*s1;
			    s2 = c1*s1 + c1*s1;
			    c3 = c1*c2 - s1*s2;
			    s3 = c2*s1 + s2*c1;
			    off4 = 4 * off;
			    jj0 = jr * off4;
			    k0 = ji * off4;
			    jlast = jj0 + off;
			    for (j=jj0; j<jlast; j++){
			     k = k0+j-jj0;
			     t0 = b0[j] + b6[k];
			     t1 = b7[k] - b1[j];
			     t2 = b0[j] - b6[k];
			     t3 = b7[k] + b1[j];
			     t4 = b2[j] + b4[k];
			     t5 = b5[k] - b3[j];
			     t6 = b5[k] + b3[j];
			     t7 = b4[k] - b2[j];
			     b0[j] = t0 + t4;
			     b4[k] = t1 + t5;
			     b1[j] = (t2+t6)*c1 - (t3+t7)*s1;
			     b5[k] = (t2+t6)*s1 + (t3+t7)*c1;
			     b2[j] = (t0-t4)*c2 - (t1-t5)*s2;
			     b6[k] = (t0-t4)*s2 + (t1-t5)*c2;
			     b3[j] = (t2-t6)*c3 - (t3-t7)*s3;
			     b7[k] = (t2-t6)*s3 + (t3-t7)*c3;
			    }
			    jr = jr + 2;
			    ji = ji - 2;
			    if (ji <= jl){
			     ji = 2*jr - 1;
			     jl = jr;
			    }
			   }
			   else {
			    for (i=0; i<off; i++){
			     t0 = b0[i] + b1[i];
			     t1 = b0[i] - b1[i];
			     t2 = b2[i] * 2.0;
			     t3 = b3[i] * 2.0;
			     b0[i] = t0 + t2;
			     b2[i] = t0 - t2;
			     b1[i] = t1 + t3;
			     b3[i] = t1 - t3;
			    }
			    if (nn>4) {
			     k0 = 4*off;
			     kl = k0 + off;
			     for (i=k0; i<kl; i++) {
			      t2 = b0[i] - b2[i];
			      t3 = b1[i] + b3[i];
			      b0[i] = (b0[i] + b2[i]) * 2.0;
			      b2[i] = (b3[i] - b1[i]) * 2.0;
			      b1[i] = (t2 + t3) * p7two;
			      b3[i] = (t3 - t2) * p7two;
			     }
			    }
			   }
			  }
			 }
			}
		       }
		      }
		     }
		    }
		   }
		  }
		 }
		}
	       }
	      }
	     }
	    j5 += l4;
	    if (j5 <= l5) goto loop5;
	    /* } */
	   j4 += l3;
	   if (j4 <= l4) goto loop4;
	   /* } */
	  j3 += l2;
	  if (j3 <= l3) goto loop3;
	  /* } */
	 j2 += l1;
	 if (j2 <= l2) goto loop2;
	 /* } */
	jj1 += 2;
	if (jj1 <= l1) goto loop1;
	/* } */

	return;

}

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