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.