|
|
|
@ -4,7 +4,6 @@ |
|
|
|
#include <ctype.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include <complex>
|
|
|
|
> |
|
|
|
#include<vector>
|
|
|
|
using namespace std; |
|
|
|
#ifndef M_PI
|
|
|
|
@ -13,14 +12,16 @@ using namespace std; |
|
|
|
typedef struct { |
|
|
|
long N; |
|
|
|
double b, a, beta, alpha; |
|
|
|
double tmin, tmax,h; |
|
|
|
double tmin, tmax,h,tl; |
|
|
|
int m; |
|
|
|
int sign; |
|
|
|
} fft_param; |
|
|
|
|
|
|
|
complex<double> expo(fft_param *fp,int k) { |
|
|
|
int sign = fp->sign; |
|
|
|
return exp(sign*2 * M_PI * 1i / ((double) k)); |
|
|
|
int N=fp->N; |
|
|
|
return exp(sign*2.0 * M_PI * 1i* ((double)(k/N))); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
vector<complex<double>> fourierTrafo(fft_param *fp, vector<complex<double>> x) { |
|
|
|
@ -38,13 +39,19 @@ vector<complex<double>> fourierTrafo(fft_param *fp, vector<complex<double>> x) { |
|
|
|
ungerPkt[k] = x[2 * k + 1]; |
|
|
|
} |
|
|
|
|
|
|
|
vector<complex<double>> ftger(N / 2) = fourierTrafo(fp, gerPkt); //???????????????????????
|
|
|
|
vector<complex<double>> ftunger(N / 2) = fourierTrafo(fp, ungerPkt); //???????????????????
|
|
|
|
vector<complex<double>> ftger = fourierTrafo(fp, gerPkt); |
|
|
|
vector<complex<double>> ftunger = fourierTrafo(fp, ungerPkt); |
|
|
|
vector<complex<double>> out(N); |
|
|
|
|
|
|
|
for (int k = 0; k < N / 2; k++) { |
|
|
|
out[k] = (ftger[k] + ftunger[k] * expo(fp,k))/(double)N; |
|
|
|
out[k + N / 2] = (ftger[k] - ftunger[k] *expo(fp,k))/(double)N; |
|
|
|
if(sign==-1){ |
|
|
|
out[k] = (ftger[k] + ftunger[k] * expo(fp,k)); |
|
|
|
out[k + N / 2] = (ftger[k] - ftunger[k] *expo(fp,k)); |
|
|
|
} |
|
|
|
else{ |
|
|
|
out[k] = (ftger[k] + ftunger[k] * expo(fp,k)); |
|
|
|
out[k + N / 2] = (ftger[k] - ftunger[k] *expo(fp,k)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return out; |
|
|
|
@ -60,15 +67,15 @@ vector<complex<double>> test(fft_param *fp){ |
|
|
|
vector<complex<double>> x(N); |
|
|
|
|
|
|
|
for(int k=0;k<N;k++){ |
|
|
|
x(k)=sin(tmin+k*h); |
|
|
|
x[k]=sin(tmin+k*h); |
|
|
|
} |
|
|
|
vector<complex<double>> out = fourierTrafo(fp, x); |
|
|
|
fft_param n= *fp; |
|
|
|
n.sign=-1; |
|
|
|
vector<complex<double>> doppelout = fourierTrafo(&n, out); |
|
|
|
FILE *fp2 = fopen("testFFT.csv" ,'w'); |
|
|
|
FILE *fp2 = fopen("testFFT.csv" ,"w"); |
|
|
|
for(int k=0;k<N;k++){ |
|
|
|
fprintf(fp2,"%f\t%f\t%f\n",x[k], doppelout[k],(tmin+k*h)); |
|
|
|
fprintf(fp2,"%f\t%f\t%f\n",(tmin+k*h),x[k].real(), doppelout[k].real()/(double)N); |
|
|
|
} |
|
|
|
|
|
|
|
return x; |
|
|
|
@ -79,7 +86,7 @@ vector<complex<double>> makeS(fft_param *fp){ |
|
|
|
double tmin=0; |
|
|
|
double t; |
|
|
|
double tl=fp->tl; |
|
|
|
double alpha=f->alpha; |
|
|
|
double alpha=fp->alpha; |
|
|
|
int N=fp->N; |
|
|
|
vector<complex<double>> s(N); |
|
|
|
for(int k=0;k<N;k++){ |
|
|
|
@ -93,7 +100,7 @@ vector<complex<double>> makeE(fft_param *fp){ |
|
|
|
double tmax=fp->tmax; |
|
|
|
double tmin=0; |
|
|
|
double t; |
|
|
|
double beta=f->beta; |
|
|
|
double beta=fp->beta; |
|
|
|
double tl=fp->tl; |
|
|
|
double a=fp->a; |
|
|
|
double b=fp->b; |
|
|
|
@ -102,7 +109,8 @@ vector<complex<double>> makeE(fft_param *fp){ |
|
|
|
vector<complex<double>> s=makeS(fp); |
|
|
|
for(int k=0;k<N;k++){ |
|
|
|
t=tmin+k*h; |
|
|
|
e[k]=b*sin(2*M_PI*beta*t)+a*rand(1)+s[k]; |
|
|
|
e[k]=b*sin(2*M_PI*beta*t)+ 2*a*(rand()-0.5)+s[k]; |
|
|
|
//e[k]=b*sin(2*M_PI*beta*t)+s[k];
|
|
|
|
} |
|
|
|
return e; |
|
|
|
} |
|
|
|
@ -112,23 +120,23 @@ vector<complex<double>> aufgabe3 (fft_param *fp){ |
|
|
|
double tmax=fp->tmax; |
|
|
|
double t=tmin; |
|
|
|
int N=fp->N; |
|
|
|
vector<complex<double>> e(N)=makeE; |
|
|
|
vector<complex<double>> s(N)=makeS(fp); |
|
|
|
vector<comlex<double>> Fe=fourierTrafo(fp,e); |
|
|
|
vector<complex<double>> e=makeE(fp); |
|
|
|
vector<complex<double>> s=makeS(fp); |
|
|
|
vector<complex<double>> Fe=fourierTrafo(fp,e); |
|
|
|
fft_param fps=*fp; |
|
|
|
fps.sign=-1; |
|
|
|
vector<comlex<double>> Fs=fourierTrafo(&fps,s); |
|
|
|
vector<comlex<double>> FFes(N); |
|
|
|
vector<complex<double>> Fs=fourierTrafo(&fps,s); |
|
|
|
vector<complex<double>> FFes(N); |
|
|
|
|
|
|
|
for(int k=0;k<N;k++){ |
|
|
|
FFes[k]=Fe[k]*conj(Fs[k]); |
|
|
|
|
|
|
|
} |
|
|
|
vector<comlex<double>> FFFes(N)=fourierTrafo(fp, FFes); |
|
|
|
vector<complex<double>> FFFes=fourierTrafo(fp, FFes); |
|
|
|
return FFFes; |
|
|
|
|
|
|
|
} |
|
|
|
double main(){ |
|
|
|
int main(){ |
|
|
|
fft_param fp; |
|
|
|
fp.N= pow(2,13); |
|
|
|
fp.tmin=0; |
|
|
|
|