(资料图)
导读
1、这个是我上个星期才交的课程设计里面的源代码,绝对可以运行的。
2、本人也觉得应该比较容易看懂吧。
3、#include#includeusing namespace std; #define PI 3.1415927 #define MAX 20000 //////////////////////////////// //以指数形式表示的复数 ///////////////////////////////// struct CompExp { float AbValue; float Angle; }; ////////////////////////////////////// //以一般形式表示的复数 /////////////////////////////////////// struct Complex { float Re; float Im; }A[MAX]; int n; float a[MAX] ; ////////////////////////////////////////// //将一个数的二进制数反转之后的新数返回 //例如6->110->011->3 ////////////////////////////////////////// int Rev(int i) { int index,s; //index为要返回的数 s=(int)log2(n); index=0; while(s>0) { s--; index+=(i%2)*(int)pow(2,s); i=i/2; } return index; } //////////////////////////////////////////// //将输入的离散数据进行位反置转换,并复制在复数数组A中 //////////////////////////////////////////// void bit(float* a, Complex* A) { for(int i=0;iRe = a->Re + b->Re; c->Im = a->Im + b->Im; } ///////////////////////////////////////////// //复数的减法a-b=c ///////////////////////////////////////////// void Sub(Complex* a, Complex* b, Complex* c) { c->Re = a->Re - b->Re; c->Im = a->Im - b->Im; } //////////////////////////////////////////// //复数的乘法a*b=c //////////////////////////////////////////// void Mul(Complex* a, Complex* b, Complex* c) { float tempRe,tempIm; tempRe = a->Re * b->Re - a->Im * b->Im; tempIm = a->Re * b->Im + a->Im * b->Re; c->Re = tempRe; c->Im = tempIm; } ///////////////////////////////////////// //将复数从指数形式转化为一般形式 ///////////////////////////////////////// void CompTrans(CompExp* a, Complex* b) { b->Re = a->AbValue * cos(a->Angle); b->Im = a->AbValue * sin(a->Angle); } /////////////////////////////////////// //基于迭代的快速傅里叶算法 /////////////////////////////////////// void FFT() { Complex Wm,W,u,t; CompExp wm,w; bit(a,A); for(int i=1;i<=(int)log2(n);i++) { int m=(int)pow(2,i); wm.AbValue = 1; wm.Angle = -2*PI/m; CompTrans(&wm,&Wm); for(int k=0;k>n; while(!test(n)) { cout<<"序列长度不合法,请重新输入:"<>n; } for(int i=0;i>a[i]; } } ////////////////////////////////// //管理输出的函数 ////////////////////////////////// void Output() { for(int i=0;iusingnamespacestd;#definePI3.1415927#defineMAX20000//////////////////////////////////以指数形式表示的复数/////////////////////////////////structCompExp{floatAbValue;floatAngle;};////////////////////////////////////////以一般形式表示的复数///////////////////////////////////////structComplex{floatRe;floatIm;}A[MAX];intn;floata[MAX];////////////////////////////////////////////将一个数的二进制数反转之后的新数返回//例如6->110->011->3//////////////////////////////////////////intRev(inti){intindex,s;//index为要返回的数s=(int)log2(n);index=0;while(s>0){s--;index+=(i%2)*(int)pow(2,s);i=i/2;}returnindex;}//////////////////////////////////////////////将输入的离散数据进行位反置转换,并复制在复数数组A中////////////////////////////////////////////voidbit(float*a,Complex*A){for(inti=0;iRe=a->Re+b->Re;c->Im=a->Im+b->Im;}///////////////////////////////////////////////复数的减法a-b=c/////////////////////////////////////////////voidSub(Complex*a,Complex*b,Complex*c){c->Re=a->Re-b->Re;c->Im=a->Im-b->Im;}//////////////////////////////////////////////复数的乘法a*b=c////////////////////////////////////////////voidMul(Complex*a,Complex*b,Complex*c){floattempRe,tempIm;tempRe=a->Re*b->Re-a->Im*b->Im;tempIm=a->Re*b->Im+a->Im*b->Re;c->Re=tempRe;c->Im=tempIm;}///////////////////////////////////////////将复数从指数形式转化为一般形式/////////////////////////////////////////voidCompTrans(CompExp*a,Complex*b){b->Re=a->AbValue*cos(a->Angle);b->Im=a->AbValue*sin(a->Angle);}/////////////////////////////////////////基于迭代的快速傅里叶算法///////////////////////////////////////voidFFT(){ComplexWm,W,u,t;CompExpwm,w;bit(a,A);for(inti=1;i<=(int)log2(n);i++){intm=(int)pow(2,i);wm.AbValue=1;wm.Angle=-2*PI/m;CompTrans(&wm,&Wm);for(intk=0;k>n;while(!test(n)){cout<<"序列长度不合法,请重新输入:"<>n;}for(inti=0;i>a[i];}}////////////////////////////////////管理输出的函数//////////////////////////////////voidOutput(){for(inti=0;i
4、但没注释。
5、So sorry. 还有需要可发信息联系. ^_^。
本文到此分享完毕,希望对大家有所帮助。
免责声明:免责声明:本文由用户上传,如有侵权请联系删除!
标签: