///快速傅立叶变换程序/
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M 8
#include <math.h>
#define pi 3.14159265359
#define M 8
取反函数//
int rebit(int num,int p)
{
int i,rb=0,rb1,k,num1=num;
for(i=1;i<=p;i++)
{
k=num&1;
num=num1>>1;
num1=num;
rb=rb+k;
rb1=rb<<1;
rb=rb1;
}
return rb>>1;
}
int rebit(int num,int p)
{
int i,rb=0,rb1,k,num1=num;
for(i=1;i<=p;i++)
{
k=num&1;
num=num1>>1;
num1=num;
rb=rb+k;
rb1=rb<<1;
rb=rb1;
}
return rb>>1;
}
///2的次方函数/
inline int pow2(int n)
{
return 1<<n;
}
inline int pow2(int n)
{
return 1<<n;
}
///快速傅立叶变换/
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void FFT(double *ir,double *ii,double or[],double oi[],int l)
{
int i,j,r,s,N,s0,m;
double *kr,*ki,u,v,cc,cs,t;
N=pow2(l);
kr=new double[N];
ki=new double[N];
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void FFT(double *ir,double *ii,double or[],double oi[],int l)
{
int i,j,r,s,N,s0,m;
double *kr,*ki,u,v,cc,cs,t;
N=pow2(l);
kr=new double[N];
ki=new double[N];
for(i=0;i<N;i++)
{
kr[i]=ir[rebit(i,l)];
ki[i]=ii[rebit(i,l)];
}
{
kr[i]=ir[rebit(i,l)];
ki[i]=ii[rebit(i,l)];
}
for(i=1;i<=l;i++)
{
m=pow2(i);
for(j=0;j<pow2(l-i);j++)
{
for(r=0;r<pow2(i-1);r++)
{
s=j*pow2(i)+r;
s0=s+pow2(i-1);
t=2*pi*r/m;
cc=cos(t);
cs=sin(t);
u=kr[s0]*cc+ki[s0]*cs;
v=ki[s0]*cc-kr[s0]*cs;
kr[s0]=kr[s]-u;
ki[s0]=ki[s]-v;
kr[s]=kr[s]+u;
ki[s]=ki[s]+v;
{
m=pow2(i);
for(j=0;j<pow2(l-i);j++)
{
for(r=0;r<pow2(i-1);r++)
{
s=j*pow2(i)+r;
s0=s+pow2(i-1);
t=2*pi*r/m;
cc=cos(t);
cs=sin(t);
u=kr[s0]*cc+ki[s0]*cs;
v=ki[s0]*cc-kr[s0]*cs;
kr[s0]=kr[s]-u;
ki[s0]=ki[s]-v;
kr[s]=kr[s]+u;
ki[s]=ki[s]+v;
}
}
}
}
}
for(i=0;i<N;i++)
{
or[i]=kr[i];
oi[i]=ki[i];
}
{
or[i]=kr[i];
oi[i]=ki[i];
}
delete []kr;
delete []ki;
}
int main(int argc, char* argv[])
{
double f1[M],f2[M],g1[M],g2[M];
int i;
for(i=0;i<M;i++)
{
f1[i]=i;
f2[i]=0;
}
RFFT(f1,f2,g1,g2,3);
for(i=0;i<M;i++)
{
printf("%f+(%f)i/n",g1[i],g2[i]);
}
return 0;
}
delete []ki;
}
///快速傅立叶反变换程序/
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M 8
#include <math.h>
#define pi 3.14159265359
#define M 8
取反函数//
int rebit(int num,int p)
{
int i,rb=0,rb1,k,num1=num;
for(i=1;i<=p;i++)
{
k=num&1;
num=num1>>1;
num1=num;
rb=rb+k;
rb1=rb<<1;
rb=rb1;
}
return rb>>1;
}
int rebit(int num,int p)
{
int i,rb=0,rb1,k,num1=num;
for(i=1;i<=p;i++)
{
k=num&1;
num=num1>>1;
num1=num;
rb=rb+k;
rb1=rb<<1;
rb=rb1;
}
return rb>>1;
}
///2的次方函数/
inline int pow2(int n)
{
return 1<<n;
}
inline int pow2(int n)
{
return 1<<n;
}
///快速傅立叶反变换/
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void RFFT(double *ir,double *ii,double or[],double oi[],int l)
{
int i,j,r,s,N,s0,m;
double *kr,*ki,u,v,cc,cs,t;
N=pow2(l);
kr=new double[N];
ki=new double[N];
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void RFFT(double *ir,double *ii,double or[],double oi[],int l)
{
int i,j,r,s,N,s0,m;
double *kr,*ki,u,v,cc,cs,t;
N=pow2(l);
kr=new double[N];
ki=new double[N];
for(i=0;i<N;i++)
{
kr[i]=ir[rebit(i,l)];
ki[i]=ii[rebit(i,l)];
}
{
kr[i]=ir[rebit(i,l)];
ki[i]=ii[rebit(i,l)];
}
for(i=1;i<=l;i++)
{
m=pow2(i);
for(j=0;j<pow2(l-i);j++)
{
for(r=0;r<pow2(i-1);r++)
{
s=j*pow2(i)+r;
s0=s+pow2(i-1);
t=2*pi*r/m;
cc=cos(-t);
cs=sin(-t);
u=kr[s0]*cc+ki[s0]*cs;
v=ki[s0]*cc-kr[s0]*cs;
kr[s0]=kr[s]-u;
ki[s0]=ki[s]-v;
kr[s]=kr[s]+u;
ki[s]=ki[s]+v;
{
m=pow2(i);
for(j=0;j<pow2(l-i);j++)
{
for(r=0;r<pow2(i-1);r++)
{
s=j*pow2(i)+r;
s0=s+pow2(i-1);
t=2*pi*r/m;
cc=cos(-t);
cs=sin(-t);
u=kr[s0]*cc+ki[s0]*cs;
v=ki[s0]*cc-kr[s0]*cs;
kr[s0]=kr[s]-u;
ki[s0]=ki[s]-v;
kr[s]=kr[s]+u;
ki[s]=ki[s]+v;
}
}
}
}
}
for(i=0;i<N;i++)
{
or[i]=kr[i]/N;
oi[i]=ki[i]/N;
}
{
or[i]=kr[i]/N;
oi[i]=ki[i]/N;
}
delete []kr;
delete []ki;
}
/delete []ki;
}
int main(int argc, char* argv[])
{
double f1[M],f2[M],g1[M],g2[M];
int i;
for(i=0;i<M;i++)
{
f1[i]=i;
f2[i]=0;
}
RFFT(f1,f2,g1,g2,3);
for(i=0;i<M;i++)
{
printf("%f+(%f)i/n",g1[i],g2[i]);
}
return 0;
}