ftp.nice.ch/pub/next/unix/audio/cmix.s.tar.gz#/cmix/cmd/fftmain.c

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.