1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
#include <stdio.h>
#include <stdlib.h>
#include "fft.c"
int main()
{
int i; /* generic index */
char file[FILENAME_MAX]; /* name of data file */
int N; /* number of points in FFT */
double (*x)[2]; /* pointer to time-domain samples */
double (*X)[2]; /* pointer to frequency-domain samples */
double dummy; /* scratch variable */
FILE *fp; /* file pointer */
/* Get name of input file of time-domain samples x. */
printf("Input file for time-domain samples x(n)? ");
scanf("%s", file);
/* Read through entire file to get number N of points in FFT. */
if(!(fp = fopen(file, "r")))
{
printf(" File \'%s\' could not be opened!", file);
exit(EXIT_FAILURE);
}
N=0;
while(fscanf(fp, "%lg%lg", &dummy, &dummy) == 2) N++;
printf("N = %d", N);
/* Check that N = 2^n for some integer n >= 1. */
if(N >= 2)
{
i = N;
while(i==2*(i/2)) i = i/2; /* While i is even, factor out a 2. */
} /* For N >=2, we now have N = 2^n iff i = 1. */
if(N < 2 || i != 1)
{
printf(", which does not equal 2^n for an integer n >= 1.");
exit(EXIT_FAILURE);
}
/* Allocate time- and frequency-domain memory. */
x = malloc(2 * N * sizeof(double));
X = malloc(2 * N * sizeof(double));
/* Get time-domain samples. */
rewind(fp);
for(i=0; i<N; i++) fscanf(fp, "%lg%lg", &x[i][0], &x[i][1]);
fclose(fp);
/* Calculate FFT. */
fft(N, x, X);
/* Print time-domain samples and resulting frequency-domain samples. */
printf("\nx(n):");
for(i=0; i<N; i++) printf("\n n=%d: %12f %12f", i, x[i][0], x[i][1]);
printf("\nX(k):");
for(i=0; i<N; i++) printf("\n k=%d: %12f %12f", i, X[i][0], X[i][1]);
/* Clear time-domain samples and calculate IFFT. */
for(i=0; i<N; i++) x[i][0] = x[i][1] = 0;
ifft(N, x, X);
/* Print recovered time-domain samples. */
printf("\nx(n):");
for(i=0; i<N; i++) printf("\n n=%d: %12f %12f", i, x[i][0], x[i][1]);
/* Write frequency-domain samples X to a file, if desired. */
printf("\nOutput file for frequency-domain samples X(k)?"
"\n (if none, abort program): ");
scanf("%s", file);
if(!(fp = fopen(file, "w")))
{
printf(" File \'%s\' could not be opened!", file);
exit(EXIT_FAILURE);
}
for(i=0; i<N; i++) fprintf(fp, "%23.15e %23.15e\n", X[i][0], X[i][1]);
fclose(fp);
printf("Samples X(k) were written to file %s.", file);
/* Free memory. */
free(x);
free(X);
return 0;
}
|