#include<iostream>
#include<math.h>
void compute_dft(double *x,int n,double *a,double *b);//傅里叶变换
void compute_inversedft(int n,double *a,double *b,double *c,double *d);//傅里叶逆变换
using namespace std;
void main()
{
int n=0,i=0;
cout<<"Enter a integer n(n>0)\n"<<"n=";
cin>>n;
double *x=new double[n];
double *a=new double[n];
double *b=new double[n];
double *c=new double[n];
double *d=new double[n];
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
for(i=1;i<=n;i++)
x[i-1]=i;
compute_dft(x,n,a,b);
cout<<"The DFT is\n";
for(i=1;i<=n;i++)
cout<<a[i-1]<<"-i*("<<b[i-1]<<")\n";
cout<<endl;
compute_inversedft(n,a,b,c,d);
cout<<"The inverse DFT is\n";
for(i=1;i<=n;i++)
{
if(abs(d[i-1])<1E-3)
cout<<c[i-1]<<"\t";
else
cout<<c[i-1]<<"+i*("<<d[i-1]<<")\t";
}
cout<<endl;
}
void compute_dft(double *x,int n,double *a,double *b)
{
int i=0,j=0;
for(i=1;i<=n;i++)
{
a[i-1]=0;
b[i-1]=0;
for(j=1;j<=n;j++)
{
a[i-1]=a[i-1]+x[j-1]*cos((i-1)*(j-1)*2*3.1415927/n);
b[i-1]=b[i-1]+x[j-1]*sin((i-1)*(j-1)*2*3.1415927/n);
if(abs(b[i-1])<1E-3)
b[i-1]=0;
}
}
}
void compute_inversedft(int n,double *a,double *b,double *c,double *d)
{
int i=0,j=0;
for(i=1;i<=n;i++)
{
c[i-1]=0;
d[i-1]=0;
for(j=1;j<=n;j++)
{
c[i-1]=c[i-1]+a[j-1]*cos((i-1)*(j-1)*2*3.1415927/n)+b[j-1]*sin((i-1)*(j-1)*2*3.1415927/n);
d[i-1]=d[i-1]+a[j-1]*sin((i-1)*(j-1)*2*3.1415927/n)-b[j-1]*cos((i-1)*(j-1)*2*3.1415927/n);
}
c[i-1]=c[i-1]/n;
d[i-1]=d[i-1]/n;
}
}