⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.c

📁 基4的FFT算法程序
💻 C
字号:
#include<stdio.h>
#include<math.h>
#define PI 3.141592653
void fft(x,y,l,f)
double *x,*y,f;
int l;
{
    int i,i0,i1,i2,i3,j,l1,n,ns,n1,n2,n3;
	int arg,arg1,arg2,arg3,*m;
	double s1,c1,s2,c2,s3,c3,sc1,sc2,sc3;
	double x0,y0,x1,y1,x2,y2,x3,y3,t;
	n=1;
	while(l!=0){n*=4;l--;}      /*n=4^l*/
	n1=ns=n/4;n2=2*n1;n3=3*n1;
	sc1=2.0*PI/(double)n;
	sc2=2.0*sc1;
	sc3=3.0*sc1;
	                /*work area for bit operation*/
	if((m=(int*)calioc(n,2))==NULL)
	{
	  printf("\n Out of memory error !!!\n");exit(0);
	}
	while(ns>=1)                /*main loop*/
	{
	    for(l1=0;l1<n;l1+=(4*ns))
		{
		   arg=m[l1]/4;arg1=arg+n1;
		   arg2=arg+n2;
		   arg3=arg+n3;
		   c1=cos(sc1*(double)arg);s1=sin(f*sc1*(double)arg);
		   c2=cos(sc2*(double)arg);s2=sin(f*sc2*(double)arg);
		   c3=cos(sc3*(double)arg);s3=sin(f*sc3*(double)arg);
		   for(i0=l1;i0<l1+ns;++i0)
		   {
		      i1=i0+ns;i2=i1+ns;i3=i2+ns;
			  x0=x[i0];y0=y[i0];
			  x1=x[i1]*c1-y[i1]*s1;
			  y1=y[i1]*c1+x[i1]*s1;
			  x2=x[i1]*c2-y[i1]*s2;
			  y2=y[i1]*c2+x[i1]*s2;
			  x3=x[i1]*c3-y[i1]*s3;
			  y3=y[i1]*c3+x[i1]*s3;
			  x[i0]=x0+x1+x2+x3;
			  y[i0]=y0+y1+y2+y3;
			  x[i2]=x0-x1+x2-x3;
			  y[i2]=y0-y1+y2-y3;
			  if(f<0.0)
			  {
			     x[i1]=x0+y1-x2-y3;
				 y[i1]=y0-x1-y2+x3;
				 x[i3]=x0-y1-x2+y3;
				 y[i3]=y0+x1-y2-x3;
			   }
			   else
			   { 
			     x[i1]=x0-y1-x2+y3;
				 y[i1]=y0+x1-y2-x3;
				 x[i3]=x0+y1-x2-y3;
				 y[i3]=y0-x1-y2+x3;
				}
				m[i0]=arg;m[i1]=arg1;
				m[i2]=arg2;m[i3]=arg3;
			}
		}
		ns/=4;
	}
	if(f<0.0)           /*judge fft or ifft */
	{
	   for(i=0;i<n;++i)
	   { 
	     x[i]/=(double)n;
		 y[i]/=(double)n;
	    }
	}
	for(i=0;i<n;++i)     /*bit reverse operation*/
	{
	   if((j=m[i])>i)
	   {
	     t=x[i];x[i]=x[j];x[j]=t;
		 t=y[i];y[i]=y[j];y[j]=t;
		}
	}
	free(m);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -