您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 基2-dit-dif-fft与dit-dif-ifft实现-可运行
#includemath.h#includestdio.h#includestdlib.h#defineMAX257structcompx{doublereal;doubleimag;}compx;structcompxEE(structcompxb1,structcompxb2)//Į½ø´ŹżĻą³Ė{structcompxb3;b3.real=b1.real*b2.real-b1.imag*b2.imag;b3.imag=b1.real*b2.imag+b1.imag*b2.real;return(b3);}voidFFT_DIT(structcompx*xin,intN){intf,m,LH,nm,i,k,j,L;doublep,ps;intle,B,ip;doublepi;structcompxw,t;LH=N/2;f=N;for(m=1;(f=f/2)!=1;m++){;}//2µÄm´Ī·½=N£¬mĪŖ¼¶Źżnm=N-2;j=N/2;/*±äÖ·ŌĖĖć*/for(i=1;i=nm;i++){if(ij){t=xin[j];xin[j]=xin[i];xin[i]=t;}k=LH;while(j=k){j=j-k;k=k/2;}j=j+k;}/*fft_ditŌĖĖć*/for(L=0;L=m-1;L++)//ĆæŅ»¼¶{le=(int)pow(2.0,L+1);//¾ßÓŠĻąĶ¬Šż×ŖŅņ×ӵĵūŠĪŌĖĖćµÄ¼äøōB=le/2;//2µÄL´Ī·½£¬²»Ķ¬Šż×ŖŅņ×ÓµÄøöŹż£¬µūŠĪŌĖĖćĮ½Ö§¼äøōpi=3.141592653589793;for(j=0;j=B-1;j++){p=pow(2.0,m-L-1)*j;ps=2*pi/N*p;//Šż×ŖŅņ×Ów.real=cos(ps);w.imag=-sin(ps);for(i=j;i=N-1;i=i+le){ip=i+B;t=EE(xin[ip],w);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;}}}return;}voidFFT_DIF(structcompx*xin,intN){intf,m,LH,nm,i,k,j,L;doublep,ps;intle,B,ip;doublepi;structcompxw,t;LH=N/2;f=N;for(m=1;(f=f/2)!=1;m++){;}//2µÄm´Ī·½=N£¬mĪŖ¼¶Źż/*fft_difŌĖĖć*/for(L=0;L=m-1;L++)//ĆæŅ»¼¶{le=(int)pow(2.0,m-L);//¾ßÓŠĻąĶ¬Šż×ŖŅņ×ӵĵūŠĪŌĖĖćµÄ¼äøōB=le/2;//2µÄm-L-1´Ī·½£¬²»Ķ¬Šż×ŖŅņ×ÓµÄøöŹż£¬µūŠĪŌĖĖćĮ½Ö§¼äøōpi=3.141592653589793;for(j=0;j=B-1;j++){p=pow(2.0,L)*j;ps=2*pi/N*p;//Šż×ŖŅņ×Ów.real=cos(ps);w.imag=-sin(ps);for(i=j;i=N-1;i=i+le){ip=i+B;t=xin[i];xin[i].real=t.real+xin[ip].real;xin[i].imag=t.imag+xin[ip].imag;xin[ip].real=t.real-xin[ip].real;xin[ip].imag=t.imag-xin[ip].imag;xin[ip]=EE(xin[ip],w);}}}nm=N-2;j=N/2;/*±äÖ·ŌĖĖć*/for(i=1;i=nm;i++){if(ij){t=xin[j];xin[j]=xin[i];xin[i]=t;}k=LH;while(j=k){j=j-k;k=k/2;}j=j+k;}return;}voidIFFT_DIT(structcompx*xin,intN){intf,m,LH,nm,i,k,j,L;doublep,ps;intle,B,ip;doublepi;structcompxw,t;LH=N/2;f=N;for(m=1;(f=f/2)!=1;m++){;}//2µÄm´Ī·½=N£¬mĪŖ¼¶Źż/*fft_difŌĖĖć*/for(L=0;L=m-1;L++)//ĆæŅ»¼¶{le=(int)pow(2.0,m-L);//¾ßÓŠĻąĶ¬Šż×ŖŅņ×ӵĵūŠĪŌĖĖćµÄ¼äøōB=le/2;//2µÄm-L-1´Ī·½£¬²»Ķ¬Šż×ŖŅņ×ÓµÄøöŹż£¬µūŠĪŌĖĖćĮ½Ö§¼äøōpi=3.141592653589793;for(j=0;j=B-1;j++){p=pow(2.0,L)*j;ps=-2*pi/N*p;//Šż×ŖŅņ×Ów.real=cos(ps);w.imag=-sin(ps);for(i=j;i=N-1;i=i+le){ip=i+B;t=xin[i];xin[i].real=(t.real+xin[ip].real)*0.5;xin[i].imag=(t.imag+xin[ip].imag)*0.5;xin[ip].real=(t.real-xin[ip].real)*0.5;xin[ip].imag=(t.imag-xin[ip].imag)*0.5;}}}nm=N-2;j=N/2;/*±äÖ·ŌĖĖć*/for(i=1;i=nm;i++){if(ij){t=xin[j];xin[j]=xin[i];xin[i]=t;}k=LH;while(j=k){j=j-k;k=k/2;}j=j+k;}return;}voidIFFT_DIF(structcompx*xin,intN){intf,m,LH,nm,i,k,j,L;doublep,ps;intle,B,ip;doublepi;structcompxw,t;LH=N/2;f=N;for(m=1;(f=f/2)!=1;m++){;}//2µÄm´Ī·½=N£¬mĪŖ¼¶Źżnm=N-2;j=N/2;/*±äÖ·ŌĖĖć*/for(i=1;i=nm;i++){if(ij){t=xin[j];xin[j]=xin[i];xin[i]=t;}k=LH;while(j=k){j=j-k;k=k/2;}j=j+k;}/*fft_ditŌĖĖć*/for(L=0;L=m-1;L++)//ĆæŅ»¼¶{le=(int)pow(2.0,L+1);//¾ßÓŠĻąĶ¬Šż×ŖŅņ×ӵĵūŠĪŌĖĖćµÄ¼äøōB=le/2;//2µÄL´Ī·½£¬²»Ķ¬Šż×ŖŅņ×ÓµÄøöŹż£¬µūŠĪŌĖĖćĮ½Ö§¼äøōpi=3.141592653589793;for(j=0;j=B-1;j++){p=pow(2.0,m-L-1)*j;ps=-2*pi/N*p;//Šż×ŖŅņ×Ów.real=cos(ps);w.imag=-sin(ps);for(i=j;i=N-1;i=i+le){ip=i+B;t=EE(xin[ip],w);xin[ip].real=(xin[i].real-t.real)*0.5;xin[ip].imag=(xin[i].imag-t.imag)*0.5;xin[i].real=(xin[i].real+t.real)*0.5;xin[i].imag=(xin[i].imag+t.imag)*0.5;}}}return;}doubleresult[MAX];structcompxs[MAX];intNum=128;constdoublepp=3.141592653589793;intmain(){inti;charmethod;//fftandifftmethodfor(i=0;iNum;i++){s[i].real=sin(pp*i/256);s[i].imag=0;}printf(Inputthefftdecimationmethod(Tortfordit,Forffordif):);method=getchar();if(method=='T'||method=='t')FFT_DIT(s,Num);elseif(method=='F'||method=='f')FFT_DIF(s,Num);else{printf(INPUTERROR!Nosuchmethod);return0;}printf(fftresults:\n);for(i=0;iNum;i++){printf(%.4f,s[i].real);printf(+j(%.4f)\n,s[i].imag);//result[i]=sqrt(pow(s[i].real,2)+pow(s[i].imag,2));}printf(Inputtheifftdecimationmethod(Tortfordit,Forffordif):);intc;while((c=getchar())!='\n'&&c!=EOF);//method=getchar();if(method=='T'||method=='t')IFFT_DIT(s,Num);elseif(method=='F'||method=='f')IFFT_DIF(s,Num);else{printf(INPUTERROR!Nosuchmethod);return0;}printf(ifftresults:\n);for(i=0;iNum;i++){printf(%.4f,s[i].real);printf(+j(%.4f)\n,s[i].imag);//result[i]=sqrt(pow(s[i].real,2)+pow(s[i].imag,2));}return0;}
本文标题:基2-dit-dif-fft与dit-dif-ifft实现-可运行
链接地址:https://www.777doc.com/doc-4982400 .html