随心贷怎么样安全吗:谁有傅立叶变化的算法啊?c++的,能直接运行的,课程设计用,谢谢!

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/11 04:23:25

#include <math.h>
#include"fft.h"
#include<iostream.h>
/*定义复数乘法*/
struct compx compxmul(struct compx b1,struct compx b2)
{
struct compx b3;
b3.real=b1.real*b2.real-b1.imag*b2.imag;
b3.imag=b1.real*b2.imag+b1.imag*b2.real;
return b3;
}
/*定义复数加法*/
struct compx compxadd(struct compx b1,struct compx b2)
{
struct compx b3;
b3.real=b1.real+b2.real;
b3.imag=b1.imag+b2.imag;
return b3;
}
/* 定义复数得乘方*/
/*struct compx compxpow(struct compx b1,int n)
{
struct compx b2;
b2.real=1;
b2.imag=0;
for(int i=0;i<n;i++)
b2=compxmul(b2,b1);
return b2;
}*/
/*fft算法*/
void fft(struct compx *xin, int N)
{
int f,m,nv2,nm1,k,i,j=N/2,l;//f为数组元素个数,m为级数,
struct compx v,w,t;
nv2=N/2;
f=N;
for(m=1;(f=f/2)!=1;m++);
nm1=N-1;
for(i=0,j=0;i<nm1;i++)//这一个for循环进行码位倒置
{
if(i<j)
{
t.real=xin[j].real;t.imag=xin[j].imag;//t=xin[j];
xin[j].imag=xin[i].imag;xin[j].real=xin[i].real;//xin[j]=xin[i];
xin[i].imag=t.imag;xin[i].real=t.real;//xin[i]=xin[j];
}
k=nv2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
int le,lei,ip;
for(l=1;l<=m;l++)//第一层得循环 为级得循环
{
le=(int)pow(2,l);
lei=le/2;
v.real=1.0;
v.imag=0.0;
w.real=cos(pi/lei);//w为Wn^2^m-l
w.imag=-sin(pi/lei);//cout<<"a"<<endl;
for(j=0;j<lei;j++)//组之间得循环
{
for(i=j;i<N;i=i+le)//组内各行得循环
{
ip=i+lei;
t=compxmul(xin[ip],v);
xin[ip].real=xin[i].real-t.real;
xin[ip].imag=xin[i].imag-t.imag;
xin[i].real=xin[i].real+t.real;
xin[i].imag=xin[i].imag+t.imag;
}
v=compxmul(v,w);
}
}

}
//测试程序
void main()
{
const int len=8;
struct compx xin[len];
for(int i=0;i<len;i++)
{
xin[i].real=i;
xin[i].imag=0;
}
//for(i=0;i<len;i++)
//cout<<xin[i].real<< " "<<xin[i].imag<<endl;

fft(xin,len);
for(i=0;i<len;i++)
cout<<xin[i].real<< " "<<xin[i].imag<<endl;

}
我写的,有些乱,但能用,能用就好^_^