Newer
Older
#include <complex>
#include <cmath>
#include <iomanip>
#include "Header files/FFT.h"
#include <iostream>
#include <fstream>
#include <string>
#include <bits/stdc++.h>
using namespace std::complex_literals;
// Alg start----------------------------------------------------------------------------------------------------
std::vector<std::complex<double>> fft(std::vector<std::complex<double>> f,std::vector<std::complex<double>> returnVector,int n,double flag)
int N = f.size();
std::complex<double> my = std::exp(flag*2*PI*1i/static_cast<double> (N));
for(int i=0;i<n;i++)
{
returnVector[i] = f[0]+std::pow(my,i)*f[1];
}
std::vector<std::complex<double>> a1;
std::vector<std::complex<double>> b1;
for(int i=0;i<N;i++)
}
}
std::vector<std::complex<double>> a2 = fft(a1,returnVector,n,flag);
std::vector<std::complex<double>> b2 = fft(b1,returnVector,n,flag);
// I and D mult.
{
std::complex<double> c1;
std::complex<double> c2;
c1 = a2[k] + std::pow(my,k) * b2[k];
c2 = a2[k] + std::pow(my,k+n/2) * b2[k];
return returnVector;
}
// Alg slut----------------------------------------------------------------------------------------------------
int main()
{
FFT call;
int const n{16};
// inFile innehåller uHatt data och outFile är resulterande filen
std::string inFile{"sinus.txt"};
std::string outFile{"inversSinusFFT.txt"};
std::vector<std::complex<double>> inputVector = call.getInput(inFile,n);
// Skapar två vektorer av storlek n med nollor i sig
std::vector<std::complex<double>> returnVector1;
std::vector<std::complex<double>> returnVector2;
for(int i=0;i<n;i++)
{
returnVector1.push_back(0);
returnVector2.push_back(0);
}
// Anroppar alg -------------------------------------------------------------
std::vector<std::complex<double>> transf = fft(inputVector,returnVector1,n,-1);
std::vector<std::complex<double>> invTransf = fft(transf,returnVector2,n,1);
for(int i=0;i<n;i++)
{
invTransf[i]=invTransf[i]/static_cast<double>(n);
}
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
// ---------------------------------------------------------------------------
call.printToFile(invTransf,outFile,n);
std::cout << "FFT done"<<'\n';
return 0;
}
// Skriva/läsa-----------------------------------------------------------------------------
std::vector<std::complex<double>> FFT::getInput(std::string inFile, int n)
{
std::vector<std::complex<double>> inputVector;
// Hämtar data och sätter den på en vector
int loop = 0;
std::string dataLine;
std::ifstream functionData (inFile);
std::complex<double> element;
if (functionData.is_open())
{
while ((std::getline (functionData,dataLine)) && (loop < n) )
{
std::istringstream is(dataLine);
is >> element;
inputVector.push_back(element);
loop++;
}
functionData.close();
}
void FFT::printToFile(std::vector<std::complex<double>> printVector, std::string fileName, int n)
{
// Skriver ut inversFuncTransf till en fil
std::ofstream resultFile;
// Sätter önskad antal decimaler
resultFile << std::fixed << std::setprecision(10);
for (int i=0;i<n;i++)
{
resultFile << printVector[i].real() << "," << printVector[i].imag() << '\n';
}
resultFile.close();
}