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

📄 fft1.cpp

📁 fft变换
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
#define N 32
#define PI 3.1415926

struct compx{
	double real;
	double imag;
};

struct compx addcom(struct compx v1,struct compx v2)
{
	struct compx v3;
	v3.real=v1.real+v2.real;
	v3.imag=v1.imag+v2.imag;
	return(v3);
}

struct compx minuscom(struct compx v1,struct compx v2)  //定义复数相减
{
	struct compx v3;
	v3.real=v1.real-v2.real;
	v3.imag=v1.imag-v2.imag;
	return(v3);
}

struct compx EE(struct compx v1,struct compx v2)
{
	struct compx v3;
	v3.real=v1.real*v2.real-v1.imag*v2.imag;
	v3.imag=v1.real*v2.imag+v1.imag*v2.real;
	return(v3);
}

struct compx FF(struct compx v,int n) //定义复数的n次方
{
	struct compx v1;
	int i;
	v1.real=1.0;v1.imag=0.0;
	for(i=1;i<=n;i++)
		v1=EE(v1,v);
	return(v1);
}


/*下面进行fft运算按时间抽取,先做旋转因子后做蝶形图*/
void FFT(struct compx xin[])
{
	int i,j,l,k,m,f;
	double p,ps;
	int le,lei,ip;
	struct compx w,t,tmp;
	
	f=N;
	for(m=1;(f=f/2)!=1;m++) {;}  //计算出共m级蝶形图,避免了对数运算
	
	for(l=0;l<m;l++)
	{
		le=(int)pow(2,m-l);
		lei=le/2;
		for(j=0;j<=lei-1;j++)
		{
			p=pow(2,l)*j;
			ps=2*PI/N*p;
			w.real=cos(ps);w.imag=-sin(ps);  //w即为旋转因子
			for(i=j;i<N;i=i+le)
			{
				ip=i+lei;
				t=xin[i];
				xin[i]=addcom(xin[i],xin[ip]);
				xin[ip]=minuscom(t,xin[ip]);
				xin[ip]=EE(xin[ip],w);
			}	
		}
	}


	j=N/2;
	for(i=1;i<N-1;i++)
	{
		if(i<j) {tmp=xin[i];xin[i]=xin[j];xin[j]=tmp;}
		k=N/2;
		while(j>=k) {j=j-k;k=k/2;}
		j=j+k;
	}
}







int main()
{
	int i,j;
	struct compx q,x[N];
	void FFT(struct compx x[]);
	q.real=0.9;q.imag=0.3;
	for(i=0;i<N;i++)
	{
		x[i]=FF(q,i);
		printf("x[%d] is %13.7f+j%13.7f\n",i,x[i].real,x[i].imag);
	}
	FFT(x);
	for(i=0;i<N;i++)
		printf("y[%d] is %13.7f+j%13.7f\n",i,x[i].real,x[i].imag);
	return 0;
}

⌨️ 快捷键说明

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