diff --git a/DFT.cc b/DFT.cc index fd7b3f220916c0ecb0bcc376ab5a6a00557f89c9..c31c9e9d8aa4baf276ee39c6548b6175e657a5ca 100644 --- a/DFT.cc +++ b/DFT.cc @@ -13,75 +13,70 @@ int main() const double PI{std::acos(-1)}; // inFile innehåller uHatt data och outFile är resulterande filen - std::string inFile{"sinusKoefficenter.txt"}; - std::string outFile{"sinusFHat.txt"}; + std::string inFile{"sinus.txt"}; + std::string outFile{"inversSinusDFT.txt"}; // Perioden för funktionen double T{2*PI}; - // Definerar omega,my och n. (n is the size of the vectors,matrix) - double omega{2.0*PI/T}; - std::complex<double> my{std::exp(1i * omega)}; + int const n{20}; - + std::complex<double> inputFunction[n]; std::complex<double> F[n][n]; - std::complex<double> fHat[n]; - std::complex<double> uHat[n]; + std::complex<double> funcTransf[n]; + std::complex<double> inverseFuncTransf[n]; std::string dataLine; - std::ifstream uHatData (inFile); + std::ifstream functionData (inFile); - - // while-loop variabel samt element i uHat + // while-loop variabel samt element i int loop = 0; - std::complex<double> uHatElement; + std::complex<double> element; - if (uHatData.is_open()) + if (functionData.is_open()) { - while (std::getline (uHatData,dataLine) ) + while ((std::getline (functionData,dataLine)) && (loop < n) ) { std::istringstream is(dataLine); - is >> uHatElement; - uHat[loop] = uHatElement; + is >> element; + inputFunction[loop] = element; loop++; } - uHatData.close(); + functionData.close(); } - // Behövs för att skriva få rätt format på raderna i filename2 - std::ostringstream strConverter; - std::string output; + for(int i = 0; i<n; i++) + { + for(int j = 0; j<n; j++) + { + std::complex<double> exponent = static_cast<double> (i*j); + F[j][i] = std::exp(-1.0*T*1i*exponent/(n+1.0)); + funcTransf[i] = funcTransf[i] + F[j][i]*inputFunction[i]; + } + + } + + for(int i = 0; i<n; i++) + { + for(int j = 0; j<n; j++) + { + std::complex<double> exponent = static_cast<double> (i*j); + F[j][i] = std::exp(1.0*T*1i*exponent/(n+1.0)); + inverseFuncTransf[i] = inverseFuncTransf[i] + F[j][i]*funcTransf[i]; + } + } std::ofstream resultFile; resultFile.open(outFile); - // Sätter önskad antal decimaler resultFile << std::fixed << std::setprecision(10); - for(int i = 0; i<n; i++) + for (int i=0;i<n;i++) { - for(int j = 0; j<n; j++) - { - std::complex<double> exponent = static_cast<double> (i*j); - F[j][i] = std::pow(my,exponent); - fHat[i] = fHat[i] + F[j][i]*uHat[i]; - // Skriver ut F matrisen - std::cout<<F[j][i]<<" "; - } - std::cout <<'\n'; - // Tar bort paranteserna från komplexa talet. Då det blir lättare för PlotData.py - strConverter.str(""); - strConverter << fHat[i]; - output = strConverter.str().substr(1, strConverter.str().size() - 2); - // Skriver in fHat in i resultFile - resultFile << output << '\n'; + resultFile << inverseFuncTransf[i].real() << "," << inverseFuncTransf[i].imag() << '\n'; } resultFile.close(); - std::cout << "done"<<'\n'; + std::cout << "DFT done"<<'\n'; return 0; } -DFT::DFT() -{ -} - diff --git a/FFTW.cc b/FFTW.cc new file mode 100644 index 0000000000000000000000000000000000000000..bf85078b5557cb3846eda1f36e04dc9a591948b4 --- /dev/null +++ b/FFTW.cc @@ -0,0 +1,98 @@ +#include "Header files/FFTW.h" +#include <fftw3.h> +#include <iostream> +#include <fstream> +#include <cmath> +#include <complex> +#include <string> + +// Macro för Re och Im +#define REAL 0 +#define IMAG 1 + +int main() +{ + // Antal punkter som ska transformeras/inverstransformeras + int const n=20; + + // Input funktions data + fftw_complex functionData[n]; + + // FFTW transformen av datan + fftw_complex transfData[n]; + + // FFTW invers transform av traData + fftw_complex invTransfData[n]; + + + // inFile innehåller funktions data och outFile1 är resulterande filen efter transformen. + // outFile2 är resulterande filen efter inverstransformen av transformen + std::string inFile{"sinus.txt"}; + std::string outFile1{"sinusFFTW.txt"}; + std::string outFile2{"inversSinusFFTW.txt"}; + + std::string dataLine; + std::ifstream functionDataFile (inFile); + + + // while-loop variabel samt element i inFile + int loop = 0; + std::complex<double> dataElement; + + if (functionDataFile.is_open()) + { + while ((std::getline (functionDataFile,dataLine) && (loop < n))) + { + std::istringstream is(dataLine); + is >> dataElement; + functionData[loop][REAL] = dataElement.real(); + functionData[loop][IMAG] = dataElement.imag(); + loop++; + } + functionDataFile.close(); + } + + // Beräknar transformen + // FFTW_MEASURE funkar ej för mig... har det med min cpu att göra? + fftw_plan transform = fftw_plan_dft_1d(n, functionData, transfData, FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute(transform); + + // Förstör planen + fftw_destroy_plan(transform); + + // Öppnar filen som resultatet skrivs in i + // std::ofstream resultFile1; + // resultFile1.open(outFile1); + // for(int i=0; i<n;i++) + // { + // resultFile1 << transfData[i][REAL]<< "," << transfData[i][IMAG] << '\n'; + // } + // resultFile1.close(); + + + // Tar fram inverstransformen + fftw_plan inversTransform = fftw_plan_dft_1d(n, transfData, invTransfData, FFTW_BACKWARD, FFTW_ESTIMATE); + fftw_execute(inversTransform); + + // Förstör planen + fftw_destroy_plan(inversTransform); + fftw_cleanup(); + + // Öppnar filen som resultatet skrivs in i + std::ofstream resultFile2; + resultFile2.open(outFile2); + + for(int i=0; i<n;i++) + { + // Divition med 1/n för att får rätt skala + resultFile2 << invTransfData[i][REAL]*1/n<< "," << invTransfData[i][IMAG]*1/n << '\n'; + } + resultFile2.close(); + + std::cout<<"fftw is done"<<'\n'; + return 0; +} + + +FFTW::FFTW() +{} \ No newline at end of file diff --git a/GenerateData.py b/GenerateData.py index 2005529045e62b1ce4512dc7f67a569b3ff2be6d..70cd7adb18335f32f804fc0269ffcd44430bf4d2 100644 --- a/GenerateData.py +++ b/GenerateData.py @@ -2,14 +2,14 @@ import math # Genererar sinus värden för att jämföra med DFT # välj filnamn -filename = 'sinus.txt' +filename = 'x.txt' # välj antal datapunkter numDataPoints = 20 file = open(filename, 'w') # file.write(omega+'\n') for i in range(numDataPoints): - file.write(str(math.sin(i))+'\n') + file.write(str(i)+'\n') pass file.close() print('done') diff --git a/Header files/DFT.h b/Header files/DFT.h index 49db810752a1a8af281d0774ee699482cb3cb7a8..0f8bf18c6a63aa5874e20182121085658ea66c8f 100644 --- a/Header files/DFT.h +++ b/Header files/DFT.h @@ -1,7 +1,7 @@ +#include <complex> + class DFT { public: - DFT(); - private: }; diff --git a/Header files/FFTW.h b/Header files/FFTW.h new file mode 100644 index 0000000000000000000000000000000000000000..e69d3da843bd53912a444f15e695dc63c9fe462f --- /dev/null +++ b/Header files/FFTW.h @@ -0,0 +1,6 @@ +class FFTW +{ +public: + FFTW(); +private: +}; diff --git a/AdaptivKvadratur.cc b/Legacy code/AdaptivKvadratur.cc similarity index 100% rename from AdaptivKvadratur.cc rename to Legacy code/AdaptivKvadratur.cc diff --git a/Header files/AdaptivKvadratur.h b/Legacy code/AdaptivKvadratur.h similarity index 100% rename from Header files/AdaptivKvadratur.h rename to Legacy code/AdaptivKvadratur.h diff --git a/Legacy code/Figure_1.png b/Legacy code/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbe35a39f975aed231a4e5976fb871b38a7dad2 Binary files /dev/null and b/Legacy code/Figure_1.png differ diff --git a/Legacy code/FlopPlot.py b/Legacy code/FlopPlot.py new file mode 100644 index 0000000000000000000000000000000000000000..dc2a7343a29157efb7a424a7a5fff4c5cf62a759 --- /dev/null +++ b/Legacy code/FlopPlot.py @@ -0,0 +1,30 @@ +import matplotlib.pyplot as plt +import numpy as np +import math + +n=11 +Y1 = list(range(n)) +X1 = list(range(1,len(Y1) + 1)) + +Y2 = list(range(n)) +X2 = list(range(1,len(Y2) + 1)) + +for i in range(1,n): + Y1[i] = i**2 + pass + +plt.scatter(X1, Y1) +plt.plot(X1, Y1, label = "O(n^2)") + +for i in range(1,n): + Y2[i] = i*math.log2(i) + pass + +plt.scatter(X2, Y2) +plt.plot(X2, Y2, linestyle='dashed', label = "O(nlog2(n))") + +plt.legend() +plt.xlabel('n') +plt.ylabel('flops') +plt.show() +print('Plot is done') diff --git a/PlotData.py b/PlotData.py index 79a3940810966da44de5e3f631e72fd796dd5800..e8754785ef91680081cf748e69c8c175fe1a34d9 100644 --- a/PlotData.py +++ b/PlotData.py @@ -1,23 +1,35 @@ import matplotlib.pyplot as plt import numpy as np -filename1 = 'sinus.txt' -filename2 = 'sinusFHat.txt' +filename0 = 'sinus.txt' +filename1 = 'inversSinusDFT.txt' +filename2 = 'inversSinusFFTW.txt' -# Tar fram data och plotar datan i filename1 mot x=1...len() -Y = np.loadtxt(filename1, unpack=True) +name0 = filename0[:len(filename0)-4] +name1 = filename1[:len(filename1)-4] +name2 = filename2[:len(filename2)-4] + +# Tar fram data och plotar datan i filename0 mot x=1...len() +Y = np.loadtxt(filename0, unpack=True) X = list(range(0,len((Y)))) plt.scatter(X, Y) -plt.plot(X, Y) +plt.plot(X, Y, label = name0) + +# Tar fram data och plotar datan i filename1 mot xHat1=1...len() +YHat1,Imaginary = np.loadtxt(filename1, delimiter =',',unpack=True) +XHat1 = list(range(0,len((YHat1)))) +plt.plot(XHat1, YHat1, label = name1) +plt.scatter(XHat1, YHat1) -# Tar fram data och plotar datan i filename2 mot xHat=1...len() -YHat,Imaginary = np.loadtxt(filename2, delimiter =',',unpack=True) -XHat = list(range(0,len((YHat)))) -plt.plot(XHat, YHat) -plt.scatter(XHat, YHat) +# Tar fram data och plotar datan i filename2 mot xHat2=1...len() +YHat2,Imaginary = np.loadtxt(filename2, delimiter =',',unpack=True) +XHat2 = list(range(0,len((YHat2)))) +plt.plot(XHat2, YHat2, label = name2, color='k') +plt.scatter(XHat2, YHat2, color='k') -plt.title(filename1) +plt.legend() +plt.title(name0) plt.xlabel('X') plt.ylabel('Y') plt.show() -print('done') +print('Plot is done') diff --git a/a.out b/a.out index 11763863664236e1947120e4d0f288b821f02fa9..634c2f9334a48227c91bb4fc0d65bfa8266b8775 100755 Binary files a/a.out and b/a.out differ diff --git a/inversSinusDFT.txt b/inversSinusDFT.txt new file mode 100644 index 0000000000000000000000000000000000000000..936556e578e0d655c6b739af2e08970c999ff6e9 --- /dev/null +++ b/inversSinusDFT.txt @@ -0,0 +1,20 @@ +0.0000000000,0.0000000000 +0.8414709848,-0.0000000000 +0.9092974268,0.0000000000 +0.1411200081,-0.0000000000 +-0.7568024953,-0.0000000000 +-0.9589242747,0.0000000000 +-0.2794154982,-0.0000000000 +0.6569865987,0.0000000000 +0.9893582466,-0.0000000000 +0.4121184852,0.0000000000 +-0.5440211109,-0.0000000000 +-0.9999902066,-0.0000000000 +-0.5365729180,-0.0000000000 +0.4201670368,0.0000000000 +0.9906073557,-0.0000000000 +0.6502878402,-0.0000000000 +-0.2879033167,-0.0000000000 +-0.9613974919,-0.0000000000 +-0.7509872468,0.0000000000 +0.1498772097,0.0000000000 diff --git a/inversSinusFFTW.txt b/inversSinusFFTW.txt new file mode 100644 index 0000000000000000000000000000000000000000..631549b66535e625f863c8e407a8a1467798e0c6 --- /dev/null +++ b/inversSinusFFTW.txt @@ -0,0 +1,20 @@ +0,0 +0.841471,1.67914e-19 +0.909297,-6.86156e-18 +0.14112,-1.42613e-17 +-0.756802,0 +-0.958924,1.11022e-17 +-0.279415,1.79638e-17 +0.656987,-3.70247e-18 +0.989358,0 +0.412118,6.69364e-18 +-0.544021,-2.22045e-17 +-0.99999,1.67914e-19 +-0.536573,0 +0.420167,-1.42613e-17 +0.990607,1.79638e-17 +0.650288,1.11022e-17 +-0.287903,0 +-0.961397,-3.70247e-18 +-0.750987,-6.86156e-18 +0.149877,6.69364e-18 diff --git a/sinusFHat.txt b/sinusFHat.txt deleted file mode 100644 index f435a06c569f8bfcfd4005d6296b70ce04d19fc0..0000000000000000000000000000000000000000 --- a/sinusFHat.txt +++ /dev/null @@ -1,20 +0,0 @@ --5.35179,0 -0.128618,-0.419678 -0.471065,0.0251305 --0.00337691,0.299632 --0.223093,-0.132737 -0.0820078,-0.174555 --0.785837,-0.17028 --0.328153,0.495687 --0.365077,-0.378147 -0.203529,-0.333906 -0.128914,0.0825593 -0.018315,-0.00991071 -0.549578,0.737994 -1.02951,-1.14958 -0.161698,0.376965 --0.303066,0.0827178 --0.0466722,-0.0801996 --0.110187,0.0509128 -0.022323,-0.675769 --5.82281,0.874292 diff --git a/sinusKoefficenter.txt b/sinusKoefficenter.txt deleted file mode 100644 index 34ba38710a26184446dd98cc42d9e15058dd780c..0000000000000000000000000000000000000000 --- a/sinusKoefficenter.txt +++ /dev/null @@ -1,30 +0,0 @@ -(-0.2675897034,0.0000000000) -(0.0852312069,-0.3773186557) -(0.4327528535,-0.0421730761) -(0.0643636349,0.2955946212) -(-0.3080274028,-0.0740207123) -(0.0277376003,-0.4390337963) -(0.3617780138,-0.0877454965) -(-0.0156795662,0.2689983932) -(-0.3921622667,-0.0799871230) -(-0.0552578280,-0.4239994274) -(0.2850822747,-0.0526451122) -(-0.0813070464,0.3219824211) -(-0.4426410892,-0.0124137418) -(-0.0874494641,-0.3460380783) -(0.2731793450,0.0308569456) -(-0.0721812031,0.4058334340) -(-0.4130538737,0.0665727764) -(-0.0392404662,-0.2768270540) -(0.3370127234,0.0859892698) -(0.0033077054,0.4434591973) -(-0.3306029697,0.0843525910) -(0.0450460354,-0.2799986509) -(0.4178942962,0.0620634560) -(0.0757555249,0.4002667578) -(-0.2710933581,0.0245790224) -(0.0879174198,-0.3526369175) -(0.4414619183,-0.0189232131) -(0.0785540641,0.3159670451) -(-0.2892379013,-0.0577923860) -(0.0499579339,-0.4279585665) diff --git a/x.txt b/x.txt new file mode 100644 index 0000000000000000000000000000000000000000..19df0a2d8aeab0e8737c2c84bae50ff92cb31d28 --- /dev/null +++ b/x.txt @@ -0,0 +1,20 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19