/* test_fft.c test modified Howard's fftd */ #include #include #include "fftd.h" #define Pi 3.1415926535897932384626433832795028841971 #define n 16 int main(int argc, char *argv[]) { double rdat[4*n]; /* real part */ double idat[4*n]; /* imaginary part */ double rslt[4*n]; /* cos,sin pair terms */ double arslt[4*n]; /* for antialias rslt */ double AT[4*n], BT[4*n], C[4*n]; /* for convolution */ double th, v; int i; int k = 1; /* fft, ifft */ printf("test_fft.c test fftd.c \n"); printf("check implies other coefficients should be near zero \n"); for(i=0; i=n/4 && i<3*n/4) v = -1.0; if(i==n/4 || i==3*n/4) v = 0.0; rdat[i] = v; idat[i] = 0.0; } printf("square wave data, cos series \n"); for(i=0; in/2) v = -1.0; if(i==n/2 || i==0) v = 0.0; rdat[i] = v; idat[i] = 0.0; } printf("square wave data, for sin series \n"); for(i=0; i=n/2) v = -1.0; rdat[i] = v; idat[i] = 0.0; } printf("square wave data, for sin, no zero \n"); printf(" note: cos values come in \n"); for(i=0; i=n/2) v = -3.0+4.0*(double)i/(double)n; rdat[i] = v; idat[i] = 0.0; } printf("triangle wave data, cos series \n"); for(i=0; in/4 && i<=3*n/4) v = 2.0-v; if(i>3*n/4) v = v -4.0; rdat[i] = v; idat[i] = 0.0; } printf("triangle wave data, sin series \n"); for(i=0; i=n/2) v = -2.0+2.0*(double)i/(double)n; if(i==n/2) v = 0.0; rdat[i] = v; idat[i] = 0.0; } printf("saw tooth wave data, sin series \n"); for(i=0; i=n/4 && i<3*n/4) v = -1.0; if(i==n/4 || i==3*n/4) v = 0.0; rdat[i] = v; idat[i] = 0.0; } printf("square wave data, a , upper half zero\n"); for(i=0; i<2*n; i++) printf("[%d] real = %g, imag = %g \n", i, rdat[i], idat[i]) ; fftd(AT, rdat, idat, 2*n, 1); printf("AT FFT of sauare wave\n"); for(i=0; i<2*n; i++) printf("cos %d th = %g, sin %d th = %g \n", i, AT[2*i], i, AT[2*i+1]) ; for(i=0; i=n/2) v = -3.0+4.0*(double)i/(double)n; rdat[i] = v; idat[i] = 0.0; } printf("triangle wave data, b , upper half zero \n"); for(i=0; i<2*n; i++) printf("[%d] real = %g, imag = %g \n", i, rdat[i], idat[i]) ; fftd(BT, rdat, idat, 2*n, 1); printf("BT FFT of sauare wave\n"); for(i=0; i<2*n; i++) printf("cos %d th = %g, sin %d th = %g \n", i, BT[2*i], i, BT[2*i+1]) ; /* form complex product, take inverse FFT */ for(i=0; i<2*n; i++) { rdat[i] = AT[2*i]*BT[2*i] - AT[2*i+1]*BT[2*i+1]; idat[i] = AT[2*i]*BT[2*i+1] + AT[2*i+1]*BT[2*i]; } fftd(C, rdat, idat, 2*n, -1); printf("convolution of a with b \n"); for(i=0; i