?? 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 + -