This is cfsst.c in view mode; [Download] [Up]
#include <math.h> #include <stdio.h> #include <carl/sndio.h> #include <carl/carl.h> /* ----------------------------------------------------------------- cfsst.c This is the FFT subroutine fsst.f from the IEEE library recoded in C. It takes a pointer to a vector b[i], for i = 0, 1, ..., N-1, and replaces it with its inverse DFT assuming real output. -------------------------------------------------------------------*/ cfsst(b,N) float *b; long N; { /* This subroutine synthesizes the real vector b[k] for k=0, 1, ..., N-1 from the fourier coefficients stored in the b array of size N+2. The DC term is in location b[0] with b[1] equal to 0. The i'th harmonic is a complex number stored as b[2*i] + j b[2*i+1]. The N/2 harmonic is in b[N] with b[N+1] equal to 0. The subroutine is called as fsst(b,N) where N=2**M and b is the real array described above. */ extern double pii, pi2, p7, p7two, c22, s22; float pi8, invN; int M; long i, Nt, off; pii = 4. * atan(1.); pi2 = pii * 2.; pi8 = pii / 8.; p7 = 1. / sqrt(2.); p7two = 2. * p7; c22 = cos(pi8); s22 = sin(pi8); /* determine M */ for (i=1, Nt=2; i<20; i++,Nt *= 2) if (Nt==N) break; M = i; if (M==20){ fprintf(stderr,"fast: N is not an allowable power of two\n"); exit(1); } b[1] = b[N]; for (i=3; i<N; i+=2) b[i] *= -1.; /* scale the input by N */ invN = 1. / N; for (i=0; i<N; i++) b[i] *= invN; /* scramble the inputs */ cford2(M,b); cford1(M,b); /* perform radix 4 iterations */ Nt = 4*N; if (M != 1) for (i=1; i<=M/2; i++){ Nt /= 4; off = N / Nt; cfr4syn(off,Nt,b,b+off,b+2*off,b+3*off,b,b+off,b+2*off,b+3*off); } /* do a radix 2 iteration if one is required */ if (M%2 != 0){ off = N / 2; cfr2tr(off,b,b+off); } return; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.