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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/*Description: Program takes data from user-specified file and computes FFTs
(Fast Fourier Transforms) on data. Outputs FFTs to FFTdata.xlsx, which is saved
in default domain. For program to work, user-specified file must be saved in
default domain also.(Default domain: where program executible file is located.*/
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
void FFT(double* data, unsigned long nn);
//takes data array and calculates FFT's on data array
void swap(double& a, double& b);
//swaps values
int main()
{
char filename[101];
double data[65];
ifstream existtest, infile;
ofstream opentest, outfile;
cout << "Copyright: 3 Aug 2011 Karla Guardado\n\n";
cout << "Program takes data from user-specified file and computes FFTs\n";
cout << "(Fast Fourier Transforms) on data. Outputs FFTs to FFTdata.xls.\n";
cout << endl;
cout << "Enter file name. (Type name, extension included, then press <ENTER>.)";
cout << endl << endl << "File name: ";
cin >> filename;
cout << endl;
existtest.open(filename);
if (existtest.fail()) {
existtest.close();
out << "ERROR: File does not exsist. Exiting.\n" << endl;
system ("pause");
return 0;
}
existtest.close();
opentest.open(filename);
if (opentest.fail()) {
opentest.close();
cout << "ERROR: File failed to open. Exiting.";
system ("pause");
return 0;
}
opentest.close();
infile.open(filename);
int i = 0; double num;
while (infile >> num) { data[i] = num; i++;}
unsigned long nom = 16; FFT(data, nom);
outfile.open("FFTdata.csv");
cout<< "Working...\n\n";
i = 0; while (i < sizeof(data)) { outfile << data[i]; }
outfile.close();
cout << "Done.\n\n";
system ("pause");
return 0;
}
void FFT(double* data, unsigned long nn)
//takes data array and calculates FFT's on data array
{
unsigned long n, mmax, m, j, istep, i;
double wtemp, wr, wpr, wpi, wi, theta;
double tempr, tempi;
//reverse-binary reindexing
n = nn<<1;
j=1;
for (i=1; i<n; i+=2) {
if (j>i) {
swap(data[j-1], data[i-1]);
swap(data[j], data[i]);
}
m = nn;
while (m>=2 && j>m) {
j -= m;
m >>= 1;
}
j += m;
}
//here begins the Danielson-Lanczos section
mmax=2;
while (n>mmax) {
istep = mmax<<1;
theta = -(2*M_PI/mmax);
wtemp = sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi = sin(theta);
wr = 1.0;
wi = 0.0;
for (m=1; m < mmax; m += 2) {
for (i=m; i <= n; i += istep) {
j=i+mmax;
tempr = wr*data[j-1] - wi*data[j];
tempi = wr * data[j] + wi*data[j-1];
data[j-1] = data[i-1] - tempr;
data[j] = data[i] - tempi;
data[i-1] += tempr;
data[i] += tempi;
}
wtemp=wr;
wr += wr*wpr - wi*wpi;
wi += wi*wpr + wtemp*wpi;
}
mmax=istep;
}
}
void swap(double& a, double& b)
//swaps values
{
double temp;
temp = a;
a = b;
b = temp;
}
|