51单片机fft算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include "stdio.h"
#include
struct compx /*定義一個複數結構*/
{float real;float imag;
};
struct compx s[ 256 ]; //FFT輸入輸出均從是s[1]開始存入
struct compx EE(struct compx,struct compx); //定義複數相乘結構
void FFT(struct compx xin,int N); /*定義FFT函數*/
struct compx EE(struct compx a1,struct compx b2) //兩複數相乘的程序
{struct compx b3; //b3保存兩複數間的結果
b3.real=a1.real*b2.real-a1.imag*b2.imag; //兩複數間的運算
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3); /*返回結果*/
}
void FFT(struct compx xin,int N) /*FFT函數體*/
{int f,m,nv2,nm1,i,k,j=1,l; /*定義變量*/
struct compx v,w,t; /*定義結構變量*/
nv2=N/2; /*最高位值的權值*/
f=N; /*f為中間變量*/
for(m=1;(f=f/2)!=1;m++){;} /*求級數m*/
nm1=N-1; /*nm1為數組長度*/
for(i=1;i<=nm1;i++) /*倒序*/
{if(i
while(k
}
{int le,lei,ip; //變量初始化,le為序列長度
float pi;
for(l=1;l<=m;l++) /*l控制級數*/
{le=pow(2,l); /*le等於2的l次方*/
lei=le/2; /*蝶形兩節點間的距離*/
pi=3.14159265;
v.real=1.0; // 此次的v運於複數的初始化 v.imag=0.0;
w.real=cos(pi/lei); /*旋轉因子*/
w.imag=-sin(pi/lei);
for(j=1;j<=lei;j++) //外循環控制蝶行運算的級數
{for(i=j;i<=N;i=i+le) //內循環控制每級間的運算次數
{ip=i+lei; /*蝶形運算的下一個節點*/
t=EE(xin[ ip ],v); /*第一個旋轉因子*/
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;
}
v=EE(v,w); //調用EE複數相乘程序,結果給下次的循環
}
}
}
}
main() /*定義主函數*/
{int N,i; //變量初始化,N為總點數,i為每點數
printf("shu ru N de ge shu N="); /*提示輸入*/
scanf("%d",&N); /*輸入N*/
for(i=1;i<=N;i++) /*輸入*/
{printf("di %d ge shu real=",i);
getchar();
scanf("%f",&s[ i ].real);
getchar();
printf("\n");
printf("di %d ge shu imag=",i);
scanf("%f",&s[ i ].imag);
printf("\n");
}
FFT(s,N); /*調用FFt*/
for(i=1;i<=N;i++) /*輸出*/
{printf("%f",s[ i ].real);
printf(" + ");
printf("%f",s[ i ].imag);
prin
tf("j");
printf("\n");
}
}