📄 calcphase.lst
字号:
C51 COMPILER V7.50 CALCPHASE 01/08/2008 15:08:11 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CALCPHASE
OBJECT MODULE PLACED IN CalcPhase.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CalcPhase.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1
2 #include "CalcPhase.h"
3 #include <math.h>
4
5 #define PI 3.1415926532
6
7 #define SAMPLE_NUMS 128 //采样数
8
9
10 typedef struct //定义平差系数结构
11 {
12 float S_aa;
13 float S_ab;
14 float S_bb;
15 float S_ll;
16 float S_al;
17 float S_bl;
18 }AVG_EQU_COEFF;
19
20
21 //-------------------------------平差函数--------------------------------------------------------
22 //输入:dat[]--测量数据数组 *amp-->初始振幅 *phase==初始初相角
23 //输出 *amp=平差后的振幅,*phase=平差后的初相角
24 static void AvgErr(float dat[],float *amp,float *phase)
25 {
26 1 UINT8 i,j;
27 1 float XDATA_MEM ai,bi,li,temp,dA,dF;
28 1 AVG_EQU_COEFF XDATA_MEM coeff;
29 1
30 1 j=0;
31 1 do
32 1 {
33 2 coeff.S_aa=0;
34 2 coeff.S_ab=0;
35 2 coeff.S_bb=0;
36 2 coeff.S_ll=0;
37 2 coeff.S_al=0;
38 2 coeff.S_bl=0;
39 2 for(i=0;i<SAMPLE_NUMS;i++)
40 2 {
41 3 temp=*phase+(float)PI*i*13/64;
42 3 ai=sin(temp);
43 3 bi=(*amp)*cos(temp);
44 3 li=(*amp)*ai-dat[i];
45 3
46 3 coeff.S_aa+=ai*ai;
47 3 coeff.S_ab+=ai*bi;
48 3 coeff.S_bb+=bi*bi;
49 3 coeff.S_ll+=li*li;
50 3 coeff.S_al+=ai*li;
51 3 coeff.S_bl+=bi*li;
52 3
53 3 }
54 2 temp=coeff.S_aa*coeff.S_bb-coeff.S_ab*coeff.S_ab;
55 2 dA=(coeff.S_ab*coeff.S_bl-coeff.S_bb*coeff.S_al)/temp;
C51 COMPILER V7.50 CALCPHASE 01/08/2008 15:08:11 PAGE 2
56 2 dF=(coeff.S_ab*coeff.S_al-coeff.S_aa*coeff.S_bl)/temp;
57 2 (*amp)+=dA;
58 2 (*phase)+=dF;
59 2 j++;
60 2 }while((fabs(dF)>0.00125)&&(j<4));
61 1
62 1
63 1 }
64
65 //--------------------------------------根据测量数据计算初相位角函数-----------------------------
66 //dat---测量数据数组,长度128,(13个周期,等间隔采样128个数据)
67 //返回细分值(单位:等分数)
68 INT16 GetPhaseFromMeasDat(INT16 dat[])
69 {
70 1 UINT8 i;
71 1 float fi,A;
72 1 float XDATA_MEM dat_avg[SAMPLE_NUMS];
73 1 float base=0;
74 1
75 1 for(i=0;i<SAMPLE_NUMS;i++)base+=dat[i]; //求基准电平
76 1 base/=SAMPLE_NUMS;
77 1
78 1 for(i=0;i<SAMPLE_NUMS;i++)dat_avg[i]=(float)dat[i]-base; //求正弦值
79 1
80 1 fi=atan2(dat_avg[0],dat_avg[32]); //解算初始振幅及初相角
81 1
82 1 A=sqrt((float)dat_avg[0]*dat_avg[0]+dat_avg[32]*dat_avg[32]);
83 1
84 1 AvgErr(dat_avg,&A,&fi); //平差
85 1
86 1 while(fi<0) //转换到正值
87 1 {
88 2 fi+=2*PI;
89 2 }
90 1 return fi*1250/PI+0.5; //转换为细分值
91 1
92 1 }
93
94
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1503 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 560
PDATA SIZE = ---- ----
DATA SIZE = ---- 27
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -