This is fftmain.c in view mode; [Download] [Up]
#include <math.h> #include <stdio.h> #include "fft.h" #include "complexf.h" #define prtargs() \ { \ int i; \ char **j; \ i = argc; \ j = argv; \ while (--i > 0 ) { \ fprintf(stderr,"%s%c",*++j, (i > 1) ? ' ' : '\n'); \ } \ } #define FFTS( GETFFT ,PUTFFT ) \ for (i=0;i<nffts;i++){ \ GETFFT \ fft(isi,m,s);\ PUTFFT \ } #define PUTCOMPLEXFLOAT \ write(1,(char *)s,LENCOMPLEX * m); #define GETCOMPLEXFLOAT \ read(0,(char *)s,LENCOMPLEX * m); #define PUTREALFLOAT \ for ( r0=0; r0 < m; r0++) { \ fbuff[r0] = s[r0].re; \ } \ write(1,(char *)s,LENFLOAT * m); #define GETREALFLOAT \ read(0,(char *)s,LENFLOAT * m); \ for ( r0=0; r0<m; r0++) { \ cmplx( fbuff[r0], 0., s[r0]); \ } #define PUTCOMPLEXASCII \ for(r0=0;r0<m;r0++) { \ prtcmplx(s[r0]); \ printf("\n"); \ } #define GETCOMPLEXASCII \ for(r0=0;r0<m;r0++) { \ scanf("%f %f",&dr,&di); \ s[r0].re=dr; s[r0].im=di; \ } #define GETREALASCII \ for(r0=0;r0<m;r0++) { \ scanf("%f ",&dr); \ s[r0].re=dr; \ s[r0].im=0.; \ } #define PUTREALASCII \ for (r0=0;r0<m;r0++) { \ printf("%f ",s[r0].re); \ } #define PUTREAL16BITINT \ for ( r0=0; r0 < m; r0++) { \ ibuff[r0] = (D16BITINT) s[r0].re; \ } \ write(1,(char *)s,LEN16BITINT * m); #define GETREAL16BITINT \ read(0,(char *)s,LEN16BITINT * m); \ for( r0=0; r0 <m ; r0++) { \ s[r0].re = (FLOAT_PRECISION) ibuff[r0]; \ s[r0].im = .0; \ } /* * command program for fft routine use * program to do fft(s) of standard input & print on standard output * main: just a big switch to send the right input type to the right * output type * current fft subroutine does in place cmplx to cmplx transform * Arguments for subroutine call: * m = number of samples to be analyzed per fft * isi= -1 for forward transform, +1 for reverse transform * s = complex array for transforms */ main(argc,argv) int argc; char *argv[]; { complex s[4096]; FLOAT_PRECISION *fbuff,sr,dr,di,time[3]; D16BITINT *ibuff; char intype,outtype; long isi; register long nffts; register long r0,i,m; fbuff = (FLOAT_PRECISION *)s; ibuff = (D16BITINT *)fbuff; intype = 'A'; outtype = 'A'; sr = DEFAULT_SR; isi = -1; m = DEFAULT_FFTSIZE; nffts = DEFAULT_NFFTS; time[0] = 0.; time[1] = 0.; time[2] = 0.; /* prtargs(); */ i = 4; while (--argc > 0) { printf ("%s\n",*argv); if ((*++argv)[0] != '-' && --i > 0){ if (i == 3) m = atol(*argv); else time[2-i] = atof(*argv); } else { printf ("%c\n",*argv[1]); switch ((*argv)[1]) { case 'n': nffts=atol(*++argv); break; case 'm': m=atol(*++argv); break; case 'r': isi = 1; break; case 'k': sr=atof(*++argv); break; case 'w': case 'f': case 'a': case 'F': case 'A': intype = (*argv)[1]; break; case 'o': ++argv; switch ((*argv)[0]) { case'a': case'f': case'A': case'F': outtype = (*argv)[0]; break; default:; } break; case 'l': case 'd': break; default:; } } } if (time[1] != 0.) { if (sr==0.) sr=DEFAULT_SR; if (time[1]<0.) nffts=DEFAULT_MAXFFTS; else { time[1]=time[1]-time[0]; if (nffts == 1) nffts=(long) (((time[1]*sr) +1.) /(FLOAT_PRECISION) m ) ; } } fprintf(stderr,"\n %d %d point %c to %c ffts\n",nffts,m,intype,outtype); fprintf(stderr,"nffts=%d start=%f end=%f si=%f secs sr=%f\n",nffts,time[0],time[1],time[2],sr); dr=di=0.; switch (intype) { case'F': switch (outtype) { case'F': FFTS( GETCOMPLEXFLOAT , PUTCOMPLEXFLOAT ) break; case'f': FFTS( GETCOMPLEXFLOAT , PUTREALFLOAT ) break; case'A': FFTS( GETCOMPLEXFLOAT , PUTCOMPLEXASCII ) break; case'a': FFTS( GETCOMPLEXFLOAT , PUTREALASCII ) break; default:; } break; case'f': switch (outtype) { case'F': FFTS( GETREALFLOAT , PUTCOMPLEXFLOAT ) break; case'f': FFTS( GETREALFLOAT , PUTREALFLOAT ) break; case'A': FFTS( GETREALFLOAT , PUTCOMPLEXASCII ) break; case'a': FFTS( GETREALFLOAT , PUTREALASCII ) break; default:; } break; case'A': switch (outtype) { case'F': FFTS( GETCOMPLEXASCII , PUTCOMPLEXFLOAT ) break; case'f': FFTS( GETCOMPLEXASCII , PUTREALFLOAT ) break; case'A': FFTS( GETCOMPLEXASCII , PUTCOMPLEXASCII ) break; case'a': FFTS( GETCOMPLEXASCII , PUTREALASCII ) break; default:; } break; case'a': switch (outtype) { case'F': FFTS( GETREALASCII , PUTCOMPLEXFLOAT ) break; case'f': FFTS( GETREALASCII , PUTREALFLOAT ) break; case'A': FFTS( GETREALASCII , PUTCOMPLEXASCII ) break; case'a': FFTS( GETREALASCII , PUTREALASCII ) break; default:; } break; case'w': switch (outtype) { case'F': FFTS( GETREAL16BITINT , PUTCOMPLEXFLOAT ) break; case'f': FFTS( GETREAL16BITINT , PUTREALFLOAT ) break; case'A': FFTS( GETREAL16BITINT , PUTCOMPLEXASCII ) break; case'a': FFTS( GETREAL16BITINT , PUTREALASCII ) break; case'w': FFTS( GETREAL16BITINT , PUTREAL16BITINT ) break; default:; } break; default:; } } /* end of main */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.