inverse_fourier_transform_DFT_algorithm
piątek, 30 czerwca 2017
piątek, 14 kwietnia 2017
inverse fourier transform DFT and 1 stage FFT
//inverse fourier transform DFT and 1 stage FFT
//author marcin matysek (r)ewertyn.PL
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <cmath>
#include <time.h>
#include <complex>
#include <fstream>
using namespace std;
//complex number method:
void fun_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[]);
void fun_inverse_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[]);
void DFT_FFT_1_stage(int N,std::complex<double> tab[]);
void inverse_DFT_FFT_1_stage(int N,std::complex<double> tab[]);
int a2,a3,a4,a5,a6,a7;
int fi=0;
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
int N;
//if N==period of signal in table tab[] then resolution = 1 Hz
N=10;
std::complex<double> tab2[4096]={};
std::complex<double> tab3[4096]={};
std::complex<double> tab4[4096]={};
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
double time2;
double zmienna=0;
cout<<"signal 1="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
cout<<"signal 2="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
system("pause");
clock_t start = clock();
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
for(int i2=0;i2<9;i2++)
{
if(i2==0)
{
a2=0;
}
else if(i2==1)
{
a2=1;
}
else if(i2==2)
{
a2=2;
}
else if(i2==3)
{
a2=3;
}
else if(i2==4)
{
a2=4;
}
else if(i2==5)
{
a2=5;
}
else if(i2==6)
{
a2=6;
}
else if(i2==7)
{
a2=7;
}
else if(i2==8)
{
a2=8;
}
for(int i3=0;i3<2;i3++)
{
if(i3==0)
{
a3=0;
}
else{a3=1;}
for(int i4=0;i4<2;i4++)
{
if(i4==0)
{
a4=0;
}
else{a4=1;}
for(int i5=0;i5<2;i5++)
{
if(i5==0)
{
a5=0;
}
else{a5=1;}
for(int i6=0;i6<2;i6++)
{
if(i6==0)
{
a6=0;
}
else{a6=1;}
for(int i7=0;i7<2;i7++)
{
if(i7==0)
{
a7=0;
}
else{a7=1;}
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
fun_fourier_transform_DFT_method5_full_complex(N,tab3);
DFT_FFT_1_stage(N,tab2);
time2=diffclock( start, clock() );
/*
cout<<"frequency Hz radix-4"<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
cout<<"frequency Hz DFT"<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
*/
// system("pause");
// cout<<"if radix-4 == DFT tab2[j].real(): "<<endl;system("pause");
for(int j=0;j<N;j++)
{
if(((tab3[j].real()-tab2[j].real()>=-0.03)&&(tab3[j].real()-tab2[j].real()<=0.03)))
{
cout.precision(4);
// cout<<"j= "<<j<<" "<<round(tab2[j].real()*1000)/1000<<" ";
//system("pause");
}
else {
cout<<-99<<" .. ";
}
}
//system("pause");
// cout<<endl;
/////////////////////////////////////////////////////////////////
fun_inverse_fourier_transform_DFT_method5_full_complex(N,tab3);
inverse_DFT_FFT_1_stage(N,tab2);
////////////////////////////////////////////////////////////////
/*
cout<<"inverse/signal="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
*/
//fun_inverse_fourier_transform_DFT_method5_full_complex(N,tab3);
for(int j=0;j<N;j++)
{
if(((tab4[j].imag()-tab3[j].imag()>=-0.03)&&(tab4[j].imag()-tab3[j].imag()<=0.03))&&
((tab4[j].real()-tab3[j].real()>=-0.03)&&(tab4[j].real()-tab3[j].real()<=0.03))
)
{
cout.precision(4);
// cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" "<<tab4[j].real()<<" = "<<round(tab3[j].real()*1000)/1000<<" , "<<tab4[j].imag()<<" = "<<round(tab3[j].imag()*1000)/1000<<" ";
//system("pause");
}
else {
//cout<<-99<<" .. ";
}
}
//inverse_DFT_FFT_1_stage(N,tab2);
if(((tab4[1].imag()-tab2[1].imag()>=-0.03)&&(tab4[1].imag()-tab2[1].imag()<=0.03))&&
((tab4[3].imag()-tab2[3].imag()>=-0.03)&&(tab4[3].imag()-tab2[3].imag()<=0.03))
)
{
for(int j=0;j<N;j++)
{
if(((tab4[j].imag()-tab2[j].imag()>=-0.03)&&(tab4[j].imag()-tab2[j].imag()<=0.03))&&
((tab4[j].real()-tab2[j].real()>=-0.03)&&(tab4[j].real()-tab2[j].real()<=0.03))
)
{
cout<<"OK ";
cout.precision(4);
//cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" "<<tab4[j].real()<<" = "<<round(tab2[j].real()*1000)/1000<<" , "<<tab4[j].imag()<<" = "<<round(tab2[j].imag()*1000)/1000<<" ";
//system("pause");
}
else {
//cout<<-99<<" .. ";
}
if(((tab4[j].imag()-tab2[1].imag()>=-0.03)&&(tab4[j].imag()-tab2[1].imag()<=0.03)))
{
cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" | "<<tab4[1].real()<<" = "<<round(tab2[1].real()*1000)/1000<<" , "<<tab4[1].imag()<<" = "<<round(tab2[1].imag()*1000)/1000<<" "<<endl;
cout<<tab4[3].real()<<" = "<<round(tab2[3].real()*1000)/1000<<" , "<<tab4[3].imag()<<" = "<<round(tab2[3].imag()*1000)/1000<<" "<<endl;
system("pause");
}
}
}
}}}}}}
cout<<endl;
system("pause");
return 0;
}
//////////////////////////////////////////////
///////////////////////////////////////////////////
void fun_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[1]={{1,0}};
double zmienna1=2*pi/(float)N;
double fi2=fi;
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=cos(i*j*zmienna1+fi2);
w[0].imag()=(-sin(i*j*zmienna1+fi2));
tab2[i]=tab2[i]+tab[j]*w[0];
}
//cout<<tab2[1]<<endl;
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real();
tab[j].imag() =tab2[j].imag();
}
*/
}
///////////////////////////////////////////////////
void fun_inverse_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[1]={{1,0}};
std::complex<double> w2[1]={{1,0}};
std::complex<double> w3[1]={{1,0}};
int nr1=0,nr2=0,nr3=0,nr4=0;
std::complex<double> nr5=0;
double zmienna1=2*pi/(float)N;
double fi2=fi;
//////////////////////////
if(a2==0)
{
w3[0].real()=-1;
w3[0].imag()=-1;
}
else if(a2==1)
{
w3[0].real()=-1;
w3[0].imag()=0;
}
else if(a2==2)
{
w3[0].real()=-1;
w3[0].imag()=1;
}
else if(a2==3)
{
w3[0].real()=0;
w3[0].imag()=-1;
}
else if(a2==4)
{
w3[0].real()=0;
w3[0].imag()=0;
}
else if(a2==5)
{
w3[0].real()=0;
w3[0].imag()=1;
}
else if(a2==6)
{
w3[0].real()=1;
w3[0].imag()=-1;
}
else if(a2==7)
{
w3[0].real()=1;
w3[0].imag()=0;
}
else if(a2==8)
{
w3[0].real()=1;
w3[0].imag()=1;
}
////////////////
if(a3==0){nr1=-1;}
else{nr1=1;}
if(a4==0){nr2=-1;}
else{nr2=1;}
if(a5==0){nr3=-1;}
else{nr3=1;}
if(a6==0){nr4=-1;}
else{nr4=1;}
if(a7==0){nr5.real()=-1,nr5.imag()=0;}
else{nr5.real()=1,nr5.imag()=0;}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=nr1*cos(nr3*i*j*zmienna1+fi2);
w[0].imag()=nr2*sin(nr4*i*j*zmienna1+fi2);
tab2[i]=tab2[i]+nr5*tab[j]*w[0]*w3[0];
}
//cout<<tab2[1]<<endl;
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*0.5;
tab[j].imag() =tab2[j].imag()*0.5;
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real();
tab[j].imag() =tab2[j].imag();
}
*/
}
void inverse_DFT_FFT_1_stage(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[8]={{1,0}};
std::complex<double> w2[1]={{1,0}};
std::complex<double> w3[1]={{1,0}};
std::complex<double> w4[1]={{1,0}};
int nr1=0,nr2=0,nr3=0,nr4=0,nr6=0,nr7=0,nr8=0,nr9=0;
std::complex<double> nr5=0;
std::complex<double> nr10=0;
double zmienna1=2*pi/(float)N;
double fi2=fi;
//////////////////////////
if(a2==0)
{
w3[0].real()=-1;
w3[0].imag()=-1;
}
else if(a2==1)
{
w3[0].real()=-1;
w3[0].imag()=0;
}
else if(a2==2)
{
w3[0].real()=-1;
w3[0].imag()=1;
}
else if(a2==3)
{
w3[0].real()=0;
w3[0].imag()=-1;
}
else if(a2==4)
{
w3[0].real()=0;
w3[0].imag()=0;
}
else if(a2==5)
{
w3[0].real()=0;
w3[0].imag()=1;
}
else if(a2==6)
{
w3[0].real()=1;
w3[0].imag()=-1;
}
else if(a2==7)
{
w3[0].real()=1;
w3[0].imag()=0;
}
else if(a2==8)
{
w3[0].real()=1;
w3[0].imag()=1;
}
////////////////
if(a3==0){nr1=-1;}
else{nr1=1;}
if(a4==0){nr2=-1;}
else{nr2=1;}
if(a5==0){nr3=-1;}
else{nr3=1;}
if(a6==0){nr4=-1;}
else{nr4=1;}
if(a7==0){nr5.real()=-1,nr5.imag()=0;}
else{nr5.real()=1,nr5.imag()=0;}
/////////////////////////
for(int k=0;k<N;k=k+2)
{
for(int n=0;n<(N/2);n++)
{
//complex number method:
w[0].real()=nr1*cos(nr3*k*n*zmienna1);
w[0].imag()=nr2*sin(nr4*k*n*zmienna1);
w[1].real()=nr1*cos(nr3*(k+1)*n*zmienna1);
w[1].imag()=nr2*sin(nr4*(k+1)*n*zmienna1);
//parzyste:
tab2[k]=tab2[k] +nr5*w[0]*(tab[n]+tab[N/2+n])*w3[0];
//nieparzyste
tab2[k+1]=tab2[k+1]+nr5*w[1]*(tab[n]-tab[N/2+n])*w3[0];
}
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*0.5;
tab[j].imag() =tab2[j].imag()*0.5;
}
/*
for(int i=0;i<N;i++)
{
}
*/
}
void DFT_FFT_1_stage(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[8]={{1,0},{1,0},{1,0},{1,0}};
double zmienna1=2*pi/(float)N;
double fi2=fi;
for(int k=0;k<N;k=k+2)
{
for(int n=0;n<(N/2);n++)
{
//complex number method:
w[0].real()= cos(k*n*zmienna1);
w[0].imag()=-sin(k*n*zmienna1);
w[1].real()= cos((k+1)*n*zmienna1);
w[1].imag()=-sin((k+1)*n*zmienna1);
//parzyste:
tab2[k]=tab2[k]+w[0]*(tab[n]+tab[N/2+n]);
//nieparzyste
tab2[k+1]=tab2[k+1]+w[1]*(tab[n]-tab[N/2+n]);
}
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
/*
for(int i=0;i<N;i++)
{
tab[i]=tab2[i];
}
*/
}
//author marcin matysek (r)ewertyn.PL
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <cmath>
#include <time.h>
#include <complex>
#include <fstream>
using namespace std;
//complex number method:
void fun_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[]);
void fun_inverse_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[]);
void DFT_FFT_1_stage(int N,std::complex<double> tab[]);
void inverse_DFT_FFT_1_stage(int N,std::complex<double> tab[]);
int a2,a3,a4,a5,a6,a7;
int fi=0;
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
int N;
//if N==period of signal in table tab[] then resolution = 1 Hz
N=10;
std::complex<double> tab2[4096]={};
std::complex<double> tab3[4096]={};
std::complex<double> tab4[4096]={};
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
double time2;
double zmienna=0;
cout<<"signal 1="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
cout<<"signal 2="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
system("pause");
clock_t start = clock();
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
for(int i2=0;i2<9;i2++)
{
if(i2==0)
{
a2=0;
}
else if(i2==1)
{
a2=1;
}
else if(i2==2)
{
a2=2;
}
else if(i2==3)
{
a2=3;
}
else if(i2==4)
{
a2=4;
}
else if(i2==5)
{
a2=5;
}
else if(i2==6)
{
a2=6;
}
else if(i2==7)
{
a2=7;
}
else if(i2==8)
{
a2=8;
}
for(int i3=0;i3<2;i3++)
{
if(i3==0)
{
a3=0;
}
else{a3=1;}
for(int i4=0;i4<2;i4++)
{
if(i4==0)
{
a4=0;
}
else{a4=1;}
for(int i5=0;i5<2;i5++)
{
if(i5==0)
{
a5=0;
}
else{a5=1;}
for(int i6=0;i6<2;i6++)
{
if(i6==0)
{
a6=0;
}
else{a6=1;}
for(int i7=0;i7<2;i7++)
{
if(i7==0)
{
a7=0;
}
else{a7=1;}
for(int i=0;i<N;i++)
{
tab2[i].real()=i*1.2+1;
tab2[i].imag()=-N-i-1;
tab3[i].real()=i*1.2+1;
tab3[i].imag()=-N-i-1;
tab4[i].real()=i*1.2+1;
tab4[i].imag()=-N-i-1;
}
fun_fourier_transform_DFT_method5_full_complex(N,tab3);
DFT_FFT_1_stage(N,tab2);
time2=diffclock( start, clock() );
/*
cout<<"frequency Hz radix-4"<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
cout<<"frequency Hz DFT"<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab3[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
*/
// system("pause");
// cout<<"if radix-4 == DFT tab2[j].real(): "<<endl;system("pause");
for(int j=0;j<N;j++)
{
if(((tab3[j].real()-tab2[j].real()>=-0.03)&&(tab3[j].real()-tab2[j].real()<=0.03)))
{
cout.precision(4);
// cout<<"j= "<<j<<" "<<round(tab2[j].real()*1000)/1000<<" ";
//system("pause");
}
else {
cout<<-99<<" .. ";
}
}
//system("pause");
// cout<<endl;
/////////////////////////////////////////////////////////////////
fun_inverse_fourier_transform_DFT_method5_full_complex(N,tab3);
inverse_DFT_FFT_1_stage(N,tab2);
////////////////////////////////////////////////////////////////
/*
cout<<"inverse/signal="<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].real()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab2[j].imag()*1000)/1000<<" ";
}
cout<<endl;
cout<<endl;
*/
//fun_inverse_fourier_transform_DFT_method5_full_complex(N,tab3);
for(int j=0;j<N;j++)
{
if(((tab4[j].imag()-tab3[j].imag()>=-0.03)&&(tab4[j].imag()-tab3[j].imag()<=0.03))&&
((tab4[j].real()-tab3[j].real()>=-0.03)&&(tab4[j].real()-tab3[j].real()<=0.03))
)
{
cout.precision(4);
// cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" "<<tab4[j].real()<<" = "<<round(tab3[j].real()*1000)/1000<<" , "<<tab4[j].imag()<<" = "<<round(tab3[j].imag()*1000)/1000<<" ";
//system("pause");
}
else {
//cout<<-99<<" .. ";
}
}
//inverse_DFT_FFT_1_stage(N,tab2);
if(((tab4[1].imag()-tab2[1].imag()>=-0.03)&&(tab4[1].imag()-tab2[1].imag()<=0.03))&&
((tab4[3].imag()-tab2[3].imag()>=-0.03)&&(tab4[3].imag()-tab2[3].imag()<=0.03))
)
{
for(int j=0;j<N;j++)
{
if(((tab4[j].imag()-tab2[j].imag()>=-0.03)&&(tab4[j].imag()-tab2[j].imag()<=0.03))&&
((tab4[j].real()-tab2[j].real()>=-0.03)&&(tab4[j].real()-tab2[j].real()<=0.03))
)
{
cout<<"OK ";
cout.precision(4);
//cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" "<<tab4[j].real()<<" = "<<round(tab2[j].real()*1000)/1000<<" , "<<tab4[j].imag()<<" = "<<round(tab2[j].imag()*1000)/1000<<" ";
//system("pause");
}
else {
//cout<<-99<<" .. ";
}
if(((tab4[j].imag()-tab2[1].imag()>=-0.03)&&(tab4[j].imag()-tab2[1].imag()<=0.03)))
{
cout<<"j= "<<j<<" "<<a2<<" "<<a3<<" "<<a4<<" "<<a5<<" "<<a6<<" "<<a7<<" | "<<tab4[1].real()<<" = "<<round(tab2[1].real()*1000)/1000<<" , "<<tab4[1].imag()<<" = "<<round(tab2[1].imag()*1000)/1000<<" "<<endl;
cout<<tab4[3].real()<<" = "<<round(tab2[3].real()*1000)/1000<<" , "<<tab4[3].imag()<<" = "<<round(tab2[3].imag()*1000)/1000<<" "<<endl;
system("pause");
}
}
}
}}}}}}
cout<<endl;
system("pause");
return 0;
}
//////////////////////////////////////////////
///////////////////////////////////////////////////
void fun_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[1]={{1,0}};
double zmienna1=2*pi/(float)N;
double fi2=fi;
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=cos(i*j*zmienna1+fi2);
w[0].imag()=(-sin(i*j*zmienna1+fi2));
tab2[i]=tab2[i]+tab[j]*w[0];
}
//cout<<tab2[1]<<endl;
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real();
tab[j].imag() =tab2[j].imag();
}
*/
}
///////////////////////////////////////////////////
void fun_inverse_fourier_transform_DFT_method5_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[1]={{1,0}};
std::complex<double> w2[1]={{1,0}};
std::complex<double> w3[1]={{1,0}};
int nr1=0,nr2=0,nr3=0,nr4=0;
std::complex<double> nr5=0;
double zmienna1=2*pi/(float)N;
double fi2=fi;
//////////////////////////
if(a2==0)
{
w3[0].real()=-1;
w3[0].imag()=-1;
}
else if(a2==1)
{
w3[0].real()=-1;
w3[0].imag()=0;
}
else if(a2==2)
{
w3[0].real()=-1;
w3[0].imag()=1;
}
else if(a2==3)
{
w3[0].real()=0;
w3[0].imag()=-1;
}
else if(a2==4)
{
w3[0].real()=0;
w3[0].imag()=0;
}
else if(a2==5)
{
w3[0].real()=0;
w3[0].imag()=1;
}
else if(a2==6)
{
w3[0].real()=1;
w3[0].imag()=-1;
}
else if(a2==7)
{
w3[0].real()=1;
w3[0].imag()=0;
}
else if(a2==8)
{
w3[0].real()=1;
w3[0].imag()=1;
}
////////////////
if(a3==0){nr1=-1;}
else{nr1=1;}
if(a4==0){nr2=-1;}
else{nr2=1;}
if(a5==0){nr3=-1;}
else{nr3=1;}
if(a6==0){nr4=-1;}
else{nr4=1;}
if(a7==0){nr5.real()=-1,nr5.imag()=0;}
else{nr5.real()=1,nr5.imag()=0;}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=nr1*cos(nr3*i*j*zmienna1+fi2);
w[0].imag()=nr2*sin(nr4*i*j*zmienna1+fi2);
tab2[i]=tab2[i]+nr5*tab[j]*w[0]*w3[0];
}
//cout<<tab2[1]<<endl;
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*0.5;
tab[j].imag() =tab2[j].imag()*0.5;
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real();
tab[j].imag() =tab2[j].imag();
}
*/
}
void inverse_DFT_FFT_1_stage(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[8]={{1,0}};
std::complex<double> w2[1]={{1,0}};
std::complex<double> w3[1]={{1,0}};
std::complex<double> w4[1]={{1,0}};
int nr1=0,nr2=0,nr3=0,nr4=0,nr6=0,nr7=0,nr8=0,nr9=0;
std::complex<double> nr5=0;
std::complex<double> nr10=0;
double zmienna1=2*pi/(float)N;
double fi2=fi;
//////////////////////////
if(a2==0)
{
w3[0].real()=-1;
w3[0].imag()=-1;
}
else if(a2==1)
{
w3[0].real()=-1;
w3[0].imag()=0;
}
else if(a2==2)
{
w3[0].real()=-1;
w3[0].imag()=1;
}
else if(a2==3)
{
w3[0].real()=0;
w3[0].imag()=-1;
}
else if(a2==4)
{
w3[0].real()=0;
w3[0].imag()=0;
}
else if(a2==5)
{
w3[0].real()=0;
w3[0].imag()=1;
}
else if(a2==6)
{
w3[0].real()=1;
w3[0].imag()=-1;
}
else if(a2==7)
{
w3[0].real()=1;
w3[0].imag()=0;
}
else if(a2==8)
{
w3[0].real()=1;
w3[0].imag()=1;
}
////////////////
if(a3==0){nr1=-1;}
else{nr1=1;}
if(a4==0){nr2=-1;}
else{nr2=1;}
if(a5==0){nr3=-1;}
else{nr3=1;}
if(a6==0){nr4=-1;}
else{nr4=1;}
if(a7==0){nr5.real()=-1,nr5.imag()=0;}
else{nr5.real()=1,nr5.imag()=0;}
/////////////////////////
for(int k=0;k<N;k=k+2)
{
for(int n=0;n<(N/2);n++)
{
//complex number method:
w[0].real()=nr1*cos(nr3*k*n*zmienna1);
w[0].imag()=nr2*sin(nr4*k*n*zmienna1);
w[1].real()=nr1*cos(nr3*(k+1)*n*zmienna1);
w[1].imag()=nr2*sin(nr4*(k+1)*n*zmienna1);
//parzyste:
tab2[k]=tab2[k] +nr5*w[0]*(tab[n]+tab[N/2+n])*w3[0];
//nieparzyste
tab2[k+1]=tab2[k+1]+nr5*w[1]*(tab[n]-tab[N/2+n])*w3[0];
}
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*0.5;
tab[j].imag() =tab2[j].imag()*0.5;
}
/*
for(int i=0;i<N;i++)
{
}
*/
}
void DFT_FFT_1_stage(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w[8]={{1,0},{1,0},{1,0},{1,0}};
double zmienna1=2*pi/(float)N;
double fi2=fi;
for(int k=0;k<N;k=k+2)
{
for(int n=0;n<(N/2);n++)
{
//complex number method:
w[0].real()= cos(k*n*zmienna1);
w[0].imag()=-sin(k*n*zmienna1);
w[1].real()= cos((k+1)*n*zmienna1);
w[1].imag()=-sin((k+1)*n*zmienna1);
//parzyste:
tab2[k]=tab2[k]+w[0]*(tab[n]+tab[N/2+n]);
//nieparzyste
tab2[k+1]=tab2[k+1]+w[1]*(tab[n]-tab[N/2+n]);
}
}
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
/*
for(int i=0;i<N;i++)
{
tab[i]=tab2[i];
}
*/
}
środa, 5 kwietnia 2017
inverse fourier transform iDFT ifft 4 methods in open office + something extra
inverse fourier transform iDFT ifft 4 methods in open office + something extra
http://www.mediafire.com/file/hyz4dbski4w00pb/inverse+fourier+transform+iDFT+ifft+4+methods+in+open+office+++something+extra.ods
http://www.mediafire.com/file/59bpnci966ulec9/DFT+FFT+RADIX-2+DIT+algorytm+Transformacja+Fouriera+analitycznie+v3.4.xlsx
http://www.mediafire.com/file/hyz4dbski4w00pb/inverse+fourier+transform+iDFT+ifft+4+methods+in+open+office+++something+extra.ods
http://www.mediafire.com/file/59bpnci966ulec9/DFT+FFT+RADIX-2+DIT+algorytm+Transformacja+Fouriera+analitycznie+v3.4.xlsx
piątek, 3 lutego 2017
inverse discrete fourier transform iDFT 1D algorithm c++ source code
inverse discrete fourier transform iDFT 1D algorithm source code implementation
odwrotna dyskretna transformacja fouriera iDFT 1D c++ kod źródłowy
//haven't try it with other function that cos(x)+jsin(x)=sin(x+pi/2)+jsin(x)
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <complex>
using namespace std;
//complex number method:
void fun_fourier_transform_DFT_method5_full_complex(int N,double *table2);
//fun_fourier_transform_DFT_method6_full_complex(int N,std::complex<double> tab[])
void fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(int N,double *table2);
//these others work only if audio samples are not complex numbers but result of DFT it shows complex numbers Hzthat but numbers are combinet to normal number
void fun_fourier_transform_DFT_method1(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method1(int N,double *table2);
void fun_fourier_transform_DFT_method2(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method2(int N,double *table2);
void fun_fourier_transform_DFT_method3(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method3(int N,double *table2);
void fun_fourier_transform_DFT_method4(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method4(int N,double *table2);
//inverse_method4 works only witch discrete _method4
//inverse_method2 works only witch discrete _method2
//inverse_method3 works only witch discrete _method3
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
int N;
//if N==period of signal in table tab[] then resolution = 1 Hz
//tab[A] A=2*N;
//tab[0 to N-1] -re numbers
//tab[N-1 to 2N-1] -im numbers
// period= 16 samples=16
N=16;
double tab[32]={-0.923879533,0.382683432,1.03153013,0.923879533,0.923879533,1.465075634,1.796896994,0.923879533,-0.923879533,
-2.230442498,-1.796896994,-0.158512669,0.923879533,0.382683432,-1.03153013,-1.689246397};
// period=12 samples=12
//N=12;
// double tab[32]={-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
// -2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192};
//tab[20]=3.86;//im number
double time2;
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
clock_t start = clock();
//fun_fourier_transform_DFT_method1(N,tab);
fun_fourier_transform_DFT_method5_full_complex(N,tab);
time2=diffclock( start, clock() );
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
//fun_inverse_fourier_transform_DFT_method1(N,tab);
fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(N,tab);
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
system("pause");
return 0;
}
void fun_fourier_transform_DFT_method5_full_complex(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N)*-1;//im*im
table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
//other that methot is for B from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for C from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for D from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N)*-1;//im*im
table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
//other that methot is for B from discrete transform
//table3[0][i]=table3[0][i]-table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for C from discrete transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for D from discrete transform
// table3[0][i]=table3[0][i]-table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
//table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]/N;
table1[1][j] =table3[1][j]/N;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method1(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]+table3[1][j];
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method1(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j])/N;//tylko tym się różni od normalnej transformnacji
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method2(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method2(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[4];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[2][i]=table3[2][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
table3[3][i]=table3[3][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j]+table3[2][j]+table3[3][j])/N;//tylko tym się różni od normalnej transformnacji
table1[1][j] = 0;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method3(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method3(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[4];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[2][i]=table3[2][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
table3[3][i]=table3[3][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[3][j])/N;
table1[1][j] =(table3[1][j]+table3[2][j])/N;
if(table1[0][j]>=0)
{
table1[0][j]=table1[0][j]*table1[0][j];
}
else
{
table1[0][j]=table1[0][j]*table1[0][j]*-1;
}
if(table1[1][j]>=0)
{
table1[1][j]=table1[1][j]*table1[1][j];
}
else
{
table1[1][j]=table1[1][j]*table1[1][j]*-1;
}
if(table1[0][j]+table1[1][j]>=0)
{
table1[0][j]=sqrt(fabs(table1[0][j]+table1[1][j]));
}
else
{
table1[0][j]=sqrt(fabs(table1[0][j]+table1[1][j]))*-1;
}
table1[1][j]=0;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method4(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]-table3[1][j];
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method4(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*-1*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j])/N;
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method6_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[16]={}; // tab2[]==N
std::complex<double> w[1]={{1,1}};
std::complex<double> w2[1]={{1,1}};
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=cos(i*j*2*pi/(float)N);
w[0].imag()=(-sin(i*j*2*pi/(float)N));
tab2[i]=tab2[i]+tab[j]*w[0];
}
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
*/
}
http://inverse-fast-fourier-transform-fft.blogspot.com/
DFT:
inverse fourier transform iDFT 4 methods in open office
odwrotna dyskretna transformacja fouriera iDFT 1D c++ kod źródłowy
//haven't try it with other function that cos(x)+jsin(x)=sin(x+pi/2)+jsin(x)
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <complex>
using namespace std;
//complex number method:
void fun_fourier_transform_DFT_method5_full_complex(int N,double *table2);
//fun_fourier_transform_DFT_method6_full_complex(int N,std::complex<double> tab[])
void fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(int N,double *table2);
//these others work only if audio samples are not complex numbers but result of DFT it shows complex numbers Hzthat but numbers are combinet to normal number
void fun_fourier_transform_DFT_method1(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method1(int N,double *table2);
void fun_fourier_transform_DFT_method2(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method2(int N,double *table2);
void fun_fourier_transform_DFT_method3(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method3(int N,double *table2);
void fun_fourier_transform_DFT_method4(int N,double *table2);
void fun_inverse_fourier_transform_DFT_method4(int N,double *table2);
//inverse_method4 works only witch discrete _method4
//inverse_method2 works only witch discrete _method2
//inverse_method3 works only witch discrete _method3
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
int N;
//if N==period of signal in table tab[] then resolution = 1 Hz
//tab[A] A=2*N;
//tab[0 to N-1] -re numbers
//tab[N-1 to 2N-1] -im numbers
// period= 16 samples=16
N=16;
double tab[32]={-0.923879533,0.382683432,1.03153013,0.923879533,0.923879533,1.465075634,1.796896994,0.923879533,-0.923879533,
-2.230442498,-1.796896994,-0.158512669,0.923879533,0.382683432,-1.03153013,-1.689246397};
// period=12 samples=12
//N=12;
// double tab[32]={-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
// -2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192};
//tab[20]=3.86;//im number
double time2;
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
clock_t start = clock();
//fun_fourier_transform_DFT_method1(N,tab);
fun_fourier_transform_DFT_method5_full_complex(N,tab);
time2=diffclock( start, clock() );
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
//fun_inverse_fourier_transform_DFT_method1(N,tab);
fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(N,tab);
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[j+i*N]*1000)/1000<<" ";
}
cout<<endl;
}
cout<<endl;
system("pause");
return 0;
}
void fun_fourier_transform_DFT_method5_full_complex(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N)*-1;//im*im
table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
//other that methot is for B from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for C from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for D from inverse transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]-table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method5_full_complex_inverse(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N)*-1;//im*im
table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
//other that methot is for B from discrete transform
//table3[0][i]=table3[0][i]-table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]-table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for C from discrete transform
// table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
//that methot is for D from discrete transform
// table3[0][i]=table3[0][i]-table1[0][j]*cos(i*j*2*pi/(float)N);
// table3[0][i]=table3[0][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
//table3[1][i]=table3[1][i]-table1[1][j]*cos(i*j*2*pi/(float)N);
// table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]/N;
table1[1][j] =table3[1][j]/N;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method1(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]+table3[1][j];
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method1(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j])/N;//tylko tym się różni od normalnej transformnacji
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method2(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method2(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[4];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[2][i]=table3[2][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
table3[3][i]=table3[3][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j]+table3[2][j]+table3[3][j])/N;//tylko tym się różni od normalnej transformnacji
table1[1][j] = 0;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method3(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j];
table1[1][j] =table3[1][j];
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method3(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[4];
for( int i = 0; i < 4; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
table3[2][i]=table3[2][i]+table1[1][j]*cos(i*j*2*pi/(float)N);
table3[3][i]=table3[3][i]+table1[1][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[3][j])/N;
table1[1][j] =(table3[1][j]+table3[2][j])/N;
if(table1[0][j]>=0)
{
table1[0][j]=table1[0][j]*table1[0][j];
}
else
{
table1[0][j]=table1[0][j]*table1[0][j]*-1;
}
if(table1[1][j]>=0)
{
table1[1][j]=table1[1][j]*table1[1][j];
}
else
{
table1[1][j]=table1[1][j]*table1[1][j]*-1;
}
if(table1[0][j]+table1[1][j]>=0)
{
table1[0][j]=sqrt(fabs(table1[0][j]+table1[1][j]));
}
else
{
table1[0][j]=sqrt(fabs(table1[0][j]+table1[1][j]))*-1;
}
table1[1][j]=0;
}
for( int i = 0; i < 4; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method4(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =table3[0][j]-table3[1][j];
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_fourier_transform_DFT_method4(int N,double *table2)
{
int i=N,j=N;
double (*(table1)[2]);
table1[0]=&table2[0];
table1[1]=&table2[0+N];
const double pi=3.141592653589793238462;
double** table3 = new double*[2];
for( int i = 0; i < 2; ++i)
{
table3[i] = new double[N];
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
table3[i][j]=0;
}
}
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table3[0][i]=table3[0][i]+table1[0][j]*cos(i*j*2*pi/(float)N);
table3[1][i]=table3[1][i]+table1[0][j]*-1*sin(i*j*2*pi/(float)N);
}
}
for(int j=0;j<N;j++)
{
table1[0][j] =(table3[0][j]+table3[1][j])/N;
table1[1][j] =0;
}
for( int i = 0; i < 2; ++i)
{
delete[] table3[i];
}
delete[] table3;
}
void fun_fourier_transform_DFT_method6_full_complex(int N,std::complex<double> tab[])
{
const double pi=3.141592653589793238462;
std::complex<double> tab2[16]={}; // tab2[]==N
std::complex<double> w[1]={{1,1}};
std::complex<double> w2[1]={{1,1}};
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//complex number method:
w[0].real()=cos(i*j*2*pi/(float)N);
w[0].imag()=(-sin(i*j*2*pi/(float)N));
tab2[i]=tab2[i]+tab[j]*w[0];
}
}
/*
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
*/
}
http://inverse-fast-fourier-transform-fft.blogspot.com/
DFT:
inverse fourier transform iDFT 4 methods in open office
inverse discrete fourier transform iDFT 2D algorithm source code
inverse discrete fourier transform iDFT 2D algorithm source code
odwrotna dyskretna transformacja fouriera idft 2d algorytm kod źródłowy
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <time.h>
using namespace std;
//complex number method:
void fun_inverse_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12]);
//complex number method:
void fun_inverse_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12]);
//other method not complex number signal need to be normal number
void fun_inverse_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12]);
//inverse_method1 works only witch discrete _method1
//inverse_method2 works only witch discrete _method2
//inverse_method3 works only witch discrete _method3
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
//zał N=okres sygnału w tablicy tab[] wtedy rodzielczość = 1 Hz
int N=12;
double time2;
//tab[0]][N][N]=re
//tab[1]][N][N]=im
double tab[2][12][12]={{
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-1.630526192,-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.735499212,-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192}
}};
//tab[0]][N][N]=re
//tab[1]][N][N]=im
tab[1][0][0]=5.1234;//im number
tab[1][1][0]=9.1234;//im number
tab[1][2][1]=-3.1234;//im number
cout<<" "<<tab[1][0][0]<<endl;
cout<<" "<<tab[1][1][0]<<endl;
cout<<" "<<tab[1][2][1]<<endl;
cout<<"signal g(x):"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
clock_t start = clock();
fun_discrete_fourier_transform_DFT_2D_method2(N,tab);
time2=diffclock( start, clock() );
cout<<" time="<<time2/1000<<endl;
cout<<"transformation 2D re"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"transformation 2D im"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[1][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
fun_inverse_discrete_fourier_transform_DFT_2D_method2(N,tab);
cout<<"inverse transformation 2D"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<" "<<round(tab[1][0][0]*100)/100<<endl;
cout<<" "<<round(tab[1][1][0]*100)/100<<endl;
cout<<" "<<round(tab[1][2][1]*100)/100<<endl;
cout<<endl;
system("pause");
return 0;
}
void fun_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for (int m=0;m<N;m++)
{
for(int n=0;n<N;n++)
{
//nr 1 complex number method: other combinations are possible but you need other combination in inverse method too
table3[0][k][l]=table3[0][k][l]+table[0][m][n]*cos((k*m+n*l)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]-table[0][m][n]*sin((k*m+n*l)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]-table[1][m][n]*sin((k*m+n*l)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table[1][m][n]*cos((k*m+n*l)*2*pi/(float)N);
}}}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//nr 1;
table[0][i][j] =(table3[0][i][j]);
table[1][i][j] =(table3[1][i][j]);
//nr 2
//table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j]);
// table[1][i][j] = 0;
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for (int m=0;m<N;m++)
{
for(int n=0;n<N;n++)
{
// nr 1 complex number method: other combinations are possible but you need other combination in discrete method too
table3[0][k][l]=table3[0][k][l]+table[0][m][n]*cos((k*m+n*l)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table[0][m][n]*sin((k*m+n*l)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table[1][m][n]*sin((k*m+n*l)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table[1][m][n]*cos((k*m+n*l)*2*pi/(float)N);
}}}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j])/(N*N);
table[1][i][j] =(table3[1][i][j])/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{//complex number method:
//nr 1 complex number method: other combinations are possible but you need other combination in inverse method too
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]-table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]-table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im;
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{//complex number method:
table3[0][k][l]=table3[0][k][l]+table4[0][m][l]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]-table4[0][m][l]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]-table4[1][m][l]*sin((k*m)*2*pi/(float)N)*-1;//im*im;
table3[1][k][l]=table3[1][k][l]+table4[1][m][l]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j]);
table[1][i][j] =table3[1][i][j];
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
//complex number method:
// nr 1 complex number method: other combinations are possible but you need other combination in discrete method too
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]+table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im;
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
//complex number method:
table3[0][k][l]=table3[0][k][l]+table4[0][m][l]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][m][l]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][m][l]*sin((k*m)*2*pi/(float)N)*-1;//im*im;
table3[1][k][l]=table3[1][k][l]+table4[1][m][l]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j])/(N*N);
table[1][i][j] =table3[1][i][j]/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]+table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
table3[0][k][l]=table3[0][k][l]+table4[0][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][l][m]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][l][m]*sin((k*m)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table4[1][l][m]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//nr 1;
//table[0][i][j] =(table3[0][i][j]+table3[3][i][j]);
//table[1][i][j] =(table3[1][i][j]+table3[2][i][j]);
//nr 2
table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j]);
table[1][i][j] =0;
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
table3[0][k][l]=table3[0][k][l]+table4[0][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][l][m]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[1][l][m]*sin((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j])/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
http://inverse-fast-fourier-transform-fft.blogspot.com/
odwrotna dyskretna transformacja fouriera idft 2d algorytm kod źródłowy
#include <iostream>
#include "conio.h"
#include <stdlib.h>
#include <math.h>
#include <time.h>
using namespace std;
//complex number method:
void fun_inverse_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12]);
//complex number method:
void fun_inverse_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12]);
//other method not complex number signal need to be normal number
void fun_inverse_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12]);
void fun_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12]);
//inverse_method1 works only witch discrete _method1
//inverse_method2 works only witch discrete _method2
//inverse_method3 works only witch discrete _method3
static double diffclock(clock_t clock2,clock_t clock1)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
//zał N=okres sygnału w tablicy tab[] wtedy rodzielczość = 1 Hz
int N=12;
double time2;
//tab[0]][N][N]=re
//tab[1]][N][N]=im
double tab[2][12][12]={{
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-1.630526192,-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.735499212,-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192},
{-0.923879533,0.70664666,0.996551596,0.923879533,1.659378744,1.369473808,-0.923879533,
-2.29335334,-0.735499212,0.923879533,-0.072672064,-1.630526192}
}};
//tab[0]][N][N]=re
//tab[1]][N][N]=im
tab[1][0][0]=5.1234;//im number
tab[1][1][0]=9.1234;//im number
tab[1][2][1]=-3.1234;//im number
cout<<" "<<tab[1][0][0]<<endl;
cout<<" "<<tab[1][1][0]<<endl;
cout<<" "<<tab[1][2][1]<<endl;
cout<<"signal g(x):"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
clock_t start = clock();
fun_discrete_fourier_transform_DFT_2D_method2(N,tab);
time2=diffclock( start, clock() );
cout<<" time="<<time2/1000<<endl;
cout<<"transformation 2D re"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"transformation 2D im"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[1][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<endl;
fun_inverse_discrete_fourier_transform_DFT_2D_method2(N,tab);
cout<<"inverse transformation 2D"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout.precision(4);
cout<<round(tab[0][i][j]*100)/100<<" ";
}
cout<<endl;
}
cout<<" "<<round(tab[1][0][0]*100)/100<<endl;
cout<<" "<<round(tab[1][1][0]*100)/100<<endl;
cout<<" "<<round(tab[1][2][1]*100)/100<<endl;
cout<<endl;
system("pause");
return 0;
}
void fun_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for (int m=0;m<N;m++)
{
for(int n=0;n<N;n++)
{
//nr 1 complex number method: other combinations are possible but you need other combination in inverse method too
table3[0][k][l]=table3[0][k][l]+table[0][m][n]*cos((k*m+n*l)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]-table[0][m][n]*sin((k*m+n*l)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]-table[1][m][n]*sin((k*m+n*l)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table[1][m][n]*cos((k*m+n*l)*2*pi/(float)N);
}}}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//nr 1;
table[0][i][j] =(table3[0][i][j]);
table[1][i][j] =(table3[1][i][j]);
//nr 2
//table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j]);
// table[1][i][j] = 0;
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method1(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for (int m=0;m<N;m++)
{
for(int n=0;n<N;n++)
{
// nr 1 complex number method: other combinations are possible but you need other combination in discrete method too
table3[0][k][l]=table3[0][k][l]+table[0][m][n]*cos((k*m+n*l)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table[0][m][n]*sin((k*m+n*l)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table[1][m][n]*sin((k*m+n*l)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table[1][m][n]*cos((k*m+n*l)*2*pi/(float)N);
}}}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j])/(N*N);
table[1][i][j] =(table3[1][i][j])/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{//complex number method:
//nr 1 complex number method: other combinations are possible but you need other combination in inverse method too
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]-table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]-table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im;
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{//complex number method:
table3[0][k][l]=table3[0][k][l]+table4[0][m][l]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]-table4[0][m][l]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]-table4[1][m][l]*sin((k*m)*2*pi/(float)N)*-1;//im*im;
table3[1][k][l]=table3[1][k][l]+table4[1][m][l]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j]);
table[1][i][j] =table3[1][i][j];
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method2(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
//complex number method:
// nr 1 complex number method: other combinations are possible but you need other combination in discrete method too
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]+table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im;
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
//complex number method:
table3[0][k][l]=table3[0][k][l]+table4[0][m][l]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][m][l]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][m][l]*sin((k*m)*2*pi/(float)N)*-1;//im*im;
table3[1][k][l]=table3[1][k][l]+table4[1][m][l]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j])/(N*N);
table[1][i][j] =table3[1][i][j]/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
table4[0][m][l]=table4[0][m][l]+table[1][m][n]*sin((n*l)*2*pi/(float)N)*-1;//im*im
table4[1][m][l]=table4[1][m][l]+table[1][m][n]*cos((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
table3[0][k][l]=table3[0][k][l]+table4[0][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][l][m]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][l][m]*sin((k*m)*2*pi/(float)N)*-1;//im*im
table3[1][k][l]=table3[1][k][l]+table4[1][l][m]*cos((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//nr 1;
//table[0][i][j] =(table3[0][i][j]+table3[3][i][j]);
//table[1][i][j] =(table3[1][i][j]+table3[2][i][j]);
//nr 2
table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j]);
table[1][i][j] =0;
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
void fun_inverse_discrete_fourier_transform_DFT_2D_method3(int N,double table[][12][12])
{
int i=N,j=N,k=N,m=N;
const double pi=3.141592653589793238462;
double*** table3 = new double**[4];
//double*** table = new double**[4];//do 3 wymiarowej
for( int i = 0; i < 4; ++i)
{
//table[i] = new double*[N];//do 3 wymiarowej
table3[i] = new double*[N];
for( int j = 0; j < N; ++j)
{
table3[i][j]= new double[N];
}
}
double table4[2][12][12]={};
for (int i=0;i<4;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table3[i][j][k]=0;
}
}
}
for (int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{ for(int k=0;k<N;k++)
{
table4[i][j][k]=0;
}
}
}
for (int m=0;m<N;m++)
{
for(int l=0;l<N;l++)
{
for(int n=0;n<N;n++)
{
table4[0][m][l]=table4[0][m][l]+table[0][m][n]*cos((n*l)*2*pi/(float)N);
table4[1][m][l]=table4[1][m][l]+table[0][m][n]*sin((n*l)*2*pi/(float)N);
}}}
for (int k=0;k<N;k++)
{
for(int l=0;l<N;l++)
{
for(int m=0;m<N;m++)
{
table3[0][k][l]=table3[0][k][l]+table4[0][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[0][l][m]*sin((k*m)*2*pi/(float)N);
table3[0][k][l]=table3[0][k][l]+table4[1][l][m]*cos((k*m)*2*pi/(float)N);
table3[1][k][l]=table3[1][k][l]+table4[1][l][m]*sin((k*m)*2*pi/(float)N);
}}}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
table[0][i][j] =(table3[0][i][j]+table3[1][i][j]+table3[2][i][j]+table3[3][i][j])/(N*N);
}
}
for( int i = 0; i < 4; ++i)
{
for( int j = 0; j < N; ++j)
{
delete[] table3[i][j];
}
delete[] table3[i];
}
delete[] table3;
}
http://inverse-fast-fourier-transform-fft.blogspot.com/
Subskrybuj:
Posty (Atom)