#include <reg51.h>
#include "stdio.h"
#include <math.h> //調用源()文件
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.al*b2.imag+a1.al;
return(b3); /*返回結果*/
}
void FFT(struct compx xin,int N) /*FFT函數體*/
{int f,m,nv2,nm1,i,k,j=1,l; /*定義變量*/
单片机printf函数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<j) {t=xin[j];xin[j]=xin;xin=t;} /*i<j則換位*/
k=nv2; /*k為倒序中相應位置的權值*/
while(k<j) {j=j-k;k=k/2;} /*k<j時最高為變為0*/
j=j+k; /* j為數組中的位數,是一個十進制數*/
}
{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;
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 ].al; /*蝶形計算*/
xin[ ip ].imag=xin[ i ].imag-t.imag;
xin[ i ].real=xin[ i ].al;
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");
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论