lrm101
驱动牛犊
驱动牛犊
  • 注册日期2004-09-14
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1660回复:0

FFT程序的C语言程序

楼主#
更多 发布于:2004-09-15 11:21
这是我编写的FFT程序,在运行中遇到了一个超出我能力的问题,希望各位高人帮我解决,谢谢:
问题是:当改变输入数据的长度时,比如将N修改成33,M对应的修改成5时,编译过程没有错误,但是在生成可执行文件时出现错误,错误为附件中显示的.
#include "stdio.h"
#include "math.h"
#define  PI  3.1415926
#define  N   17
#define  M   4
main()
{
   struct compx
     {double real;
      double imag;
        };
  double temp;
  double   nv2,nm1,x;
  int k,i,j,ip,l,le,le1;
  struct compx a[N],t,v,w;
 double  m[N]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
                
                                

 nv2=(N-1)/2;
 nm1=N-2;
 i=1;
 j=1;
do
 {
  if(i<j)
   {temp=m[j];
    m[j]=m;
    m=temp;
    k=nv2; }
   else
   {m=m;
    m[j]=m[j];
    k=nv2;}  
  
  while(k<j)
   {
    j=j-k;
    k=k/2;
   }
  
  j=j+k;
  i++;
 }
 while(i<=nm1);
 for(i=0;i<N;i++)
 printf("m[%d]=%f\n",i,m);
   for(i=0;i<N;i++)
  {a.real=m[i+1];
   a.imag=0;}
  
   for(i=0;i<N;i=i+2)/*进行第一次蝶形运算,而且是实数运算还需要把他们进行转化不*/
  {t.real=a.real;
   t.imag=a.imag;
  
   a.real=t.real+a[i+1].real;
   a.imag=t.imag+a[i+1].imag;
   a[i+1].real=t.real-a[i+1].real;
   a[i+1].imag=t.imag-a[i+1].imag;}
 

   v.real=1.0;       /*第二次蝶形运算过程中采用的数据是简单的,但不一定是实数计算*/
   v.imag=0.0;
   w.real=0.0;
   w.imag=-1.0;
  
 for(j=0;j<2;j++)
  {for(i=j;i<N;i=i+4)
   {ip=i+2;
    t.real=a[ip].real*v.real-a[ip].imag*v.imag;
    t.imag=a[ip].imag*v.real+a[ip].real*v.imag;
    a[ip].real=a.real-t.real;
    a[ip].imag=a.imag-t.imag;
    a.real=a.real+t.real;
    a.imag=a.imag+t.imag;
     }
    
     t.real=v.real*w.real-v.imag*w.imag;
     t.imag=v.real*w.imag+v.imag*w.real;
     v.real=t.real;
     v.imag=t.imag;
   }
 
  
 for(l=3;l<=M;l++) /* 从第三次开始直到M次蝶形运算 */
   {
    le=pow(2,l);
    le1=le/2;
    v.real=1.0;
    v.imag=0.0;
    x=PI/le1;
    w.real=cos(x);
    w.imag=(-1)*sin(x);
   printf("w.real=%f\nw.imag=%f\n",w.real,w.imag);
   for(j=0;j<le1;j++)
  
     {for(i=j;i<N;i=i+le)
      {
        ip=i+le1;
      
       t.real=a[ip].real*v.real-a[ip].imag*v.imag;
       t.imag=a[ip].imag*v.real+a[ip].real*v.imag;
      
        a[ip].real=a.real-t.real;
        a[ip].imag=a.imag-t.imag;
        a.real=a.real+t.real;
        a.imag=a.imag+t.imag;
         }
  
         t.real=v.real*w.real-v.imag*w.imag;
         t.imag=v.real*w.imag+v.imag*w.real;
         v.real=t.real;
         v.imag=t.imag;
  
       }
      }
    for(i=0;i<(N-1);i++)
    printf("a[%d].real=%f\na[%d].imag=%f\n",i,a.real,i,a.imag);
    }
游客

返回顶部