阅读:1697回复:0
FFT程序的C语言程序
这是我编写的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); } |
|