正文

DIT FFT2 示例2007-11-02 22:35:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/30694.html

分享到:

/* Dev-C++ 4.9.9.2 下运行通过 2007.11.2 */// /*****************fft programe*********************/#include<math.h>#include<stdio.h>#include<stdlib.h> struct complex {    double x;    double y;}; #define Num 32 double result[Num+1];struct complex s[Num+1]; const double PI = 3.14159265358979323846; /* b1 ,b2 相乘的结果 b3 */struct complex EE(struct complex b1,struct complex b2){    struct complex b3 ;    b3.x=b1.x*b2.x-b1.y*b2.y ;    b3.y=b1.x*b2.y+b1.y*b2.x ;    return(b3);}/* M_PI=3.14159265358979323846 为math.h 中定义的 pi 值 */     void FFT(struct complex *xin,int N){    int f,m,nv2,nm1,i,k,j=1,l ;    /*int f,m,nv2,nm1,i,k,j=N/2,l;*/    struct complex v,w,t ;    nv2=N/2 ;    f=N ;    for(m=1;(f=f/2)!=1;m++) /* N=2^m */    {        ;    }    nm1=N-1 ;        /*变址运算*/    for(i=1;i<=nm1;i++)    {        if(i<j)        {            t=xin[j]; xin[j]=xin[i]; xin[i]=t ;        }        k=nv2 ;        while(k<j)        {            j=j-k ; k=k/2 ;        }        j=j+k ;    }        {        int le,lei,ip ;        for(l=1;l<=m;l++)        {            le=(int)pow(2,l);            /* 这里用的是L而不是1  !!!! */            lei=le/2 ;            v.x=1.0 ; v.y=0.0 ;            w.x=cos(M_PI/lei);            w.y=-sin(M_PI/lei);            for(j=1;j<=lei;j++)            {                /*double p=pow(2,m-l)*j;                  double ps=2*PI/N*p;                  w.x=cos(ps);                  w.y=-sin(ps);*/                for(i=j;i<=N;i=i+le)                {                    /*  w.x=cos(ps); w.y=-sin(ps);*/                    ip=i+lei ;                    t=EE(xin[ip],v);                    xin[ip].x=xin[i].x-t.x ;                    xin[ip].y=xin[i].y-t.y ;                    xin[i].x=xin[i].x+t.x ;                    xin[i].y=xin[i].y+t.y ;                }                v=EE(v,w);            }        }    }    return ;} /***************** prntft programe *****************/ void prntft(struct complex s[],const int n){    int i;    double result[n+1];    printf("n     real(n)      imag(n)      fabs(n)\n") ;    for(i=1;i<=n;i++)     /* 存放的位置为 1~~N  ?? */    {        result[i]=sqrt( s[i].x*s[i].x+s[i].y*s[i].y );        printf("%d     %f     %f     %f\n",i,s[i].x,s[i].y,result[i]) ;    }} /*****************main programe********************/ main(){    int i=1 ;    /*******赋初值**********/    for(;i<Num+1;i++)    {        s[i].x=i-1;        s[i].y=0 ;    }    /***********************/        FFT(s,Num);        prntft(s,Num);    getchar();}

阅读(7976) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册