📄 fft.lst
字号:
C51 COMPILER V8.05a FFT 09/02/2007 01:20:12 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE FFT
OBJECT MODULE PLACED IN FFT.OBJ
COMPILER INVOKED BY: C:\Keil\MCU\C51\BIN\C51.EXE FFT.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include "stdio.h"
3 #include <math.h> //调用源(头)文件
4 struct compx /*定义一个复数结构*/
5 {float real;float imag;
6 };
7 struct compx s[ 257 ]; //FFT输入输出均从是s[1]开始存入
8 struct compx EE(struct compx,struct compx); //定义复数相乘结构
9 void FFT(struct compx xin,int N); /*定义FFT函数*/
10
11 struct compx EE(struct compx a1,struct compx b2) //两复数相乘的程序
12 {struct compx b3; //b3保存两复数间的结果
13 1 b3.real=a1.real*b2.real-a1.imag*b2.imag; //两复数间的运算
14 1 b3.imag=a1.real*b2.imag+a1.imag*b2.real;
15 1 return(b3); /*返回结果*/
16 1 }
17 //-------------------------------------------
18 void FFT(struct compx xin,int N) /*FFT函数体*/
19 {int f,m,nv2,nm1,i,k,j=1,l; /*定义变量*/
20 1 struct compx v,w,t; /*定义结构变量*/
21 1 nv2=N/2; /*最高位值的权值*/
22 1 f=N; /*f为中间变量*/
23 1 for(m=1;(f=f/2)!=1;m++){;} /*求级数m*/
24 1 nm1=N-1; /*nm1为数组长度*/
25 1 for(i=1;i<=nm1;i++) /*倒序*/
26 1 {if(i<j) {t=xin[ j ];xin[j]=xin[ i ];xin[ i ] =t;} /*i<j则换位*/
*** ERROR C216 IN LINE 26 OF FFT.C: subscript on non-array or too many dimensions
27 2 k=nv2; /*k为倒序中相应位置的权值*/
28 2 while(k<j) {j=j-k;k=k/2;} /*k<j时最高为变为0*/
29 2 j=j+k; /* j为数组中的位数,是一个十进制数*/
30 2 }
31 1 {int le,lei,ip; //变量初始化,le为序列长度
32 2 float pi;
33 2 for(l=1;l<=m;l++) /*l控制级数*/
34 2 {le=pow(2,l); /*le等于2的l次方*/
35 3 lei=le/2; /*蝶形两节点间的距离*/
36 3 pi=3.14159265;
37 3 v.real=1.0; // 此次的v运于复数的初始化 v.imag=0.0;
38 3 w.real=cos(pi/lei); /*旋转因子*/
39 3 w.imag=-sin(pi/lei);
40 3 for(j=1;j<=lei;j++) //外循环控制蝶行运算的级数
41 3 {for(i=j;i<=N;i=i+le) //内循环控制每级间的运算次数
42 4 {ip=i+lei; /*蝶形运算的下一个节点*/
43 5 t=EE(xin[ ip ],v); /*第一个旋转因子*/
44 5 xin[ ip ].real=xin[ i ].real-t.real; /*蝶形计算*/
45 5 xin[ ip ].imag=xin[ i ].imag-t.imag;
46 5 xin[ i ].real=xin[ i ].real+t.real;
47 5 xin[ i ].imag=xin[ i ].imag+t.imag;
48 5 }
49 4 v=EE(v,w); //调用EE复数相乘程序,结果给下次的循环
50 4 }
51 3
52 3 }
53 2 }
54 1 }
C51 COMPILER V8.05a FFT 09/02/2007 01:20:12 PAGE 2
55 main() /*定义主函数*/
56 {int N,i; //变量初始化,N为总点数,i为每点数
57 1 printf("shu ru N de ge shu N="); /*提示输入*/
58 1 scanf("%d",&N); /*输入N*/
59 1 for(i=1;i<=N;i++) /*输入*/
60 1 {printf("di %d ge shu real=",i);
61 2 getchar();
62 2 scanf("%f",&s[ i ].real);
63 2 getchar();
64 2 printf("\n");
65 2 printf("di %d ge shu imag=",i);
66 2 scanf("%f",&s[ i ].imag);
67 2 printf("\n");
68 2 }
69 1
70 1 FFT(s,N); /*调用FFt*/
71 1 for(i=1;i<=N;i++) /*输出*/
72 1 {printf("%f",s[ i ].real);
73 2 printf(" + ");
74 2 printf("%f",s[ i ].imag);
75 2 printf("j");
76 2 printf("\n");
77 2 }
78 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -